From dd7595a3475407a7fa96a97393bae8c5220e8762 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Wed, 4 Jan 2012 18:41:13 +1000 Subject: Add the base Enlightenment Foundation Libraries - eina, eet, evas, ecore, embryo, and edje. Note that embryo wont be used, but I'm not sure yet if you can build edje without it. --- libraries/evas/src/lib/engines/common/Makefile.am | 118 + libraries/evas/src/lib/engines/common/Makefile.in | 1005 +++++++ libraries/evas/src/lib/engines/common/evas_blend.h | 8 + .../evas/src/lib/engines/common/evas_blend_main.c | 325 +++ .../src/lib/engines/common/evas_blend_private.h | 31 + .../evas/src/lib/engines/common/evas_blit_main.c | 700 +++++ .../src/lib/engines/common/evas_convert_color.c | 246 ++ .../src/lib/engines/common/evas_convert_color.h | 16 + .../lib/engines/common/evas_convert_colorspace.c | 186 ++ .../lib/engines/common/evas_convert_colorspace.h | 12 + .../src/lib/engines/common/evas_convert_gry_1.c | 6 + .../src/lib/engines/common/evas_convert_gry_1.h | 9 + .../src/lib/engines/common/evas_convert_gry_4.c | 10 + .../src/lib/engines/common/evas_convert_gry_4.h | 9 + .../src/lib/engines/common/evas_convert_gry_8.c | 78 + .../src/lib/engines/common/evas_convert_gry_8.h | 12 + .../src/lib/engines/common/evas_convert_grypal_6.c | 23 + .../src/lib/engines/common/evas_convert_grypal_6.h | 6 + .../src/lib/engines/common/evas_convert_main.c | 632 ++++ .../src/lib/engines/common/evas_convert_main.h | 9 + .../src/lib/engines/common/evas_convert_rgb_16.c | 2089 +++++++++++++ .../src/lib/engines/common/evas_convert_rgb_16.h | 50 + .../src/lib/engines/common/evas_convert_rgb_24.c | 89 + .../src/lib/engines/common/evas_convert_rgb_24.h | 10 + .../src/lib/engines/common/evas_convert_rgb_32.c | 460 +++ .../src/lib/engines/common/evas_convert_rgb_32.h | 24 + .../src/lib/engines/common/evas_convert_rgb_8.c | 248 ++ .../src/lib/engines/common/evas_convert_rgb_8.h | 14 + .../evas/src/lib/engines/common/evas_convert_yuv.c | 1258 ++++++++ .../evas/src/lib/engines/common/evas_convert_yuv.h | 9 + libraries/evas/src/lib/engines/common/evas_cpu.c | 270 ++ libraries/evas/src/lib/engines/common/evas_draw.h | 36 + .../evas/src/lib/engines/common/evas_draw_main.c | 576 ++++ libraries/evas/src/lib/engines/common/evas_font.h | 76 + .../lib/engines/common/evas_font_default_walk.x | 144 + .../evas/src/lib/engines/common/evas_font_draw.c | 615 ++++ .../evas/src/lib/engines/common/evas_font_load.c | 929 ++++++ .../evas/src/lib/engines/common/evas_font_main.c | 547 ++++ .../evas/src/lib/engines/common/evas_font_ot.c | 336 +++ .../evas/src/lib/engines/common/evas_font_ot.h | 45 + .../src/lib/engines/common/evas_font_private.h | 52 + .../evas/src/lib/engines/common/evas_font_query.c | 789 +++++ libraries/evas/src/lib/engines/common/evas_image.h | 63 + .../evas/src/lib/engines/common/evas_image_data.c | 147 + .../evas/src/lib/engines/common/evas_image_load.c | 381 +++ .../evas/src/lib/engines/common/evas_image_main.c | 818 ++++++ .../src/lib/engines/common/evas_image_private.h | 17 + .../evas/src/lib/engines/common/evas_image_save.c | 51 + .../src/lib/engines/common/evas_image_scalecache.c | 846 ++++++ libraries/evas/src/lib/engines/common/evas_line.h | 11 + .../evas/src/lib/engines/common/evas_line_main.c | 678 +++++ .../evas/src/lib/engines/common/evas_map_image.c | 432 +++ .../evas/src/lib/engines/common/evas_map_image.h | 10 + .../src/lib/engines/common/evas_map_image_core.c | 226 ++ .../lib/engines/common/evas_map_image_internal.c | 117 + .../src/lib/engines/common/evas_map_image_loop.c | 116 + .../src/lib/engines/common/evas_op_add/Makefile.am | 13 + .../src/lib/engines/common/evas_op_add/Makefile.in | 543 ++++ .../lib/engines/common/evas_op_add/op_add_color_.c | 33 + .../engines/common/evas_op_add/op_add_color_i386.c | 33 + .../common/evas_op_add/op_add_mask_color_.c | 33 + .../common/evas_op_add/op_add_mask_color_i386.c | 33 + .../lib/engines/common/evas_op_add/op_add_pixel_.c | 33 + .../common/evas_op_add/op_add_pixel_color_.c | 33 + .../common/evas_op_add/op_add_pixel_color_i386.c | 29 + .../engines/common/evas_op_add/op_add_pixel_i386.c | 33 + .../common/evas_op_add/op_add_pixel_mask_.c | 37 + .../common/evas_op_add/op_add_pixel_mask_i386.c | 33 + .../src/lib/engines/common/evas_op_add_main_.c | 541 ++++ .../lib/engines/common/evas_op_blend/Makefile.am | 50 + .../lib/engines/common/evas_op_blend/Makefile.in | 720 +++++ .../engines/common/evas_op_blend/op_blend_color_.c | 109 + .../common/evas_op_blend/op_blend_color_i386.c | 138 + .../common/evas_op_blend/op_blend_color_neon.c | 223 ++ .../common/evas_op_blend/op_blend_color_sse3.c | 166 ++ .../common/evas_op_blend/op_blend_mask_color_.c | 185 ++ .../evas_op_blend/op_blend_mask_color_i386.c | 251 ++ .../evas_op_blend/op_blend_mask_color_neon.c | 562 ++++ .../evas_op_blend/op_blend_mask_color_sse3.c | 320 ++ .../common/evas_op_blend/op_blend_master_sse3.c | 77 + .../engines/common/evas_op_blend/op_blend_pixel_.c | 162 + .../common/evas_op_blend/op_blend_pixel_color_.c | 284 ++ .../evas_op_blend/op_blend_pixel_color_i386.c | 221 ++ .../evas_op_blend/op_blend_pixel_color_neon.c | 570 ++++ .../evas_op_blend/op_blend_pixel_color_sse3.c | 543 ++++ .../common/evas_op_blend/op_blend_pixel_i386.c | 217 ++ .../common/evas_op_blend/op_blend_pixel_mask_.c | 189 ++ .../evas_op_blend/op_blend_pixel_mask_i386.c | 157 + .../evas_op_blend/op_blend_pixel_mask_neon.c | 129 + .../evas_op_blend/op_blend_pixel_mask_sse3.c | 300 ++ .../common/evas_op_blend/op_blend_pixel_neon.c | 530 ++++ .../common/evas_op_blend/op_blend_pixel_sse3.c | 316 ++ .../src/lib/engines/common/evas_op_blend_main_.c | 671 +++++ .../lib/engines/common/evas_op_copy/Makefile.am | 18 + .../lib/engines/common/evas_op_copy/Makefile.in | 548 ++++ .../engines/common/evas_op_copy/op_copy_color_.c | 138 + .../common/evas_op_copy/op_copy_color_i386.c | 150 + .../common/evas_op_copy/op_copy_color_neon.c | 212 ++ .../common/evas_op_copy/op_copy_mask_color_.c | 170 ++ .../common/evas_op_copy/op_copy_mask_color_i386.c | 193 ++ .../common/evas_op_copy/op_copy_mask_color_neon.c | 170 ++ .../engines/common/evas_op_copy/op_copy_pixel_.c | 117 + .../common/evas_op_copy/op_copy_pixel_color_.c | 236 ++ .../common/evas_op_copy/op_copy_pixel_color_i386.c | 255 ++ .../common/evas_op_copy/op_copy_pixel_color_neon.c | 238 ++ .../common/evas_op_copy/op_copy_pixel_i386.c | 131 + .../common/evas_op_copy/op_copy_pixel_mask_.c | 150 + .../common/evas_op_copy/op_copy_pixel_mask_i386.c | 176 ++ .../common/evas_op_copy/op_copy_pixel_mask_neon.c | 151 + .../common/evas_op_copy/op_copy_pixel_neon.c | 158 + .../src/lib/engines/common/evas_op_copy_main_.c | 675 +++++ .../lib/engines/common/evas_op_mask/Makefile.am | 13 + .../lib/engines/common/evas_op_mask/Makefile.in | 543 ++++ .../engines/common/evas_op_mask/op_mask_color_.c | 49 + .../common/evas_op_mask/op_mask_color_i386.c | 58 + .../common/evas_op_mask/op_mask_mask_color_.c | 63 + .../common/evas_op_mask/op_mask_mask_color_i386.c | 13 + .../engines/common/evas_op_mask/op_mask_pixel_.c | 48 + .../common/evas_op_mask/op_mask_pixel_color_.c | 100 + .../common/evas_op_mask/op_mask_pixel_color_i386.c | 13 + .../common/evas_op_mask/op_mask_pixel_i386.c | 58 + .../common/evas_op_mask/op_mask_pixel_mask_.c | 62 + .../common/evas_op_mask/op_mask_pixel_mask_i386.c | 13 + .../src/lib/engines/common/evas_op_mask_main_.c | 309 ++ .../src/lib/engines/common/evas_op_mul/Makefile.am | 13 + .../src/lib/engines/common/evas_op_mul/Makefile.in | 543 ++++ .../lib/engines/common/evas_op_mul/op_mul_color_.c | 65 + .../engines/common/evas_op_mul/op_mul_color_i386.c | 66 + .../common/evas_op_mul/op_mul_mask_color_.c | 72 + .../common/evas_op_mul/op_mul_mask_color_i386.c | 92 + .../lib/engines/common/evas_op_mul/op_mul_pixel_.c | 56 + .../common/evas_op_mul/op_mul_pixel_color_.c | 122 + .../common/evas_op_mul/op_mul_pixel_color_i386.c | 120 + .../engines/common/evas_op_mul/op_mul_pixel_i386.c | 66 + .../common/evas_op_mul/op_mul_pixel_mask_.c | 117 + .../common/evas_op_mul/op_mul_pixel_mask_i386.c | 63 + .../src/lib/engines/common/evas_op_mul_main_.c | 308 ++ .../src/lib/engines/common/evas_op_sub/Makefile.am | 14 + .../src/lib/engines/common/evas_op_sub/Makefile.in | 543 ++++ .../lib/engines/common/evas_op_sub/op_sub_color_.c | 33 + .../engines/common/evas_op_sub/op_sub_color_i386.c | 33 + .../common/evas_op_sub/op_sub_mask_color_.c | 33 + .../common/evas_op_sub/op_sub_mask_color_i386.c | 33 + .../lib/engines/common/evas_op_sub/op_sub_pixel_.c | 33 + .../common/evas_op_sub/op_sub_pixel_color_.c | 33 + .../common/evas_op_sub/op_sub_pixel_color_i386.c | 29 + .../engines/common/evas_op_sub/op_sub_pixel_i386.c | 33 + .../common/evas_op_sub/op_sub_pixel_mask_.c | 37 + .../common/evas_op_sub/op_sub_pixel_mask_i386.c | 33 + .../src/lib/engines/common/evas_op_sub_main_.c | 542 ++++ libraries/evas/src/lib/engines/common/evas_pipe.c | 1733 +++++++++++ libraries/evas/src/lib/engines/common/evas_pipe.h | 111 + .../evas/src/lib/engines/common/evas_polygon.h | 13 + .../src/lib/engines/common/evas_polygon_main.c | 293 ++ .../evas/src/lib/engines/common/evas_rectangle.h | 11 + .../src/lib/engines/common/evas_rectangle_main.c | 73 + .../evas/src/lib/engines/common/evas_regionbuf.c | 357 +++ .../evas/src/lib/engines/common/evas_scale_main.c | 6 + .../evas/src/lib/engines/common/evas_scale_main.h | 13 + .../src/lib/engines/common/evas_scale_sample.c | 398 +++ .../src/lib/engines/common/evas_scale_smooth.c | 532 ++++ .../src/lib/engines/common/evas_scale_smooth.h | 19 + .../lib/engines/common/evas_scale_smooth_scaler.c | 211 ++ .../engines/common/evas_scale_smooth_scaler_down.c | 43 + .../common/evas_scale_smooth_scaler_downx.c | 259 ++ .../common/evas_scale_smooth_scaler_downx_downy.c | 387 +++ .../common/evas_scale_smooth_scaler_downy.c | 260 ++ .../common/evas_scale_smooth_scaler_noscale.c | 62 + .../engines/common/evas_scale_smooth_scaler_up.c | 266 ++ .../evas/src/lib/engines/common/evas_scale_span.c | 653 +++++ .../evas/src/lib/engines/common/evas_scale_span.h | 14 + .../evas/src/lib/engines/common/evas_text_utils.c | 472 +++ .../evas/src/lib/engines/common/evas_text_utils.h | 89 + libraries/evas/src/lib/engines/common/evas_tiler.c | 1391 +++++++++ .../lib/engines/common/language/evas_bidi_utils.c | 641 ++++ .../lib/engines/common/language/evas_bidi_utils.h | 157 + .../engines/common/language/evas_language_utils.c | 146 + .../engines/common/language/evas_language_utils.h | 132 + .../engines/common/language/evas_script_table.h | 3087 ++++++++++++++++++++ 179 files changed, 44726 insertions(+) create mode 100644 libraries/evas/src/lib/engines/common/Makefile.am create mode 100644 libraries/evas/src/lib/engines/common/Makefile.in create mode 100644 libraries/evas/src/lib/engines/common/evas_blend.h create mode 100644 libraries/evas/src/lib/engines/common/evas_blend_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_blend_private.h create mode 100644 libraries/evas/src/lib/engines/common/evas_blit_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_color.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_color.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_colorspace.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_colorspace.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_gry_1.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_gry_1.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_gry_4.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_gry_4.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_gry_8.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_gry_8.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_grypal_6.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_grypal_6.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_main.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_16.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_16.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_24.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_24.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_32.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_32.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_8.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_rgb_8.h create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_yuv.c create mode 100644 libraries/evas/src/lib/engines/common/evas_convert_yuv.h create mode 100644 libraries/evas/src/lib/engines/common/evas_cpu.c create mode 100644 libraries/evas/src/lib/engines/common/evas_draw.h create mode 100644 libraries/evas/src/lib/engines/common/evas_draw_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_font.h create mode 100644 libraries/evas/src/lib/engines/common/evas_font_default_walk.x create mode 100644 libraries/evas/src/lib/engines/common/evas_font_draw.c create mode 100644 libraries/evas/src/lib/engines/common/evas_font_load.c create mode 100644 libraries/evas/src/lib/engines/common/evas_font_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_font_ot.c create mode 100644 libraries/evas/src/lib/engines/common/evas_font_ot.h create mode 100644 libraries/evas/src/lib/engines/common/evas_font_private.h create mode 100644 libraries/evas/src/lib/engines/common/evas_font_query.c create mode 100644 libraries/evas/src/lib/engines/common/evas_image.h create mode 100644 libraries/evas/src/lib/engines/common/evas_image_data.c create mode 100644 libraries/evas/src/lib/engines/common/evas_image_load.c create mode 100644 libraries/evas/src/lib/engines/common/evas_image_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_image_private.h create mode 100644 libraries/evas/src/lib/engines/common/evas_image_save.c create mode 100644 libraries/evas/src/lib/engines/common/evas_image_scalecache.c create mode 100644 libraries/evas/src/lib/engines/common/evas_line.h create mode 100644 libraries/evas/src/lib/engines/common/evas_line_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_map_image.c create mode 100644 libraries/evas/src/lib/engines/common/evas_map_image.h create mode 100644 libraries/evas/src/lib/engines/common/evas_map_image_core.c create mode 100644 libraries/evas/src/lib/engines/common/evas_map_image_internal.c create mode 100644 libraries/evas/src/lib/engines/common/evas_map_image_loop.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/Makefile.am create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/Makefile.in create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_add_main_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.am create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.in create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_sse3.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_sse3.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_master_sse3.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_sse3.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_sse3.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_sse3.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_blend_main_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.am create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.in create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_copy_main_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.am create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.in create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mask_main_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.am create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.in create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_mul_main_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.am create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.in create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c create mode 100644 libraries/evas/src/lib/engines/common/evas_op_sub_main_.c create mode 100644 libraries/evas/src/lib/engines/common/evas_pipe.c create mode 100644 libraries/evas/src/lib/engines/common/evas_pipe.h create mode 100644 libraries/evas/src/lib/engines/common/evas_polygon.h create mode 100644 libraries/evas/src/lib/engines/common/evas_polygon_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_rectangle.h create mode 100644 libraries/evas/src/lib/engines/common/evas_rectangle_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_regionbuf.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_main.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_main.h create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_sample.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth.h create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_down.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downy.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_up.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_span.c create mode 100644 libraries/evas/src/lib/engines/common/evas_scale_span.h create mode 100644 libraries/evas/src/lib/engines/common/evas_text_utils.c create mode 100644 libraries/evas/src/lib/engines/common/evas_text_utils.h create mode 100644 libraries/evas/src/lib/engines/common/evas_tiler.c create mode 100644 libraries/evas/src/lib/engines/common/language/evas_bidi_utils.c create mode 100644 libraries/evas/src/lib/engines/common/language/evas_bidi_utils.h create mode 100644 libraries/evas/src/lib/engines/common/language/evas_language_utils.c create mode 100644 libraries/evas/src/lib/engines/common/language/evas_language_utils.h create mode 100644 libraries/evas/src/lib/engines/common/language/evas_script_table.h (limited to 'libraries/evas/src/lib/engines/common') diff --git a/libraries/evas/src/lib/engines/common/Makefile.am b/libraries/evas/src/lib/engines/common/Makefile.am new file mode 100644 index 0000000..9c9918d --- /dev/null +++ b/libraries/evas/src/lib/engines/common/Makefile.am @@ -0,0 +1,118 @@ + +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/cserve \ + -I$(top_srcdir)/src/lib/include \ + -DPACKAGE_BIN_DIR=\"$(bindir)\" \ + -DPACKAGE_LIB_DIR=\"$(libdir)\" \ + -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + @FREETYPE_CFLAGS@ @VALGRIND_CFLAGS@ \ + @PIXMAN_CFLAGS@ \ + @EET_CFLAGS@ @pthread_cflags@ \ + @WIN32_CFLAGS@ @EINA_CFLAGS@ \ + @FRIBIDI_CFLAGS@ @HARFBUZZ_CFLAGS@ \ + @PIXMAN_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_grypal_6.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_image_load.c \ +evas_image_save.c \ +evas_image_main.c \ +evas_image_data.c \ +evas_image_scalecache.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 \ +language/evas_bidi_utils.c \ +language/evas_language_utils.c \ +evas_text_utils.c \ +evas_font_ot.c \ +evas_map_image.c \ +evas_map_image.h + +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_grypal_6.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_font_default_walk.x \ +evas_font_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 \ +language/evas_bidi_utils.h \ +language/evas_language_utils.h \ +language/evas_script_table.h \ +evas_text_utils.h \ +evas_font_ot.h \ +evas_map_image_internal.c \ +evas_map_image_core.c \ +evas_map_image_loop.c + +libevas_engine_common_la_DEPENDENCIES = \ +$(top_builddir)/config.h + +libevas_engine_common_la_LIBADD = \ +evas_op_blend/libevas_engine_common_op_blend_master_sse3.la diff --git a/libraries/evas/src/lib/engines/common/Makefile.in b/libraries/evas/src/lib/engines/common/Makefile.in new file mode 100644 index 0000000..b0162df --- /dev/null +++ b/libraries/evas/src/lib/engines/common/Makefile.in @@ -0,0 +1,1005 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/engines/common +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +am_libevas_engine_common_la_OBJECTS = evas_op_copy_main_.lo \ + evas_op_blend_main_.lo evas_op_add_main_.lo \ + evas_op_sub_main_.lo evas_op_mask_main_.lo \ + evas_op_mul_main_.lo evas_blend_main.lo evas_blit_main.lo \ + evas_convert_color.lo evas_convert_colorspace.lo \ + evas_convert_gry_1.lo evas_convert_gry_4.lo \ + evas_convert_gry_8.lo evas_convert_main.lo \ + evas_convert_rgb_16.lo evas_convert_rgb_24.lo \ + evas_convert_rgb_32.lo evas_convert_rgb_8.lo \ + evas_convert_grypal_6.lo evas_convert_yuv.lo evas_cpu.lo \ + evas_draw_main.lo evas_font_draw.lo evas_font_load.lo \ + evas_font_main.lo evas_font_query.lo evas_image_load.lo \ + evas_image_save.lo evas_image_main.lo evas_image_data.lo \ + evas_image_scalecache.lo evas_line_main.lo \ + evas_polygon_main.lo evas_rectangle_main.lo evas_scale_main.lo \ + evas_scale_sample.lo evas_scale_smooth.lo evas_scale_span.lo \ + evas_tiler.lo evas_regionbuf.lo evas_pipe.lo \ + evas_bidi_utils.lo evas_language_utils.lo evas_text_utils.lo \ + evas_font_ot.lo evas_map_image.lo +libevas_engine_common_la_OBJECTS = \ + $(am_libevas_engine_common_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libevas_engine_common_la_SOURCES) +DIST_SOURCES = $(libevas_engine_common_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +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/cserve \ + -I$(top_srcdir)/src/lib/include \ + -DPACKAGE_BIN_DIR=\"$(bindir)\" \ + -DPACKAGE_LIB_DIR=\"$(libdir)\" \ + -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ + @FREETYPE_CFLAGS@ @VALGRIND_CFLAGS@ \ + @PIXMAN_CFLAGS@ \ + @EET_CFLAGS@ @pthread_cflags@ \ + @WIN32_CFLAGS@ @EINA_CFLAGS@ \ + @FRIBIDI_CFLAGS@ @HARFBUZZ_CFLAGS@ \ + @PIXMAN_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_grypal_6.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_image_load.c \ +evas_image_save.c \ +evas_image_main.c \ +evas_image_data.c \ +evas_image_scalecache.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 \ +language/evas_bidi_utils.c \ +language/evas_language_utils.c \ +evas_text_utils.c \ +evas_font_ot.c \ +evas_map_image.c \ +evas_map_image.h + +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_grypal_6.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_font_default_walk.x \ +evas_font_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 \ +language/evas_bidi_utils.h \ +language/evas_language_utils.h \ +language/evas_script_table.h \ +evas_text_utils.h \ +evas_font_ot.h \ +evas_map_image_internal.c \ +evas_map_image_core.c \ +evas_map_image_loop.c + +libevas_engine_common_la_DEPENDENCIES = \ +$(top_builddir)/config.h + +libevas_engine_common_la_LIBADD = \ +evas_op_blend/libevas_engine_common_op_blend_master_sse3.la + +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/engines/common/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libevas_engine_common.la: $(libevas_engine_common_la_OBJECTS) $(libevas_engine_common_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libevas_engine_common_la_OBJECTS) $(libevas_engine_common_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_bidi_utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_blend_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_blit_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_color.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_colorspace.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_gry_1.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_gry_4.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_gry_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_grypal_6.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_rgb_16.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_rgb_24.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_rgb_32.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_rgb_8.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_convert_yuv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_cpu.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_draw_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_font_draw.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_font_load.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_font_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_font_ot.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_font_query.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_image_data.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_image_load.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_image_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_image_save.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_image_scalecache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_language_utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_line_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_map_image.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_op_add_main_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_op_blend_main_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_op_copy_main_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_op_mask_main_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_op_mul_main_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_op_sub_main_.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_pipe.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_polygon_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_rectangle_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_regionbuf.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_scale_main.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_scale_sample.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_scale_smooth.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_scale_span.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_text_utils.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evas_tiler.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +evas_bidi_utils.lo: language/evas_bidi_utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT evas_bidi_utils.lo -MD -MP -MF $(DEPDIR)/evas_bidi_utils.Tpo -c -o evas_bidi_utils.lo `test -f 'language/evas_bidi_utils.c' || echo '$(srcdir)/'`language/evas_bidi_utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/evas_bidi_utils.Tpo $(DEPDIR)/evas_bidi_utils.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='language/evas_bidi_utils.c' object='evas_bidi_utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o evas_bidi_utils.lo `test -f 'language/evas_bidi_utils.c' || echo '$(srcdir)/'`language/evas_bidi_utils.c + +evas_language_utils.lo: language/evas_language_utils.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT evas_language_utils.lo -MD -MP -MF $(DEPDIR)/evas_language_utils.Tpo -c -o evas_language_utils.lo `test -f 'language/evas_language_utils.c' || echo '$(srcdir)/'`language/evas_language_utils.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/evas_language_utils.Tpo $(DEPDIR)/evas_language_utils.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='language/evas_language_utils.c' object='evas_language_utils.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o evas_language_utils.lo `test -f 'language/evas_language_utils.c' || echo '$(srcdir)/'`language/evas_language_utils.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-recursive + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES ctags ctags-recursive distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/engines/common/evas_blend.h b/libraries/evas/src/lib/engines/common/evas_blend.h new file mode 100644 index 0000000..1a98f3f --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_blend.h @@ -0,0 +1,8 @@ +#ifndef _EVAS_BLEND_H +#define _EVAS_BLEND_H + + +EAPI void evas_common_blend_init (void); + + +#endif /* _EVAS_BLEND_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_blend_main.c b/libraries/evas/src/lib/engines/common/evas_blend_main.c new file mode 100644 index 0000000..4aadd02 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_blend_main.c @@ -0,0 +1,325 @@ +#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 __UNUSED__, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d __UNUSED__, int l __UNUSED__) +{ +} + +static void +_composite_pt_nothing(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d __UNUSED__) +{ +} + +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/libraries/evas/src/lib/engines/common/evas_blend_private.h b/libraries/evas/src/lib/engines/common/evas_blend_private.h new file mode 100644 index 0000000..1d14951 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_blend_private.h @@ -0,0 +1,31 @@ +#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/libraries/evas/src/lib/engines/common/evas_blit_main.c b/libraries/evas/src/lib/engines/common/evas_blit_main.c new file mode 100644 index 0000000..4c077b3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_blit_main.c @@ -0,0 +1,700 @@ +#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); + +#ifdef BUILD_NEON +static void evas_common_copy_pixels_neon (DATA32 *src, DATA32 *dst, int len); +static void evas_common_copy_pixels_rev_neon (DATA32 *src, DATA32 *dst, int len); +#endif + +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 > (int)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 > (int)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 > (int)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 > (int)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_NEON +static void +evas_common_copy_pixels_rev_neon(DATA32 *src, DATA32 *dst, int len) +{ + uint32_t *tmp = (void *)37; +#define AP "evas_common_copy_rev_pixels_neon_" + asm volatile ( + ".fpu neon \n\t" + // Can we do 32 byte? + "andS %[tmp], %[d], $0x1f \n\t" + "beq "AP"quadstart \n\t" + + // Can we do at least 16 byte? + "andS %[tmp], %[d], $0x4 \n\t" + "beq "AP"dualstart \n\t" + + // Only once + AP"singleloop: \n\t" + "sub %[s], #4 \n\t" + "vld1.32 d0[0], [%[s]] \n\t" + "vst1.32 d0[0], [%[d]]! \n\t" + + // Up to 3 times + AP"dualstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #31 \n\t" + "blt "AP"loopout \n\t" + + "andS %[tmp], %[d], $0x1f \n\t" + "beq "AP"quadstart \n\t" + + AP"dualloop: \n\t" + "sub %[s], #8 \n\t" + "vldm %[s], {d0} \n\t" + "vrev64.32 d1, d0 \n\t" + "vstm %[d]!, {d1} \n\t" + + "andS %[tmp], %[d], $0x1f \n\t" + "bne "AP"dualloop \n\t" + + + AP"quadstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + "sub %[tmp],%[e],#32 \n\t" + + AP "quadloop: \n\t" + "sub %[s], #32 \n\t" + "vldm %[s], {d0,d1,d2,d3} \n\t" + + "vrev64.32 d7,d0 \n\t" + "vrev64.32 d6,d1 \n\t" + "vrev64.32 d5,d2 \n\t" + "vrev64.32 d4,d3 \n\t" + + "vstm %[d]!, {d4,d5,d6,d7} \n\t" + + "cmp %[tmp], %[d] \n\t" + "bhi "AP"quadloop \n\t" + + + AP "loopout: \n\t" + "cmp %[d], %[e] \n\t" + "beq "AP"done \n\t" + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],$0x04 \n\t" + "beq "AP"singleloop2 \n\t" + + AP "dualloop2: \n\t" + "sub %[tmp],%[e],$0x7 \n\t" + AP "dualloop2int: \n\t" + "sub %[s], #8 \n\t" + "vldm %[s], {d0} \n\t" + "vrev64.32 d1,d0 \n\t" + "vstm %[d]!, {d1} \n\t" + + "cmp %[tmp], %[d] \n\t" + "bhi "AP"dualloop2int \n\t" + + // Single ?? + "cmp %[e], %[d] \n\t" + "beq "AP"done \n\t" + + AP "singleloop2: \n\t" + "sub %[s], #4 \n\t" + "vld1.32 d0[0], [%[s]] \n\t" + "vst1.32 d0[0], [%[d]] \n\t" + + AP "done:\n\t" + + : // No output regs + // Input + : [s] "r" (src + len), [e] "r" (dst + len), [d] "r" (dst),[tmp] "r" (tmp) + // Clobbered + : "q0","q1","q2","q3","0","1","memory" + ); +#undef AP + +} +#endif + + +#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) +{ // XXX cppcheck: [./src/lib/engines/common/evas_blit_main.c:248]: (error) Invalid number of character ({). Can't process file. + // so... wtf? what's wrong with this { ? or anytrhing surrounding it? + 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_NEON +static void +evas_common_copy_pixels_neon(DATA32 *src, DATA32 *dst, int len){ + uint32_t *e,*tmp = (void *)37; + e = dst + len; +#define AP "evas_common_copy_pixels_neon_" + asm volatile ( + ".fpu neon \n\t" + // Can we do 32 byte? + "andS %[tmp], %[d], $0x1f \n\t" + "beq "AP"quadstart \n\t" + + // Can we do at least 16 byte? + "andS %[tmp], %[d], $0x4 \n\t" + "beq "AP"dualstart \n\t" + + // Only once + AP"singleloop: \n\t" + "vld1.32 d0[0], [%[s]]! \n\t" + "vst1.32 d0[0], [%[d]]! \n\t" + + // Up to 3 times + AP"dualstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #31 \n\t" + "blt "AP"loopout \n\t" + + "andS %[tmp], %[d], $0x1f \n\t" + "beq "AP"quadstart \n\t" + + AP"dualloop: \n\t" + "vldm %[s]!, {d0} \n\t" + "vstm %[d]!, {d0} \n\t" + + "andS %[tmp], %[d], $0x1f \n\t" + "bne "AP"dualloop \n\t" + + + AP"quadstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #64 \n\t" + "blt "AP"loopout \n\t" + + "sub %[tmp],%[e],#63 \n\t" + + AP "quadloop: \n\t" + "vldm %[s]!, {d0,d1,d2,d3} \n\t" + "vldm %[s]!, {d4,d5,d6,d7} \n\t" + "vstm %[d]!, {d0,d1,d2,d3} \n\t" + "vstm %[d]!, {d4,d5,d6,d7} \n\t" + + "cmp %[tmp], %[d] \n\t" + "bhi "AP"quadloop \n\t" + + + AP "loopout: \n\t" + "cmp %[d], %[e] \n\t" + "beq "AP"done \n\t" + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],$0x04 \n\t" + "beq "AP"singleloop2 \n\t" + + AP "dualloop2: \n\t" + "sub %[tmp],%[e],$0x7 \n\t" + AP "dualloop2int: \n\t" + "vldm %[s]!, {d0} \n\t" + "vstm %[d]!, {d0} \n\t" + + "cmp %[tmp], %[d] \n\t" + "bhi "AP"dualloop2int \n\t" + + // Single ?? + "cmp %[e], %[d] \n\t" + "beq "AP"done \n\t" + + AP "singleloop2: \n\t" + "vld1.32 d0[0], [%[s]] \n\t" + "vst1.32 d0[0], [%[d]] \n\t" + + AP "done:\n\t" + + : // No output regs + // Input + : [s] "r" (src), [e] "r" (e), [d] "r" (dst),[tmp] "r" (tmp) + // Clobbered + : "q0","q1","q2","q3","memory" + ); +#undef AP + +} +#endif /* BUILD_NEON */ + +#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_NEON +# if defined(BUILD_SSE) || defined(BUILD_MMX) + else +# endif + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + return evas_common_copy_pixels_rev_neon; +#endif + +#ifdef BUILD_C +# if defined(BUILD_MMX) || defined(BUILD_NEON) + 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_NEON +# ifdef BUILD_C + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) +# endif + return evas_common_copy_pixels_neon; +# ifdef BUILD_SSE + 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 +} diff --git a/libraries/evas/src/lib/engines/common/evas_convert_color.c b/libraries/evas/src/lib/engines/common/evas_convert_color.c new file mode 100644 index 0000000..70a9e90 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_color.c @@ -0,0 +1,246 @@ +#include "evas_common.h" +#include "evas_convert_color.h" + + +EAPI DATA32 +evas_common_convert_argb_premul(DATA32 *data, unsigned int len) +{ + DATA32 *de = data + len; + DATA32 nas = 0; + + while (data < de) + { + DATA32 a = 1 + (*data >> 24); + + *data = (*data & 0xff000000) + + (((((*data) >> 8) & 0xff) * a) & 0xff00) + + (((((*data) & 0x00ff00ff) * a) >> 8) & 0x00ff00ff); + data++; + + if ((a == 1) || (a == 256)) + nas++; + } + + return nas; +} + +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 || !d) + { + 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/libraries/evas/src/lib/engines/common/evas_convert_color.h b/libraries/evas/src/lib/engines/common/evas_convert_color.h new file mode 100644 index 0000000..0224879 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_color.h @@ -0,0 +1,16 @@ +#ifndef _EVAS_CONVERT_COLOR_H +#define _EVAS_CONVERT_COLOR_H + + +EAPI DATA32 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/libraries/evas/src/lib/engines/common/evas_convert_colorspace.c b/libraries/evas/src/lib/engines/common/evas_convert_colorspace.c new file mode 100644 index 0000000..013c2e7 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_colorspace.c @@ -0,0 +1,186 @@ +#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)) + +#define CONVERT_ARGB_8888_TO_A_8(s) ((s) >> 24) + + +static inline void * +evas_common_convert_argb8888_to_rgb565_a5p(void *data __UNUSED__, int w __UNUSED__, int h __UNUSED__, int stride __UNUSED__, Eina_Bool has_alpha __UNUSED__) +{ + return NULL; +} + +static inline void * +evas_common_convert_rgb565_a5p_to_argb8888(void *data, int w, int h, int stride, Eina_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 = (DATA8 *)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; +} + +static inline void * +evas_common_convert_argb8888_to_a8(void *data, int w, int h, int stride, Eina_Bool has_alpha) +{ + uint32_t *src, *end; + uint8_t *ret, *dst; + + src = data; + end = src + (stride * h); + ret = malloc(w * h); + if (!ret) return NULL; + + if (!has_alpha) + { + return memset(ret, 0xff, w * h); + } + + dst = ret; + for ( ; src < end ; src++, dst++) + *dst = CONVERT_ARGB_8888_TO_A_8(*src); + return ret; +} + + + +EAPI void * +evas_common_convert_argb8888_to(void *data, int w, int h, int stride, Eina_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, Eina_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; +} + +EAPI void * +evas_common_convert_yuv_422_601_to(void *data, int w, int h, Evas_Colorspace cspace) +{ + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + { + void *dst; + + fprintf(stderr, "to argb888\n"); + + dst = malloc(sizeof (unsigned int) * w * h); + if (!dst) return NULL; + + evas_common_convert_yuv_422_601_rgba(data, dst, w, h); + return dst; + } + default: + break; + } + return NULL; +} + +EAPI void * +evas_common_convert_yuv_422P_601_to(void *data, int w, int h, Evas_Colorspace cspace) +{ + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + { + void *dst; + + dst = malloc(sizeof (unsigned int) * w * h); + if (!dst) return NULL; + + evas_common_convert_yuv_420p_601_rgba(data, dst, w, h); + break; + } + default: + break; + } + return NULL; +} + +EAPI void * +evas_common_convert_yuv_420_601_to(void *data, int w, int h, Evas_Colorspace cspace) +{ + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + { + void *dst; + + dst = malloc(sizeof (unsigned int) * w * h); + if (!dst) return NULL; + + evas_common_convert_yuv_420_601_rgba(data, dst, w, h); + break; + } + default: + break; + } + return NULL; +} + +EAPI void * +evas_common_convert_yuv_420T_601_to(void *data, int w, int h, Evas_Colorspace cspace) +{ + switch (cspace) + { + case EVAS_COLORSPACE_ARGB8888: + { + void *dst; + + dst = malloc(sizeof (unsigned int) * w * h); + if (!dst) return NULL; + + evas_common_convert_yuv_420_601_rgba(data, dst, w, h); + break; + } + default: + break; + } + return NULL; +} + + +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ diff --git a/libraries/evas/src/lib/engines/common/evas_convert_colorspace.h b/libraries/evas/src/lib/engines/common/evas_convert_colorspace.h new file mode 100644 index 0000000..f3bec78 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_colorspace.h @@ -0,0 +1,12 @@ +#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, Eina_Bool has_alpha, Evas_Colorspace cspace); +EAPI void *evas_common_convert_rgb565_a5p_to (void *data, int w, int h, int stride, Eina_Bool has_alpha, Evas_Colorspace cspace); +EAPI void *evas_common_convert_yuv_422P_601_to(void *data, int w, int h, Evas_Colorspace cspace); +EAPI void *evas_common_convert_yuv_422_601_to (void *data, int w, int h, Evas_Colorspace cspace); +EAPI void *evas_common_convert_yuv_420_601_to (void *data, int w, int h, Evas_Colorspace cspace); +EAPI void *evas_common_convert_yuv_420T_601_to(void *data, int w, int h, Evas_Colorspace cspace); + +#endif /* _EVAS_CONVERT_COLORSPACE_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_convert_gry_1.c b/libraries/evas/src/lib/engines/common/evas_convert_gry_1.c new file mode 100644 index 0000000..45e16ee --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_gry_1.c @@ -0,0 +1,6 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_gry_1.h b/libraries/evas/src/lib/engines/common/evas_convert_gry_1.h new file mode 100644 index 0000000..38d6776 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_gry_1.h @@ -0,0 +1,9 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_gry_4.c b/libraries/evas/src/lib/engines/common/evas_convert_gry_4.c new file mode 100644 index 0000000..2fa7ee3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_gry_4.c @@ -0,0 +1,10 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_gry_4.h b/libraries/evas/src/lib/engines/common/evas_convert_gry_4.h new file mode 100644 index 0000000..1614359 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_gry_4.h @@ -0,0 +1,9 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_gry_8.c b/libraries/evas/src/lib/engines/common/evas_convert_gry_8.c new file mode 100644 index 0000000..9bc5ca7 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_gry_8.c @@ -0,0 +1,78 @@ +#include "evas_common.h" +#include "evas_convert_gry_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_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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA32 gry8; + + dst_ptr = (DATA8 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + r = (R_VAL(src_ptr)); + g = (G_VAL(src_ptr)); + b = (B_VAL(src_ptr)); + + // Y = 0.299 * R + 0.587 * G + 0.114 * B; + gry8 = ((r * 19595) + (g * 38469) + (b * 7471)) >> 16; + + *dst_ptr = gry8; + + CONVERT_LOOP_END_ROT_0(); +} +#endif + +#ifdef BUILD_CONVERT_8_GRY_4 +void evas_common_convert_rgba_to_8bpp_gry_64_dith (DATA32 *src __UNUSED__, DATA8 *dst __UNUSED__, int src_jump __UNUSED__, int dst_jump __UNUSED__, int w __UNUSED__, int h __UNUSED__, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__){} +#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 __UNUSED__) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 r, g, b; + DATA32 gry8; + 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(4); + + r = (R_VAL(src_ptr)); + g = (G_VAL(src_ptr)); + b = (B_VAL(src_ptr)); + + // Y = 0.299 * R + 0.587 * G + 0.114 * B; + gry8 = ((r * 19595) + (g * 38469) + (b * 7471)) >> 16; + + if (((gry8 - gry8 * 255 / 4) >= dith) && (gry8 < 0x07)) gry8++; + + *dst_ptr = gry8; + + CONVERT_LOOP_END_ROT_0(); +} +#endif + +#ifdef BUILD_CONVERT_8_GRY_64 +void evas_common_convert_rgba_to_8bpp_gry_4_dith (DATA32 *src __UNUSED__, DATA8 *dst __UNUSED__, int src_jump __UNUSED__, int dst_jump __UNUSED__, int w __UNUSED__, int h __UNUSED__, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__){} +#endif + +#ifdef BUILD_CONVERT_8_GRY_256 +void evas_common_convert_rgba_to_8bpp_gry_1_dith (DATA32 *src __UNUSED__, DATA8 *dst __UNUSED__, int src_jump __UNUSED__, int dst_jump __UNUSED__, int w __UNUSED__, int h __UNUSED__, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__){} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_convert_gry_8.h b/libraries/evas/src/lib/engines/common/evas_convert_gry_8.h new file mode 100644 index 0000000..d70f59d --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_gry_8.h @@ -0,0 +1,12 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_grypal_6.c b/libraries/evas/src/lib/engines/common/evas_convert_grypal_6.c new file mode 100644 index 0000000..2351fda --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_grypal_6.c @@ -0,0 +1,23 @@ +#include "evas_common.h" +#include "evas_convert_grypal_6.h" + +#ifdef BUILD_CONVERT_8_GRAYSCALE_64 +void evas_common_convert_rgba_to_8bpp_pal_gray64(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr; + int x, y; + DATA8 Y; + + dst_ptr = dst; + CONVERT_LOOP_START_ROT_0(); + + /* RGB -> YUV conversion */ + Y = ((R_VAL(src_ptr) * 76) + + (G_VAL(src_ptr) * 151) + + (B_VAL(src_ptr) * 29)) >> 10; + *dst_ptr = pal[Y]; + + CONVERT_LOOP_END_ROT_0(); +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_convert_grypal_6.h b/libraries/evas/src/lib/engines/common/evas_convert_grypal_6.h new file mode 100644 index 0000000..5f839c2 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_grypal_6.h @@ -0,0 +1,6 @@ +#ifndef _EVAS_CONVERT_GRY_4_H +#define _EVAS_CONVERT_GRY_4_H + +void evas_common_convert_rgba_to_8bpp_pal_gray64 (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/libraries/evas/src/lib/engines/common/evas_convert_main.c b/libraries/evas/src/lib/engines/common/evas_convert_main.c new file mode 100644 index 0000000..da19f9c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_main.c @@ -0,0 +1,632 @@ +#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_grypal_6.h" +#include "evas_convert_gry_8.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 /* USE_DITHER_128128 */ + +EAPI void +evas_common_convert_init(void) +{ +} + +EAPI Gfx_Func_Convert +evas_common_convert_func_get(DATA8 *dest, int w, int h __UNUSED__, 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_GRY_1 + if (pal_mode == PAL_MODE_NONE) + return evas_common_convert_rgba_to_8bpp_gry_256_dith; +#endif +#ifdef BUILD_CONVERT_8_GRY_16 + if (pal_mode == PAL_MODE_NONE) + return evas_common_convert_rgba_to_8bpp_gry_16_dith; +#endif +#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 +#ifdef BUILD_CONVERT_8_GRAYSCALE_64 + if (pal_mode == PAL_MODE_GRAY64) + return evas_common_convert_rgba_to_8bpp_pal_gray64; +#endif + } + } + 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 +#ifdef BUILD_CONVERT_32_RGB_666 + if ((rmask == 0x0003f000) && (gmask == 0x00000fc0) && (bmask == 0x0000003f)) + { +#ifdef BUILD_CONVERT_32_RGB_ROT0 + if (rotation == 0) + return evas_common_convert_rgba_to_32bpp_rgb_666; +#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 + } + 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_RGB_666 + if ((rmask == 0x0003f000) && (gmask == 0x00000fc0) && (bmask == 0x0000003f)) + { + if (rotation == 0) + return evas_common_convert_rgba_to_24bpp_rgb_666; + } +#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 + } + INF("depth = %i mode = %i", 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 + } + } + /* no optimised converter for this... no generic one either. NULL */ + return NULL; +} diff --git a/libraries/evas/src/lib/engines/common/evas_convert_main.h b/libraries/evas/src/lib/engines/common/evas_convert_main.h new file mode 100644 index 0000000..51c2cc8 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_main.h @@ -0,0 +1,9 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_rgb_16.c b/libraries/evas/src/lib/engines/common/evas_convert_rgb_16.c new file mode 100644 index 0000000..b30ec1e --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_16.c @@ -0,0 +1,2089 @@ +#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) +{ +#ifndef BUILD_NO_DITHER_MASK + DATA16 *d = (DATA16 *)dst; + DATA32 r1, g1, b1; + DATA32 r2, g2, b2; + unsigned int dith, dith2; + int x, y; + +#ifdef BUILD_LINE_DITHER_MASK + for (y = 0; y < h; y++) + { + if ((y + dith_y) & 0x1) + { + for (x = 0; x < w; x+=2) + { + DATA32 p = *src++, q = *src++; + r1 = ((p & 0xff0000) + 0x030000) >> 19; + if (r1 > 0x1f) r1 = 0x1f; + g1 = ((p & 0xff00) + 0x000100) >> 10; + if (g1 > 0x3f) g1 = 0x3f; + b1 = ((p & 0xff) + 0x000003) >> 3; + if (b1 > 0x1f) b1 = 0x1f; + r2 = ((q & 0xff0000) + 0x030000) >> 19; + if (r2 > 0x1f) r2 = 0x1f; + g2 = ((q & 0xff00) + 0x000100) >> 10; + if (g2 > 0x3f) g2 = 0x3f; + b2 = ((q & 0xff) + 0x000003) >> 3; + if (b2 > 0x1f) b2 = 0x1f; +#ifndef WORDS_BIGENDIAN + *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) | + (r1 << 11) | (g1 << 5) | (b1); +#else + *((DATA32 *)d) = (r1 << 27) | (g1 << 21) | (b1 << 16) | + (r2 << 11) | (g2 << 5) | (b2); +#endif + d += 2; + } + } + else + { + x = w; + while (w > 0) + { + DATA32 p = *src++, q = *src++; + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)d) = + (((q & 0xff0000) >> 19) << 27) | (((q & 0xff00) >> 10) << 21) | (((q & 0xff) >> 3) << 16) | + (((p & 0xff0000) >> 19) << 11) | (((p & 0xff00) >> 10) << 5) | ((p & 0xff) >> 3); +#else + *((DATA32 *)d) = + (((p & 0xff0000) >> 19) << 27) | (((p & 0xff00) >> 10) << 21) | (((p & 0xff) >> 3) << 16) | + (((q & 0xff0000) >> 19) << 11) | (((q & 0xff00) >> 10) << 5) | ((q & 0xff) >> 3); +#endif + d += 2; w -= 2; + } + w = x; + } + src += src_jump; + d += dst_jump; + } +#else + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + DATA32 p = *src++, q = *src++; + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK]; + dith2 = dith >> DM_SHF(6); + dith >>= DM_SHF(5); + r1 = (p & 0xff0000) >> 19; + g1 = (p & 0xff00) >> 10; + b1 = (p & 0xff) >> 3; + if ((r1 < 0x1f) && ((((p & 0xff0000) >> 16) - (r1 << 3)) >= dith )) r1++; + if ((g1 < 0x3f) && ((((p & 0xff00) >> 8) - (g1 << 2)) >= dith2)) g1++; + if ((b1 < 0x1f) && (((p & 0xff) - (b1 << 3)) >= dith )) b1++; + + x++; + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK]; + dith2 = dith >> DM_SHF(6); + dith >>= DM_SHF(5); + r2 = (q & 0xff0000) >> 19; + g2 = (q & 0xff00) >> 10; + b2 = (q & 0xff) >> 3; + if ((r2 < 0x1f) && ((((q & 0xff0000) >> 16) - (r2 << 3)) >= dith )) r2++; + if ((g2 < 0x3f) && ((((q & 0xff00) >> 8) - (g2 << 2)) >= dith2)) g2++; + if ((b2 < 0x1f) && (((q & 0xff) - (b2 << 3)) >= dith )) b2++; + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) | + (r1 << 11) | (g1 << 5) | (b1); +#else + *((DATA32 *)d) = (r1 << 27) | (g1 << 21) | (b1 << 16) | + (r2 << 11) | (g2 << 5) | (b2); +#endif + d += 2; + } + src += src_jump; + d += dst_jump; + } +#endif + return; + pal = 0; +#else + DATA16 *d = (DATA16 *)dst; + int w0 = w; + + while (h--) + { + while (w > 0) + { + DATA32 p = *src++, q = *src++; + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)d) = + (((q & 0xff0000) >> 19) << 27) | (((q & 0xff00) >> 10) << 21) | (((q & 0xff) >> 3) << 16) | + (((p & 0xff0000) >> 19) << 11) | (((p & 0xff00) >> 10) << 5) | ((p & 0xff) >> 3); +#else + *((DATA32 *)d) = + (((p & 0xff0000) >> 19) << 27) | (((p & 0xff00) >> 10) << 21) | (((p & 0xff) >> 3) << 16) | + (((q & 0xff0000) >> 19) << 11) | (((q & 0xff00) >> 10) << 5) | ((q & 0xff) >> 3); +#endif + d += 2; w -= 2; + } + w = w0; + src += src_jump; + d += dst_jump; + } + return; + pal = 0; +#endif +} +#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) +{ +#ifndef BUILD_NO_DITHER_MASK + DATA16 *d = (DATA16 *)dst; + DATA32 r, g, b; + unsigned int dith, dith2; + int x, y; + +#ifdef BUILD_LINE_DITHER_MASK + for (y = 0; y < h; y++) + { + if ((y + dith_y) & 0x1) + { + for (x = 0; x < w; x++) + { + DATA32 p = *src++; + + r = (p & 0xff0000) >> 19; + if (r > 0x1f) r = 0x1f; + g = (p & 0xff00) >> 10; + if (g > 0x3f) g = 0x3f; + b = (p & 0xff) >> 3; + if (b > 0x1f) b = 0x1f; + *d++ = (r << 11) | (g << 5) | b; + } + } + else + { + x = w; + while (w--) + { + *d++ = (((*src & 0xff0000) >> 19) << 11) | (((*src & 0xff00) >> 10) << 5) | ((*src & 0xff) >> 3); + src++; + } + w = x; + } + src += src_jump; + d += dst_jump; + } +#else + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + DATA32 p = *src++; + + dith = DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK]; + dith2 = dith >> DM_SHF(6); + dith >>= DM_SHF(5); + r = (p & 0xff0000) >> 19; + g = (p & 0xff00) >> 10; + b = (p & 0xff) >> 3; + if ((r < 0x1f) && ((((p & 0xff0000) >> 16) - (r << 3)) >= dith )) r++; + if ((g < 0x3f) && ((((p & 0xff00) >> 8) - (g << 2)) >= dith2)) g++; + if ((b < 0x1f) && (((p & 0xff) - (b << 3)) >= dith )) b++; + + *d++ = (r << 11) | (g << 5) | b; + } + src += src_jump; + d += dst_jump; + } +#endif + return; + pal = 0; +#else + DATA16 *d = (DATA16 *)dst; + int w0 = w; + + while (h--) + { + while (w--) + { + *d++ = (((*src & 0xff0000) >> 19) << 11) | (((*src & 0xff00) >> 10) << 5) | ((*src & 0xff) >> 3); + src++; + } + w = w0; + src += src_jump; + d += dst_jump; + } + return; + pal = 0; +#endif +} +#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; + + ERR("evas_common_convert_rgba_to_16bpp_bgr_565_dith_rot_180"); + + 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/libraries/evas/src/lib/engines/common/evas_convert_rgb_16.h b/libraries/evas/src/lib/engines/common/evas_convert_rgb_16.h new file mode 100644 index 0000000..f7ae63c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_16.h @@ -0,0 +1,50 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_rgb_24.c b/libraries/evas/src/lib/engines/common/evas_convert_rgb_24.c new file mode 100644 index 0000000..9efa006 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_24.c @@ -0,0 +1,89 @@ +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#endif +#ifdef BUILD_CONVERT_24_RGB_666 +void +evas_common_convert_rgba_to_24bpp_rgb_666(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + DATA32 *src_ptr; + DATA8 *dst_ptr, *scratch_ptr; + DATA32 scratch; + int x, y; + + dst_ptr = (DATA8 *)dst; + src_ptr = (DATA32 *)src; + + scratch_ptr = (DATA8 *)(&scratch); + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + scratch = + (((R_VAL(src_ptr) << 12) | (B_VAL(src_ptr) >> 2)) & 0x03f03f) | + ((G_VAL(src_ptr) << 4) & 0x000fc0); + dst_ptr[0] = scratch_ptr[1]; + dst_ptr[1] = scratch_ptr[2]; + dst_ptr[2] = scratch_ptr[3]; + src_ptr++; + dst_ptr+=3; + } + src_ptr += src_jump; + dst_ptr += (dst_jump * 3); + } + return; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_convert_rgb_24.h b/libraries/evas/src/lib/engines/common/evas_convert_rgb_24.h new file mode 100644 index 0000000..bc114ca --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_24.h @@ -0,0 +1,10 @@ +#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); + +void evas_common_convert_rgba_to_24bpp_rgb_666 (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/libraries/evas/src/lib/engines/common/evas_convert_rgb_32.c b/libraries/evas/src/lib/engines/common/evas_convert_rgb_32.c new file mode 100644 index 0000000..41dac6f --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_32.c @@ -0,0 +1,460 @@ +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ +#ifndef BUILD_NEON + 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(); +#else + if ((w & 1) || (h & 1)) + { + /* Rarely (if ever) if ever: so slow path is fine */ + 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(); + } else { +#define AP "convert_rgba32_rot_90_" + asm volatile ( + ".fpu neon \n\t" + " mov %[s1], %[src] \n\t" + " add %[s1], %[h],lsl #2 \n\t" + " sub %[s1], #8 \n\t" + + " mov %[s2], %[src] \n\t" + " add %[s2], %[h], lsl #3 \n\t" + " add %[s2], %[sjmp], lsr #1 \n\t" + " sub %[s2], #8 \n\t" + + " mov %[d1], %[dst] \n\t" + + " add %[d2], %[d1], %[djmp] \n\t" + " add %[d2], %[w], lsl #2 \n\t" + + " mov %[sadv], %[h], lsl #3 \n\t" + " add %[sadv], %[sjmp], lsl #1 \n\t" + + " mov %[y], #0 \n\t" + " mov %[x], #0 \n\t" + AP"loop: \n\t" + " vld1.u32 d0, [%[s1]] \n\t" + " vld1.u32 d1, [%[s2]] \n\t" + " add %[x], #2 \n\t" + " add %[s1], %[sadv] \n\t" + " add %[s2], %[sadv] \n\t" + " vtrn.u32 d0, d1 \n\t" + " cmp %[x], %[w] \n\t" + " vst1.u32 d1, [%[d1]]! \n\t" + " vst1.u32 d0, [%[d2]]! \n\t" + " blt "AP"loop \n\t" + + " mov %[x], #0 \n\t" + " add %[d1], %[djmp] \n\t" + " add %[d1], %[w], lsl #2 \n\t" + " add %[d2], %[djmp] \n\t" + " add %[d2], %[w], lsl #2 \n\t" + + " mov %[s1], %[src] \n\t" + " add %[s1], %[h], lsl #2 \n\t" + " sub %[s1], %[y], lsl #2 \n\t" + " sub %[s1], #16 \n\t" + + " add %[s2], %[s1], %[h], lsl #2 \n\t" + " add %[s2], %[sjmp], lsl #2 \n\t" + + " add %[y], #2 \n\t" + + " cmp %[y], %[h] \n\t" + " blt "AP"loop \n\t" + + : // Out + : [s1] "r" (1), + [s2] "r" (11), + [d1] "r" (2), + [d2] "r" (12), + [src] "r" (src), + [dst] "r" (dst), + [x] "r" (3), + [y] "r" (4), + [w] "r" (w), + [h] "r" (h), + [sadv] "r" (5), + [sjmp] "r" (src_jump * 4), + [djmp] "r" (dst_jump * 4 * 2) + : "d0", "d1", "memory", "cc"// Clober + + + ); + } +#undef AP +#endif + return; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#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 __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + 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; +} +#endif +#endif + +#ifdef BUILD_CONVERT_32_RGB_666 +#ifdef BUILD_CONVERT_32_RGB_ROT0 +void +evas_common_convert_rgba_to_32bpp_rgb_666(DATA32 *src, DATA8 *dst, int src_jump, int dst_jump, int w, int h, int dith_x __UNUSED__, int dith_y __UNUSED__, DATA8 *pal __UNUSED__) +{ + DATA32 *src_ptr; + DATA32 *dst_ptr; + int x, y; + + dst_ptr = (DATA32 *)dst; + + CONVERT_LOOP_START_ROT_0(); + + *dst_ptr = + (((R_VAL(src_ptr) << 12) | (B_VAL(src_ptr) >> 2)) & 0x03f03f) | + ((G_VAL(src_ptr) << 4) & 0x000fc0); + + CONVERT_LOOP_END_ROT_0(); + return; +} +#endif +#endif + diff --git a/libraries/evas/src/lib/engines/common/evas_convert_rgb_32.h b/libraries/evas/src/lib/engines/common/evas_convert_rgb_32.h new file mode 100644 index 0000000..75595c7 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_32.h @@ -0,0 +1,24 @@ +#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); + +void evas_common_convert_rgba_to_32bpp_rgb_666 (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/libraries/evas/src/lib/engines/common/evas_convert_rgb_8.c b/libraries/evas/src/lib/engines/common/evas_convert_rgb_8.c new file mode 100644 index 0000000..f69f398 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_8.c @@ -0,0 +1,248 @@ +#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_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 3); + dith2 = DM_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 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_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 3); + dith2 = DM_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 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_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 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_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 2); + dith2 = DM_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 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_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 2); + dith2 = DM_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 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_SHR(DM_TABLE[(x + dith_x) & DM_MSK][(y + dith_y) & DM_MSK], 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/libraries/evas/src/lib/engines/common/evas_convert_rgb_8.h b/libraries/evas/src/lib/engines/common/evas_convert_rgb_8.h new file mode 100644 index 0000000..edb3a89 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_rgb_8.h @@ -0,0 +1,14 @@ +#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/libraries/evas/src/lib/engines/common/evas_convert_yuv.c b/libraries/evas/src/lib/engines/common/evas_convert_yuv.c new file mode 100644 index 0000000..a0d155c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_yuv.c @@ -0,0 +1,1258 @@ +#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); +#ifdef BUILD_ALTIVEC +static void _evas_yv12torgb_altivec(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); +#endif +static void _evas_yv12torgb_raster (unsigned char **yuv, unsigned char *rgb, int w, int h); +static void _evas_yuy2torgb_raster (unsigned char **yuv, unsigned char *rgb, int w, int h); +static void _evas_nv12torgb_raster (unsigned char **yuv, unsigned char *rgb, int w, int h); +static void _evas_nv12tiledtorgb_raster(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); + +static int initted = 0; + +#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 + 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 doesn't 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; + + y = RZ(YMUL) * ((*yp1++) - 16); + r = LUT_CLIP((y + (_crv * v)) >> RES); + g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES); + b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES); + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b); + + dp1 += 4; + + y = RZ(YMUL) * ((*yp1++) - 16); + r = LUT_CLIP((y + (_crv * v)) >> RES); + g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES); + b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES); + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,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; + + y = RZ(YMUL) * ((*yp1++) - 16); + r = LUT_CLIP((y + (_crv * v)) >> RES); + g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES); + b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES); + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b); + + dp1 += 4; + + y = RZ(YMUL) * ((*yp1++) - 16); + r = LUT_CLIP((y + (_crv * v)) >> RES); + g = LUT_CLIP((y - (_cgu * u) - (_cgv * v) + RZ(OFF)) >> RES); + b = LUT_CLIP((y + (_cbu * u) + RZ(OFF)) >> RES); + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b); + + dp1 += 4; + } + } + } + emms(); +#else + _evas_yv12torgb_raster(yuv, rgb, w, h); +#endif +} + +#ifdef BUILD_ALTIVEC +static void +_evas_yv12torgb_altivec(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#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 dependency 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-dependent 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 dependency 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-dependent 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); + } +#else + _evas_yv12torgb_diz(yuv, rgb, w, h); +#endif +} +#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 +} + +#ifdef BUILD_ALTIVEC +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 = CGV; /* 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 which shared u & v */ + /* yuv to rgb */ + y = YMUL * ((*yp1++) - 16); + r = LUT_CLIP((y + (crv * v)) >> 16); + g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16); + b = LUT_CLIP((y + (cbu * u) + OFF) >> 16); + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b); + + dp1 += 4; + + /* yuv to rgb */ + y = YMUL * ((*yp1++) - 16); + r = LUT_CLIP((y + (crv * v)) >> 16); + g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16); + b = LUT_CLIP((y + (cbu * u) + OFF) >> 16); + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(r,g,b); + + dp1 += 4; + + /* do the bottom 2 pixels */ + /* yuv to rgb */ + y = YMUL * ((*yp2++) - 16); + r = LUT_CLIP((y + (crv * v)) >> 16); + g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16); + b = LUT_CLIP((y + (cbu * u) + OFF) >> 16); + *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(r,g,b); + + dp2 += 4; + + /* yuv to rgb */ + y = YMUL * ((*yp2++) - 16); + r = LUT_CLIP((y + (crv * v)) >> 16); + g = LUT_CLIP((y - (cgu * u) - (cgv * v) + OFF) >>16); + b = LUT_CLIP((y + (cbu * u) + OFF) >> 16); + *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(r,g,b); + + dp2 += 4; + } + /* jump down one line since we are doing 2 at once */ + dp1 += (w * 4); + dp2 += (w * 4); + } +#endif +} +#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; + 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 which shared u & v */ + /* yuv to rgb */ + y = _v1164[*yp1++]; + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); + + dp1 += 4; + + /* yuv to rgb */ + y = _v1164[*yp1++]; + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); + + dp1 += 4; + + /* do the bottom 2 pixels */ + /* yuv to rgb */ + y = _v1164[*yp2++]; + *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); + + dp2 += 4; + + /* yuv to rgb */ + y = _v1164[*yp2++]; + *((DATA32 *) dp2) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); + + dp2 += 4; + } + /* jump down one line since we are doing 2 at once */ + dp1 += (w * 4); + dp2 += (w * 4); + } +#endif +} + +void +evas_common_convert_yuv_422_601_rgba(DATA8 **src, DATA8 *dst, int w, int h) +{ +#ifdef BUILD_C + if (!initted) _evas_yuv_init(); + initted = 1; + _evas_yuy2torgb_raster(src, dst, w, h); +#endif +} + +void +evas_common_convert_yuv_420_601_rgba(DATA8 **src, DATA8 *dst, int w, int h) +{ +#ifdef BUILD_C + if (!initted) _evas_yuv_init(); + initted = 1; + _evas_nv12torgb_raster(src, dst, w, h); +#endif +} + +void +evas_common_convert_yuv_420T_601_rgba(DATA8 **src, DATA8 *dst, int w, int h) +{ +#ifdef BUILD_C + if (initted) _evas_yuv_init(); + initted = 1; + _evas_nv12tiledtorgb_raster(src, dst, w, h); +#endif +} + +static void +_evas_yuy2torgb_raster(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_C + int xx, yy; + int y, u, v; + unsigned char *yp1, *yp2, *up, *vp; + unsigned char *dp1; + + dp1 = rgb; + + /* destination pointers */ + for (yy = 0; yy < h; yy++) + { + /* plane pointers */ + unsigned char *line; + + line = yuv[yy]; + yp1 = line + 0; + up = line + 1; + yp2 = line + 2; + vp = line + 3; + + for (xx = 0; xx < w; xx += 2) + { + int vmu; + + /* collect u & v for 2 pixels 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 which shared u & v */ + /* yuv to rgb */ + y = _v1164[*yp1]; + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); + + dp1 += 4; + + /* yuv to rgb */ + y = _v1164[*yp2]; + *((DATA32 *) dp1) = 0xff000000 + RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); + + dp1 += 4; + + yp1 += 4; yp2 += 4; up += 4; vp += 4; + } + } +#endif +} + +#ifdef BUILD_C +static inline void +_evas_yuv2rgb_420_raster(unsigned char *yp1, unsigned char *yp2, unsigned char *up, unsigned char *vp, + unsigned char *dp1, unsigned char *dp2) +{ + int y, u, v; + int vmu; + int rgb; + + /* collect u & v for 4 pixels block */ + u = *up; + v = *vp; + + /* save lookups */ +#ifdef MEM_BP + vmu = _v813[v] + _v391[u]; + u = _v2018[u]; + v = _v1596[v]; +#else + u -= 128; + v -= 128; + vmu = v * CGV + u * CGU; + u = u * CBU; + v = v * CRV; +#endif + + /* do the top 2 pixels of the 2x2 block which shared u & v */ + /* yuv to rgb */ +#ifdef MEM_BP + y = _v1164[*yp1]; + rgb = RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); +#else + y = (*yp1 - 16 ) * YMUL; + rgb = RGB_JOIN(LUT_CLIP(((y + v) >> 16)), + LUT_CLIP(((y - vmu + OFF) >> 16)), + LUT_CLIP(((y + u + OFF) >> 16))); +#endif + *((DATA32 *) dp1) = 0xff000000 + rgb; + + dp1 += 4; yp1++; + + /* yuv to rgb */ +#ifdef MEM_BP + y = _v1164[*yp1]; + rgb = RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); +#else + y = (*yp1 - 16 ) * YMUL; + rgb = RGB_JOIN(LUT_CLIP(((y + v) >> 16)), + LUT_CLIP(((y - vmu + OFF) >> 16)), + LUT_CLIP(((y + u + OFF) >> 16))); +#endif + *((DATA32 *) dp1) = 0xff000000 + rgb; + + /* do the bottom 2 pixels of the 2x2 block which shared u & v */ + /* yuv to rgb */ +#ifdef MEM_BP + y = _v1164[*yp2]; + rgb = RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); +#else + y = (*yp2 - 16 ) * YMUL; + rgb = RGB_JOIN(LUT_CLIP(((y + v) >> 16)), + LUT_CLIP(((y - vmu + OFF) >> 16)), + LUT_CLIP(((y + u + OFF) >> 16))); +#endif + *((DATA32 *) dp2) = 0xff000000 + rgb; + + dp2 += 4; yp2++; + + /* yuv to rgb */ +#ifdef MEM_BP + y = _v1164[*yp2]; + rgb = RGB_JOIN(LUT_CLIP(y + v), LUT_CLIP(y - vmu), LUT_CLIP(y + u)); +#else + y = (*yp2 - 16 ) * YMUL; + rgb = RGB_JOIN(LUT_CLIP(((y + v) >> 16)), + LUT_CLIP(((y - vmu + OFF) >> 16)), + LUT_CLIP(((y + u + OFF) >> 16))); +#endif + *((DATA32 *) dp2) = 0xff000000 + rgb; +} +#endif + +static void +_evas_nv12tiledtorgb_raster(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_C + +#define HANDLE_MACROBLOCK(YP1, YP2, UP, VP, DP1, DP2) \ + { \ + int i; \ + int j; \ + \ + for (i = 0; i < 32; i += 2) \ + { \ + for (j = 0; j < 64; j += 2) \ + { \ + _evas_yuv2rgb_420_raster(YP1, YP2, UP, VP, DP1, DP2); \ + \ + /* the previous call just rendered 2 pixels per lines */ \ + DP1 += 8; DP2 += 8; \ + \ + /* and took for that 2 lines with 2 Y, 1 U and 1 V. Don't forget U & V are in the same plane */ \ + YP1 += 2; YP2 += 2; UP += 2; VP += 2; \ + } \ + \ + DP1 += sizeof (int) * ((w << 1) - 64); \ + DP2 += sizeof (int) * ((w << 1) - 64); \ + YP1 += 64; \ + YP2 += 64; \ + } \ + } + + /* One macro block is 32 lines of Y and 16 lines of UV */ + const int offset_value[2] = { 0, 64 * 16 }; + int mb_x, mb_y, mb_w, mb_h; + int base_h; + int uv_x, uv_y, uv_step; + int stride; + + /* Idea iterate over each macroblock and convert each of them using _evas_nv12torgb_raster */ + + /* The layout of the Y macroblock order in RGB non tiled space : */ + /* --------------------------------------------------- */ + /* | 0 | 1 | 6 | 7 | 8 | 9 | 14 | 15 | 16 | 17 | */ + /* --------------------------------------------------- */ + /* | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 18 | 19 | */ + /* --------------------------------------------------- */ + /* | 20 | 21 | 26 | 27 | 28 | 29 | 34 | 35 | 36 | 37 | */ + /* --------------------------------------------------- */ + /* | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 38 | 39 | */ + /* --------------------------------------------------- */ + /* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | */ + /* --------------------------------------------------- */ + /* The layout of the UV macroblock order in the same RGB non tiled space : */ + /* --------------------------------------------------- */ + /* | | | | | | | | | | | */ + /* - 0 - 1 - 6 - 7 - 8 - 9 - 14 - 15 - 16 - 17 - */ + /* | | | | | | | | | | | */ + /* --------------------------------------------------- */ + /* | | | | | | | | | | | */ + /* - 2 - 3 - 4 - 5 - 10 - 11 - 12 - 13 - 18 - 19 - */ + /* | | | | | | | | | | | */ + /* --------------------------------------------------- */ + /* | | | | | | | | | | | */ + /* - 20 - 21 - 22 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - */ + + /* the number of macroblock should be a multiple of 64x32 */ + mb_w = w / 64; + mb_h = h / 32; + + base_h = (mb_h >> 1) + (mb_h & 0x1); + stride = w * sizeof (int); + + uv_x = 0; uv_y = 0; + + /* In this format we linearize macroblock on two line to form a Z and it's invert */ + for (mb_y = 0; mb_y < (mb_h >> 1); mb_y++) + { + int step = 2; + int offset = 0; + int x = 0; + int rmb_x = 0; + int ry[2]; + + ry[0] = mb_y * 2 * 32 * stride; + ry[1] = ry[0] + 32 * stride; + + uv_step = (mb_y & 0x1) == 0 ? 4 : 0; + uv_x = (mb_y & 0x1) == 0 ? 0 : 2 * 64 * 32; + + for (mb_x = 0; mb_x < mb_w * 2; mb_x++, rmb_x += 64 * 32) + { + unsigned char *yp1, *yp2, *up, *vp; + unsigned char *dp1, *dp2; + + dp1 = rgb + x + ry[offset]; + dp2 = dp1 + stride; + + yp1 = yuv[mb_y] + rmb_x; + yp2 = yp1 + 64; + + /* UV plane is two time less bigger in pixel count, but it old two bytes each times */ + up = yuv[(mb_y >> 1) + base_h] + uv_x + offset_value[offset]; + vp = up + 1; + + HANDLE_MACROBLOCK(yp1, yp2, up, vp, dp1, dp2); + + step++; + if ((step & 0x3) == 0) + { + offset = 1 - offset; + x -= 64 * sizeof (int); + uv_x -= 64 * 32; + } + else + { + x += 64 * sizeof (int); + uv_x += 64 * 32; + } + + uv_step++; + if (uv_step == 8) + { + uv_step = 0; + uv_x += 4 * 64 * 32; + } + } + } + + if (mb_h & 0x1) + { + int x = 0; + int ry; + + ry = mb_y << 1; + + uv_step = 0; + uv_x = 0; + + for (mb_x = 0; mb_x < mb_w; mb_x++, x++, uv_x++) + { + unsigned char *yp1, *yp2, *up, *vp; + unsigned char *dp1, *dp2; + + dp1 = rgb + (x * 64 + (ry * 32 * w)) * sizeof (int); + dp2 = dp1 + sizeof (int) * w; + + yp1 = yuv[mb_y] + mb_x * 64 * 32; + yp2 = yp1 + 64; + + up = yuv[mb_y / 2 + base_h] + uv_x * 64 * 32; + vp = up + 1; + + HANDLE_MACROBLOCK(yp1, yp2, up, vp, dp1, dp2); + } + } +#endif +} + +static void +_evas_nv12torgb_raster(unsigned char **yuv, unsigned char *rgb, int w, int h) +{ +#ifdef BUILD_C + int xx, yy; + unsigned char *yp1, *yp2, *up, *vp; + unsigned char *dp1; + unsigned char *dp2; + + dp1 = rgb; + dp2 = dp1 + sizeof (int) * w; + + for (yy = 0; yy < h; yy++) + { + yp1 = yuv[yy++]; + yp2 = yuv[yy]; + + up = yuv[h + (yy >> 1)]; + vp = up + 1; + + for (xx = 0; xx < w; xx += 2) + { + _evas_yuv2rgb_420_raster(yp1, yp2, up, vp, dp1, dp2); + + /* the previous call just rendered 2 pixels per lines */ + dp1 += 8; dp2 += 8; + + /* and took for that 2 lines with 2 Y, 1 U and 1 V. Don't forget U & V are in the same plane */ + yp1 += 2; yp2 += 2; up += 2; vp += 2; + } + + /* jump one line */ + dp1 += sizeof (int) * w; + dp2 += sizeof (int) * w; + yp1 += w; + yp2 += w; + } +#endif +} + +#endif + diff --git a/libraries/evas/src/lib/engines/common/evas_convert_yuv.h b/libraries/evas/src/lib/engines/common/evas_convert_yuv.h new file mode 100644 index 0000000..b598807 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_convert_yuv.h @@ -0,0 +1,9 @@ +#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); +EAPI void evas_common_convert_yuv_422_601_rgba (DATA8 **src, DATA8 *dst, int w, int h); +EAPI void evas_common_convert_yuv_420_601_rgba (DATA8 **src, DATA8 *dst, int w, int h); +EAPI void evas_common_convert_yuv_420T_601_rgba (DATA8 **src, DATA8 *dst, int w, int h); + +#endif /* _EVAS_CONVERT_YUV_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_cpu.c b/libraries/evas/src/lib/engines/common/evas_cpu.c new file mode 100644 index 0000000..cff8b2b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_cpu.c @@ -0,0 +1,270 @@ +#include "evas_common.h" +#if defined BUILD_MMX || defined BUILD_SSE +#include "evas_mmx.h" +#endif + +#if defined BUILD_SSE3 +#include +#endif + +#if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP) +#include +#include +#include + +static sigjmp_buf detect_buf; +#endif + +static int cpu_feature_mask = 0; + +#if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP) +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 __UNUSED__) +{ + siglongjmp(detect_buf, 1); +} + +static void +evas_common_cpu_catch_segv(int sig __UNUSED__) +{ + 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_op_sse3_test(void); + +void +evas_common_cpu_sse3_test(void) +{ +#ifdef BUILD_SSE3 + evas_common_op_sse3_test(); +#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_neon_test(void) +{ +//#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 70) +#ifdef BUILD_NEON + asm volatile ( + ".fpu neon \n\t" + "vqadd.u8 d0, d1, d0\n" + : /* Out */ + : /* In */ + : /* Clobbered */ + "d0", "d1" + ); +#endif +//#endif +} + +void +evas_common_cpu_vis_test(void) +{ +#ifdef __SPARC__ +#endif /* __SPARC__ */ +} + +int +evas_common_cpu_feature_test(void (*feature)(void)) +{ +#if defined (HAVE_STRUCT_SIGACTION) && defined (HAVE_SIGLONGJMP) + 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(); + if (getenv("EVAS_CPU_NO_MMX")) + cpu_feature_mask &= ~CPU_FEATURE_MMX; + cpu_feature_mask |= CPU_FEATURE_MMX2 * + evas_common_cpu_feature_test(evas_common_cpu_mmx2_test); + evas_common_cpu_end_opt(); + if (getenv("EVAS_CPU_NO_MMX2")) + cpu_feature_mask &= ~CPU_FEATURE_MMX2; +#ifdef BUILD_SSE + cpu_feature_mask |= CPU_FEATURE_SSE * + evas_common_cpu_feature_test(evas_common_cpu_sse_test); + evas_common_cpu_end_opt(); + if (getenv("EVAS_CPU_NO_SSE")) + cpu_feature_mask &= ~CPU_FEATURE_SSE; +#ifdef BUILD_SSE3 + cpu_feature_mask |= CPU_FEATURE_SSE3 * + evas_common_cpu_feature_test(evas_common_cpu_sse3_test); + evas_common_cpu_end_opt(); + if (getenv("EVAS_CPU_NO_SSE3")) + cpu_feature_mask &= ~CPU_FEATURE_SSE3; +#endif /* BUILD_SSE3 */ +#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(); + if (getenv("EVAS_CPU_NO_ALTIVEC")) + cpu_feature_mask &= ~CPU_FEATURE_ALTIVEC; +#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(); + if (getenv("EVAS_CPU_NO_VIS")) + cpu_feature_mask &= ~CPU_FEATURE_VIS; +#endif /* __SPARC__ */ +#if defined(__ARM_ARCH__) +#ifdef BUILD_NEON + cpu_feature_mask |= CPU_FEATURE_NEON * + evas_common_cpu_feature_test(evas_common_cpu_neon_test); + evas_common_cpu_end_opt(); + if (getenv("EVAS_CPU_NO_NEON")) + cpu_feature_mask &= ~CPU_FEATURE_NEON; +#endif +#endif +} + +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; + } +// INF("%i %i %i", 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 diff --git a/libraries/evas/src/lib/engines/common/evas_draw.h b/libraries/evas/src/lib/engines/common/evas_draw.h new file mode 100644 index 0000000..34e0ed3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_draw.h @@ -0,0 +1,36 @@ +#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 void evas_common_draw_context_set_mask (RGBA_Draw_Context *dc, RGBA_Image *im, int x, int y, int w, int h); +EAPI void evas_common_draw_context_unset_mask (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 idx); +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/libraries/evas/src/lib/engines/common/evas_draw_main.c b/libraries/evas/src/lib/engines/common/evas_draw_main.c new file mode 100644 index 0000000..7652708 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_draw_main.c @@ -0,0 +1,576 @@ +#include "evas_common.h" +#include "evas_convert_main.h" +#include "evas_private.h" + +EAPI Cutout_Rects* +evas_common_draw_context_cutouts_new(void) +{ + Cutout_Rects *rects; + + rects = calloc(1, sizeof(Cutout_Rects)); + return rects; +} + +EAPI void +evas_common_draw_context_cutouts_free(Cutout_Rects* rects) +{ + rects->active = 0; +} + +EAPI void +evas_common_draw_context_cutouts_del(Cutout_Rects* rects, int idx) +{ + if ((idx >= 0) && (idx < rects->active)) + { + Cutout_Rect *rect; + + rect = rects->rects + idx; + memmove(rect, rect + 1, + sizeof(Cutout_Rect) * (rects->active - idx - 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_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_set_mask(RGBA_Draw_Context *dc, RGBA_Image *mask, int x, int y, int w, int h) +{ + dc->mask.mask = mask; + dc->mask.x = x; + dc->mask.y = y; + dc->mask.w = w; + dc->mask.h = h; +} + +EAPI void +evas_common_draw_context_unset_mask(RGBA_Draw_Context *dc) +{ + dc->mask.mask = NULL; +} + + + + + +EAPI void +evas_common_draw_context_add_cutout(RGBA_Draw_Context *dc, int x, int y, int w, int h) +{ +// if (dc->cutout.rects > 512) return; + if (dc->clip.use) + { +#if 1 // this is a bit faster + int xa1, xa2, xb1, xb2; + + xa1 = x; + xa2 = xa1 + w - 1; + xb1 = dc->clip.x; + if (xa2 < xb1) return; + xb2 = xb1 + dc->clip.w - 1; + if (xa1 >= xb2) return; + if (xa2 > xb2) xa2 = xb2; + if (xb1 > xa1) xa1 = xb1; + x = xa1; + w = xa2 - xa1 + 1; + + xa1 = y; + xa2 = xa1 + h - 1; + xb1 = dc->clip.y; + if (xa2 < xb1) return; + xb2 = xb1 + dc->clip.h - 1; + if (xa1 >= xb2) return; + if (xa2 > xb2) xa2 = xb2; + if (xb1 > xa1) xa1 = xb1; + y = xa1; + h = xa2 - xa1 + 1; +#else + RECTS_CLIP_TO_RECT(x, y, w, h, + dc->clip.x, dc->clip.y, dc->clip.w, dc->clip.h); +#endif + 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 idx, Cutout_Rect *split) +{ + /* 1 input rect, multiple out */ + Cutout_Rect in = res->rects[idx]; + + /* 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[idx].h = INY2 - SPY2; + res->rects[idx].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, idx); + 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[idx].w = INX2 - SPX2; + res->rects[idx].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[idx].w = INX2 - SPX2; + res->rects[idx].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[idx].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[idx].h = INY2 - SPY2; + res->rects[idx].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[idx].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[idx].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[idx].h = INY2 - SPY2; + res->rects[idx].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[idx].h = INY2 - SPY2; + res->rects[idx].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[idx].h = INY2 - SPY2; + res->rects[idx].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[idx].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[idx].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[idx].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[idx].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[idx].h = SPY1 - in.y; + return 1; + } + evas_common_draw_context_cutouts_del(res, idx); + 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/libraries/evas/src/lib/engines/common/evas_font.h b/libraries/evas/src/lib/engines/common/evas_font.h new file mode 100644 index 0000000..533d897 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font.h @@ -0,0 +1,76 @@ +#ifndef _EVAS_FONT_H +#define _EVAS_FONT_H +#include "evas_text_utils.h" + + +/* main */ + +EAPI void evas_common_font_init (void); +EAPI void evas_common_font_shutdown (void); +EAPI void evas_common_font_font_all_unload (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); + +/* draw */ + +EAPI void evas_common_font_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const Evas_Text_Props *intl_props); +EAPI int evas_common_font_glyph_search (RGBA_Font *fn, RGBA_Font_Int **fi_ret, Eina_Unicode gl); +EAPI RGBA_Font_Glyph *evas_common_font_int_cache_glyph_get (RGBA_Font_Int *fi, FT_UInt index); +EAPI FT_UInt evas_common_get_char_index (RGBA_Font_Int* fi, Eina_Unicode gl); +EAPI void evas_common_font_draw_init (void); + +/* load */ +EAPI void evas_common_font_dpi_set (int dpi); +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_Int *evas_common_font_int_load (const char *name, int size, Font_Rend_Flags wanted_rend); +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, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_load (const char *name, int size, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_add (RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_memory_add (RGBA_Font *fn, const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend); +EAPI void evas_common_font_free (RGBA_Font *fn); +EAPI void evas_common_font_hinting_set (RGBA_Font *fn, Font_Hint_Flags hinting); +EAPI Eina_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, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_hinting_load (const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend); +EAPI RGBA_Font *evas_common_font_hinting_add (RGBA_Font *fn, const char *name, int size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend); +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, Font_Rend_Flags wanted_rend); +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, Font_Rend_Flags wanted_rend); +EAPI void evas_common_font_all_clear (void); + +/* query */ + +EAPI int evas_common_font_query_kerning (RGBA_Font_Int* fi, FT_UInt left, FT_UInt right, int* kerning); +EAPI void evas_common_font_query_size (RGBA_Font *fn, const Evas_Text_Props *intl_props, int *w, int *h); +EAPI int evas_common_font_query_inset (RGBA_Font *fn __UNUSED__, const Evas_Text_Props *text_props); +EAPI int evas_common_font_query_right_inset (RGBA_Font *fn __UNUSED__, const Evas_Text_Props *text_props); +EAPI void evas_common_font_query_advance (RGBA_Font *fn, const Evas_Text_Props *intl_props, int *h_adv, int *v_adv); +EAPI int evas_common_font_query_char_coords (RGBA_Font *fn, const Evas_Text_Props *intl_props, int pos, int *cx, int *cy, int *cw, int *ch); +EAPI int evas_common_font_query_pen_coords (RGBA_Font *fn, const Evas_Text_Props *intl_props, int pos, int *cpen_x, int *cy, int *cadv, int *ch); +EAPI int evas_common_font_query_char_at_coords (RGBA_Font *fn, const Evas_Text_Props *intl_props, int x, int y, int *cx, int *cy, int *cw, int *ch); +EAPI int evas_common_font_query_last_up_to_pos (RGBA_Font *fn, const Evas_Text_Props *intl_props, int x, int y); +EAPI int evas_common_font_query_run_font_end_get(RGBA_Font *fn, RGBA_Font_Int **script_fi, RGBA_Font_Int **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len); + +#ifdef EVAS_FRAME_QUEUING +EAPI void evas_common_font_draw_finish(void); +#endif + +void evas_common_font_load_init(void); +void evas_common_font_load_shutdown(void); + +#endif /* _EVAS_FONT_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_font_default_walk.x b/libraries/evas/src/lib/engines/common/evas_font_default_walk.x new file mode 100644 index 0000000..94e7fde --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_default_walk.x @@ -0,0 +1,144 @@ +#ifndef _EVAS_FONT_DEFAULT_WALK_X +#define _EVAS_FONT_DEFAULT_WALK_X +/* Macros for text walking */ + +/** + * @def EVAS_FONT_WALK_TEXT_INIT + * @internal + * This macro defines the variables that will later be used with the following + * macros, and by font handling functions. + * @see EVAS_FONT_WALK_TEXT_START + * @see EVAS_FONT_WALK_TEXT_WORK + * @see EVAS_FONT_WALK_TEXT_END + */ +# define EVAS_FONT_WALK_TEXT_INIT() \ + int _pen_x = 0, _pen_y = 0; \ + Evas_Coord _start_pen = (text_props->info && \ + (text_props->start > 0)) ? \ + text_props->info->glyph[text_props->start - 1].pen_after : 0 ; \ + size_t char_index; \ + (void) _pen_y; /* Sometimes it won't be used */ + +/* Visual walk helper macros */ +#ifdef OT_SUPPORT +#define _EVAS_FONT_WALK_TEXT_START() \ + Evas_Font_OT_Info *_ot_itr = (text_props->info) ? \ + text_props->info->ot + text_props->start : NULL; \ + if (!_ot_itr) break; \ + for (char_index = 0 ; char_index < text_props->len ; char_index++, _glyph_itr++, _ot_itr++) \ + { +#else +#define _EVAS_FONT_WALK_TEXT_START() \ + for (char_index = 0 ; char_index < text_props->len ; char_index++, _glyph_itr++) \ + { +#endif + +/** + * @def EVAS_FONT_WALK_TEXT_START + * @internal + * This runs through the text in visual order while updating char_index, + * which is the current index in the text. + * Does not end with a ; + * Take a look at EVAS_FONT_WALK_X_OFF and the like. + * @see EVAS_FONT_WALK_TEXT_INIT + * @see EVAS_FONT_WALK_TEXT_WORK + * @see EVAS_FONT_WALK_TEXT_END + */ +#define EVAS_FONT_WALK_TEXT_START() \ + do \ + { \ + Evas_Font_Glyph_Info *_glyph_itr = (text_props->info) ? \ + text_props->info->glyph + text_props->start : NULL; \ + if (!_glyph_itr) break; \ + _EVAS_FONT_WALK_TEXT_START() + +/*FIXME: doc */ +#ifdef OT_SUPPORT +# define EVAS_FONT_WALK_X_OFF \ + (EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_X_OFF_GET(*_ot_itr))) +# define EVAS_FONT_WALK_Y_OFF \ + (EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_Y_OFF_GET(*_ot_itr))) +# define EVAS_FONT_WALK_POS \ + (EVAS_FONT_OT_POS_GET(*_ot_itr) - text_props->text_offset) +# define EVAS_FONT_WALK_POS_NEXT \ + ((!EVAS_FONT_WALK_IS_LAST) ? \ + EVAS_FONT_OT_POS_GET(*(_ot_itr + 1)) - \ + text_props->text_offset : \ + EVAS_FONT_WALK_POS \ + ) +# define EVAS_FONT_WALK_POS_PREV \ + ((char_index > 0) ? \ + EVAS_FONT_OT_POS_GET(*(_ot_itr - 1)) - \ + text_props->text_offset : \ + EVAS_FONT_WALK_POS \ + ) +#else +# define EVAS_FONT_WALK_X_OFF 0 +# define EVAS_FONT_WALK_Y_OFF 0 +# define EVAS_FONT_WALK_POS \ + ((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) ? \ + (text_props->len - char_index - 1) : \ + (char_index)) +# define EVAS_FONT_WALK_POS_NEXT \ + ((!EVAS_FONT_WALK_IS_LAST) ? \ + ((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) ? \ + text_props->len - char_index - 2 \ + : (char_index + 1)) : \ + EVAS_FONT_WALK_POS) +# define EVAS_FONT_WALK_POS_PREV \ + ((char_index > 0) ? \ + ((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) ? \ + text_props->len - char_index \ + : (char_index - 1)) : \ + EVAS_FONT_WALK_POS) +#endif + + +#define EVAS_FONT_WALK_IS_VISIBLE (_glyph_itr->index != 0) +#define EVAS_FONT_WALK_X_BEAR (_glyph_itr->x_bear) +#define EVAS_FONT_WALK_Y_BEAR (fg->glyph_out->top) +#define EVAS_FONT_WALK_X_ADV ((_glyph_itr > text_props->info->glyph) ? \ + _glyph_itr->pen_after - (_glyph_itr - 1)->pen_after : \ + _glyph_itr->pen_after) +#define EVAS_FONT_WALK_WIDTH (_glyph_itr->width) + +#define EVAS_FONT_WALK_INDEX (_glyph_itr->index) +#define EVAS_FONT_WALK_PEN_X (_pen_x) +#define EVAS_FONT_WALK_PEN_X_AFTER (_glyph_itr->pen_after - _start_pen) +#define EVAS_FONT_WALK_PEN_Y (EVAS_FONT_ROUND_26_6_TO_INT(_pen_y)) +#define EVAS_FONT_WALK_Y_ADV (0) +#define EVAS_FONT_WALK_IS_LAST \ + (char_index + 1 == text_props->len) +#define EVAS_FONT_WALK_IS_FIRST \ + (char_index == 0) +#define EVAS_FONT_WALK_LEN (text_props->len) + +/** + * @def EVAS_FONT_WALK_TEXT_WORK + * @internal + * This macro actually updates the values mentioned in EVAS_FONT_WALK_TEXT_START + * according to the current positing in the walk. + * @see EVAS_FONT_WALK_TEXT_START + * @see EVAS_FONT_WALK_TEXT_INIT + * @see EVAS_FONT_WALK_TEXT_END + */ +#define EVAS_FONT_WALK_TEXT_WORK() do {} while(0) + +/** + * @def EVAS_FONT_WALK_TEXT_END + * @internal + * Closes EVAS_FONT_WALK_TEXT_START, needs to end with a ; + * @see EVAS_FONT_WALK_TEXT_START + * @see EVAS_FONT_WALK_TEXT_INIT + * @see EVAS_FONT_WALK_TEXT_WORK + */ +#define EVAS_FONT_WALK_TEXT_END() \ + if (EVAS_FONT_WALK_IS_VISIBLE) \ + { \ + _pen_x = _glyph_itr->pen_after - _start_pen; \ + } \ + } \ + } \ + while(0) + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_font_draw.c b/libraries/evas/src/lib/engines/common/evas_font_draw.c new file mode 100644 index 0000000..94aa085 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_draw.c @@ -0,0 +1,615 @@ +#include "evas_common.h" +#include "evas_private.h" +#include "evas_blend_private.h" + +#include "language/evas_bidi_utils.h" /*defines BIDI_SUPPORT if possible */ +#include "evas_font_private.h" /* for Frame-Queuing support */ + +#include "evas_font_ot.h" + +/* Forcibly disable the broken word/metric caching. */ +#ifdef METRIC_CACHE +# undef METRIC_CACHE +#endif + +#ifdef WORD_CACHE +# undef WORD_CACHE +#endif + +#define WORD_CACHE_MAXLEN 50 +/* How many to cache */ +#define WORD_CACHE_NWORDS 40 + +static int max_cached_words = WORD_CACHE_NWORDS; + +struct prword +{ + EINA_INLIST; + struct cinfo *cinfo; + Evas_Text_Props text_props; + DATA8 *im; + int roww; + int width; + int height; + int baseline; +}; + +struct cinfo +{ + FT_UInt index; + struct + { + int x, y; + } pos; + int posx; + RGBA_Font_Glyph *fg; + struct + { + int w,h; + int rows; + unsigned char *data; + } bm; +}; + + +#if defined(METRIC_CACHE) || defined(WORD_CACHE) +LK(lock_words); // for word cache call +static Eina_Inlist *words = NULL; +static struct prword *evas_font_word_prerender(RGBA_Draw_Context *dc, const Evas_Text_Props *text_props); +#endif + +EAPI void +evas_common_font_draw_init(void) +{ + char *p; + int tmp; + + if ((p = getenv("EVAS_WORD_CACHE_MAX_WORDS"))) + { + tmp = strtol(p,NULL,10); + /* 0 to disable of course */ + if (tmp > -1 && tmp < 500){ + max_cached_words = tmp; + } + } +} + +#ifdef EVAS_FRAME_QUEUING +EAPI void +evas_common_font_draw_finish(void) +{ +} +#endif + +/* + * BiDi handling: We receive the shaped string + other props from text_props, + * we need to reorder it so we'll have the visual string (the way we draw) + * and then for kerning we have to switch the order of the kerning query (as the prev + * is on the right, and not on the left). + */ +static void +evas_common_font_draw_internal(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn __UNUSED__, int x, int y, + const Evas_Text_Props *text_props, RGBA_Gfx_Func func, int ext_x, int ext_y, int ext_w, + int ext_h, int im_w, int im_h __UNUSED__) +{ + DATA32 *im; + RGBA_Font_Int *fi; + EVAS_FONT_WALK_TEXT_INIT(); + + fi = text_props->font_instance; + if (!fi) return; + + evas_common_font_int_reload(fi); + + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + + +#if defined(METRIC_CACHE) || defined(WORD_CACHE) + unsigned int len; + + len = text_props->len; + + if (len > 2 && (len < WORD_CACHE_MAXLEN)) + { + struct prword *word; + + word = + evas_font_word_prerender(dc, text_props); + if (word) + { + int j, rowstart, rowend, xstart, xrun; + + im = dst->image.data; + xrun = word->width; + y -= word->baseline; + xstart = 0; + rowstart = 0; + rowend = word->height; + /* Clip to extent */ + if (x + xrun > ext_x + ext_w) + { + xrun -= x + xrun - ext_x - ext_w; + } + if (x < ext_x) + { + int excess = ext_x - x; + xstart = excess - 1; + xrun -= excess; + x = ext_x; + } + if (y + rowend > ext_y + ext_h) + { + rowend -= (y - ext_y + rowend - ext_h); + } + if (y < ext_y) + { + int excess = ext_y - y; + rowstart += excess; + //rowend -= excess; + // y = ext_y; + } + + if (xrun < 1) return; +/* For some reason, metric and word chache are exactly the same except for + * this piece of code that makes metric go nuts. ATM, we'll just go the + * WORD_CACHE path. */ +#if defined(METRIC_CACHE) || defined(WORD_CACHE) + if (word->im) + { + for (j = rowstart ; j < rowend ; j ++) + { + func(NULL, word->im + (word->roww * j) + xstart, dc->col.col, + im + ((y + j) * im_w) + x, xrun); + } + return; + } +# elif defined(METRIC_CACHE) + unsigned int ind; + + y += word->baseline; + for (ind = 0 ; ind < len ; ind ++) + { + // FIXME Do we need to draw? + struct cinfo *ci = word->cinfo + ind; + for (j = rowstart ; j < rowend ; j ++) + { + if ((ci->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, ci->fg, + x + ci->pos.x, + y - ci->bm.h + j); + } + else + { + func(NULL, word->im + (word->roww * j) + xstart, + dc->col.col, im + ((y + j) * im_w) + x, xrun); + } + } + } + return; +# endif + } + } +#endif + + im = dst->image.data; + + EVAS_FONT_WALK_TEXT_START() + { + FT_UInt idx; + RGBA_Font_Glyph *fg; + int chr_x, chr_y; + + if (!EVAS_FONT_WALK_IS_VISIBLE) continue; + + idx = EVAS_FONT_WALK_INDEX; + + LKL(fi->ft_mutex); + fg = evas_common_font_int_cache_glyph_get(fi, idx); + if (!fg) + { + LKU(fi->ft_mutex); + continue; + } + + LKU(fi->ft_mutex); + + 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 = x + EVAS_FONT_WALK_PEN_X + EVAS_FONT_WALK_X_OFF + EVAS_FONT_WALK_X_BEAR; + chr_y = y + EVAS_FONT_WALK_PEN_Y + EVAS_FONT_WALK_Y_OFF + EVAS_FONT_WALK_Y_BEAR; + + 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_GRAY)) + { + 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); + } + } + } + } + } + } + } + } + } + else + break; + } + EVAS_FONT_WALK_TEXT_END(); + evas_common_font_int_use_trim(); +} + +EAPI void +evas_common_font_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const Evas_Text_Props *text_props) +{ + int ext_x, ext_y, ext_w, ext_h; + int im_w, im_h; + RGBA_Gfx_Func func; + Cutout_Rects *rects; + Cutout_Rect *r; + int c, cx, cy, cw, ch; + int i; + + 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; + +#ifdef EVAS_FRAME_QUEUING + LKL(fn->lock); +#endif +// evas_common_font_size_use(fn); + func = evas_common_gfx_func_composite_mask_color_span_get(dc->col.col, dst, 1, dc->render_op); + + if (!dc->cutout.rects) + { + evas_common_font_draw_internal(dst, dc, fn, x, y, text_props, + func, ext_x, ext_y, ext_w, ext_h, + im_w, im_h); + } + else + { + 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); + /* 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); + evas_common_font_draw_internal(dst, dc, fn, x, y, text_props, + func, r->x, r->y, r->w, r->h, + im_w, im_h); + } + evas_common_draw_context_apply_clear_cutouts(rects); + } + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; + } +#ifdef EVAS_FRAME_QUEUING + LKU(fn->lock); +#endif +} + +/* Only used if cache is on */ +#if defined(METRIC_CACHE) || defined(WORD_CACHE) + +static Eina_Bool +_evas_font_word_prerender_text_props_equal(const Evas_Text_Props *_a, const Evas_Text_Props *_b) +{ + Evas_Font_Glyph_Info *gl1, *gl2; + size_t i; + + if ((_a->len != _b->len) || + (_a->font_instance != _b->font_instance)) + return EINA_FALSE; + + gl1 = _a->info->glyph + _a->start; + gl2 = _b->info->glyph + _b->start; + i = _a->len; + for ( ; (i > 0) && (gl1->index == gl2->index) ; i--, gl1++, gl2++) + ; + + return (i == 0); +} + +static struct prword * +evas_font_word_prerender(RGBA_Draw_Context *dc, const Evas_Text_Props *text_props) +{ + struct cinfo *metrics; + unsigned char *im; + int width; + int height, above, below, baseline, descent; + unsigned int i,j; + struct prword *w; + int last_delta = 0; + Eina_Unicode gl; + struct cinfo *ci; + unsigned int len = text_props->len; + RGBA_Font_Int *fi = (RGBA_Font_Int *) text_props->font_instance; + EVAS_FONT_WALK_TEXT_INIT(); + +# ifndef METRIC_CACHE + gl = dc->font_ext.func.gl_new ? 1: 0; + if (gl) return NULL; +# endif + + LKL(lock_words); + EINA_INLIST_FOREACH(words,w) + { + if (_evas_font_word_prerender_text_props_equal(&w->text_props, + text_props)) + { + words = eina_inlist_promote(words, EINA_INLIST_GET(w)); + LKU(lock_words); + return w; + } + } + LKU(lock_words); + + gl = dc->font_ext.func.gl_new ? 1: 0; + + above = 0; below = 0; baseline = 0; height = 0; descent = 0; + + /* First pass: Work out how big and populate */ + metrics = malloc(sizeof(struct cinfo) * len); + ci = metrics; + EVAS_FONT_WALK_TEXT_START() + { + FT_UInt index; + RGBA_Font_Glyph *fg; + index = EVAS_FONT_WALK_INDEX; + LKL(fi->ft_mutex); + fg = evas_common_font_int_cache_glyph_get(fi, index); + if (!fg) + { + LKU(fi->ft_mutex); + continue; + } + + LKU(fi->ft_mutex); + EVAS_FONT_WALK_TEXT_WORK(); + /* Currently broken with invisible chars if (!EVAS_FONT_WALK_IS_VISIBLE) continue; */ + ci->index = index; + ci->fg = fg; + + if (gl) + { + ci->fg->ext_dat =dc->font_ext.func.gl_new(dc->font_ext.data,ci->fg); + ci->fg->ext_dat_free = dc->font_ext.func.gl_free; + } + ci->bm.data = ci->fg->glyph_out->bitmap.buffer; + ci->bm.w = MAX(ci->fg->glyph_out->bitmap.pitch, + ci->fg->glyph_out->bitmap.width); + ci->bm.rows = ci->fg->glyph_out->bitmap.rows; + ci->bm.h = ci->fg->glyph_out->top; + above = ci->bm.rows - (ci->bm.rows - ci->bm.h); + below = ci->bm.rows - ci->bm.h; + if (below > descent) descent = below; + if (above > baseline) baseline = above; + ci->pos.x = EVAS_FONT_WALK_PEN_X + EVAS_FONT_WALK_X_OFF + EVAS_FONT_WALK_X_BEAR; + ci->pos.y = EVAS_FONT_WALK_PEN_Y + EVAS_FONT_WALK_Y_OFF + EVAS_FONT_WALK_Y_BEAR; + last_delta = EVAS_FONT_WALK_X_ADV - + (ci->bm.w + ci->fg->glyph_out->left); + ci++; + } + EVAS_FONT_WALK_TEXT_END(); + + /* First loop done */ + width = EVAS_FONT_WALK_PEN_X; + if (last_delta < 0) + width -= last_delta; + width = (width & 0x7) ? width + (8 - (width & 0x7)) : width; + + height = baseline + descent; + if (!gl) + { + im = calloc(height, width); + for (i = 0 ; i < len ; i ++) + { + struct cinfo *cin = metrics + i; + + for (j = 0 ; j < cin->bm.rows ; j ++) + { + int correction; /* Used to remove negative inset and such */ + if (cin->pos.x < 0) + correction = -cin->pos.x; + else + correction = 0; + + memcpy(im + cin->pos.x + (j + baseline - cin->bm.h) * width + + correction, + cin->bm.data + j * cin->bm.w + correction, + cin->bm.w - correction); + } + } + } + else + { + im = NULL; + } + + /* Save it */ + struct prword *save; + + save = malloc(sizeof(struct prword)); + save->cinfo = metrics; + evas_common_text_props_content_copy_and_ref(&save->text_props, text_props); + save->im = im; + save->width = EVAS_FONT_WALK_PEN_X; + if (last_delta < 0) + save->width += last_delta; + save->roww = width; + save->height = height; + save->baseline = baseline; + LKL(lock_words); + words = eina_inlist_prepend(words, EINA_INLIST_GET(save)); + + /* Clean up if too long */ + if (eina_inlist_count(words) > max_cached_words) + { + struct prword *last = (struct prword *)(words->last); + + if (last) + { + if (last->im) free(last->im); + if (last->cinfo) free(last->cinfo); + evas_common_text_props_content_unref(&last->text_props); + words = eina_inlist_remove(words, EINA_INLIST_GET(last)); + free(last); + } + } + LKU(lock_words); + + return save; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_font_load.c b/libraries/evas/src/lib/engines/common/evas_font_load.c new file mode 100644 index 0000000..3fc4521 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_load.c @@ -0,0 +1,929 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include + +#include "evas_font_private.h" /* for Frame-Queuing support */ +#include "evas_font_ot.h" + +#ifdef USE_HARFBUZZ +# include +# include +#endif + +extern FT_Library evas_ft_lib; + +static int font_cache_usage = 0; +static int font_cache = 0; +static int font_dpi = 75; + +static Eina_Hash *fonts_src = NULL; +static Eina_Hash *fonts = NULL; +static Eina_List *fonts_lru = NULL; +static Eina_Inlist *fonts_use_lru = NULL; +static int fonts_use_usage = 0; + +static void _evas_common_font_int_clear(RGBA_Font_Int *fi); + +static int +_evas_font_cache_int_cmp(const RGBA_Font_Int *k1, int k1_length __UNUSED__, + const RGBA_Font_Int *k2, int k2_length __UNUSED__) +{ + /* RGBA_Font_Source->name is a stringshare */ + if (k1->src->name == k2->src->name) + { + if (k1->size == k2->size) + return k1->wanted_rend - k2->wanted_rend; + else + return k1->size - k2->size; + } + return strcmp(k1->src->name, k2->src->name); +} + +static int +_evas_font_cache_int_hash(const RGBA_Font_Int *key, int key_length __UNUSED__) +{ + int hash; + unsigned int wanted_rend = key->wanted_rend; + hash = eina_hash_djb2(key->src->name, eina_stringshare_strlen(key->src->name) + 1); + hash ^= eina_hash_int32(&key->size, sizeof (int)); + hash ^= eina_hash_int32(&wanted_rend, sizeof (int)); + return hash; +} + +static void +_evas_common_font_source_free(RGBA_Font_Source *fs) +{ + FTLOCK(); + FT_Done_Face(fs->ft.face); + FTUNLOCK(); + if (fs->name) eina_stringshare_del(fs->name); + if (fs->file) eina_stringshare_del(fs->file); + free(fs); +} + +static void +_evas_common_font_int_free(RGBA_Font_Int *fi) +{ + FT_Done_Size(fi->ft.size); + + evas_common_font_int_modify_cache_by(fi, -1); + _evas_common_font_int_clear(fi); + eina_hash_free(fi->kerning); + +#ifdef HAVE_PTHREAD + pthread_mutex_destroy(&fi->ft_mutex); +#endif +#ifdef USE_HARFBUZZ + hb_font_destroy(fi->ft.hb_font); +#endif + evas_common_font_source_free(fi->src); + if (fi->references == 0) fonts_lru = eina_list_remove(fonts_lru, fi); + if (fi->fash) fi->fash->freeme(fi->fash); + if (fi->inuse) + { + fonts_use_lru = eina_inlist_remove(fonts_use_lru, EINA_INLIST_GET(fi)); + fi->inuse = 0; + fonts_use_usage -= fi->usage; + fi->usage = 0; + } + free(fi); +} + +void +evas_common_font_load_init(void) +{ + fonts_src = eina_hash_string_small_new(EINA_FREE_CB(_evas_common_font_source_free)); + fonts = eina_hash_new(NULL, + EINA_KEY_CMP(_evas_font_cache_int_cmp), + EINA_KEY_HASH(_evas_font_cache_int_hash), + EINA_FREE_CB(_evas_common_font_int_free), + 5); +} + +void +evas_common_font_load_shutdown(void) +{ + eina_hash_free(fonts); + fonts = NULL; + eina_hash_free(fonts_src); + fonts_src = NULL; +} + +EAPI void +evas_common_font_dpi_set(int dpi) +{ + font_dpi = dpi; +} + +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; + + assert(name != NULL); + 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); + FTLOCK(); + error = FT_New_Memory_Face(evas_ft_lib, fs->data, fs->data_size, 0, &(fs->ft.face)); + FTUNLOCK(); + if (error) + { + free(fs); + return NULL; + } + fs->name = eina_stringshare_add(name); + fs->file = NULL; + FTLOCK(); + error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode); + if (error) + { + FT_Done_Face(fs->ft.face); + fs->ft.face = NULL; + free(fs); + return NULL; + } + FTUNLOCK(); + fs->ft.orig_upem = fs->ft.face->units_per_EM; + fs->references = 1; + eina_hash_direct_add(fonts_src, fs->name, fs); + return fs; +} + +EAPI RGBA_Font_Source * +evas_common_font_source_load(const char *name) +{ + RGBA_Font_Source *fs; + + assert(name != NULL); + 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 = eina_stringshare_add(name); + fs->file = eina_stringshare_ref(fs->name); + fs->ft.orig_upem = 0; + fs->references = 1; + eina_hash_direct_add(fonts_src, fs->name, fs); + return fs; +} + +void +evas_common_font_source_unload(RGBA_Font_Source *fs) +{ + FTLOCK(); + FT_Done_Face(fs->ft.face); + fs->ft.face = NULL; + FTUNLOCK(); +} + +void +evas_common_font_source_reload(RGBA_Font_Source *fs) +{ + if (fs->ft.face) return; + if (fs->data) + { + int error; + + FTLOCK(); + error = FT_New_Memory_Face(evas_ft_lib, fs->data, fs->data_size, 0, &(fs->ft.face)); + FTUNLOCK(); + if (error) return; + FTLOCK(); + error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode); + if (error) + { + FT_Done_Face(fs->ft.face); + fs->ft.face = NULL; + } + FTUNLOCK(); + } + else + evas_common_font_source_load_complete(fs); +} + +EAPI int +evas_common_font_source_load_complete(RGBA_Font_Source *fs) +{ + int error; + + FTLOCK(); + error = FT_New_Face(evas_ft_lib, fs->file, 0, &(fs->ft.face)); + if (error) + { + FTUNLOCK(); + fs->ft.face = NULL; + return error; + } + error = FT_Select_Charmap(fs->ft.face, ft_encoding_unicode); + if (error) + { + FT_Done_Face(fs->ft.face); + FTUNLOCK(); + fs->ft.face = NULL; + return error; + } + FTUNLOCK(); + fs->ft.orig_upem = fs->ft.face->units_per_EM; + return error; +} + +EAPI RGBA_Font_Source * +evas_common_font_source_find(const char *name) +{ + RGBA_Font_Source *fs; + + if (!name) return NULL; + fs = eina_hash_find(fonts_src, name); + if (fs) + { + fs->references++; + return fs; + } + return NULL; +} + +EAPI void +evas_common_font_source_free(RGBA_Font_Source *fs) +{ + fs->references--; + if (fs->references > 0) return; + eina_hash_del(fonts_src, fs->name, fs); +} + +EAPI void +evas_common_font_size_use(RGBA_Font *fn) +{ + RGBA_Font_Int *fi; + Eina_List *l; + + EINA_LIST_FOREACH(fn->fonts, l, fi) + { + if (fi->src->current_size != fi->size) + { + evas_common_font_source_reload(fi->src); + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + } +} + +static int +_evas_common_font_double_int_cmp(const int *key1, __UNUSED__ int key1_length, + const int *key2, __UNUSED__ int key2_length) +{ + if (key1[0] - key2[0] == 0) return key1[1] - key2[1]; + return key1[0] - key2[0]; +} + +static int +_evas_common_font_double_int_hash(const unsigned int key[2], int key_length) +{ + return + eina_hash_int32(&key[0], key_length) ^ + eina_hash_int32(&key[1], key_length); +} + +static void +_evas_common_font_int_cache_init(RGBA_Font_Int *fi) +{ + /* Add some font kerning cache. */ + fi->kerning = eina_hash_new(NULL, + EINA_KEY_CMP(_evas_common_font_double_int_cmp), + EINA_KEY_HASH(_evas_common_font_double_int_hash), + free, 3); +#ifdef HAVE_PTHREAD + pthread_mutex_init(&fi->ft_mutex, NULL); +#endif +} + +EAPI RGBA_Font_Int * +evas_common_font_int_memory_load(const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) +{ + RGBA_Font_Int *fi; + + fi = evas_common_font_int_find(name, size, wanted_rend); + 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; + _evas_common_font_int_cache_init(fi); + 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, + Font_Rend_Flags wanted_rend) +{ + RGBA_Font_Int *fi; + + fi = evas_common_font_int_find(name, size, wanted_rend); + 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; + fi->wanted_rend = wanted_rend; + _evas_common_font_int_cache_init(fi); + 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_init(RGBA_Font_Int *fi) +{ + fi->ft.size = NULL; + fi->references = 1; + eina_hash_direct_add(fonts, fi, fi); + return fi; +} + +EAPI RGBA_Font_Int * +evas_common_font_int_load_complete(RGBA_Font_Int *fi) +{ + int val, dv; + int ret; + int error; + + FTLOCK(); + 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, font_dpi, font_dpi); + if (error) + { + fi->real_size = fi->size; + error = FT_Set_Pixel_Sizes(fi->src->ft.face, 0, fi->real_size); + } + FTUNLOCK(); + 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; + FTLOCK(); + error = FT_Set_Pixel_Sizes(fi->src->ft.face, chosen_width, fi->real_size); + FTUNLOCK(); + if (error) + { + /* couldn't choose the size anyway... what now? */ + } + } + fi->src->current_size = 0; + fi->max_h = 0; + val = (int)fi->src->ft.face->bbox.yMax; + if (fi->src->ft.face->units_per_EM != 0) + { + 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); + } + else ret = val; + fi->max_h += ret; + val = -(int)fi->src->ft.face->bbox.yMin; + if (fi->src->ft.face->units_per_EM != 0) + { + 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); + } + else ret = val; + fi->max_h += ret; + + /* If the loaded font doesn't match with wanted_rend value requested by + * textobject and textblock, Set the runtime_rend value as FONT_REND_SLANT + * or FONT_REND_WEIGHT for software rendering. */ + fi->runtime_rend = FONT_REND_REGULAR; + if ((fi->wanted_rend & FONT_REND_SLANT) && + !(fi->src->ft.face->style_flags & FT_STYLE_FLAG_ITALIC)) + fi->runtime_rend |= FONT_REND_SLANT; + + if ((fi->wanted_rend & FONT_REND_WEIGHT) && + !(fi->src->ft.face->style_flags & FT_STYLE_FLAG_BOLD)) + fi->runtime_rend |= FONT_REND_WEIGHT; + + return fi; +} + +EAPI RGBA_Font * +evas_common_font_memory_load(const char *name, int size, const void *data, int data_size, Font_Rend_Flags wanted_rend) +{ + RGBA_Font *fn; + RGBA_Font_Int *fi; + + fi = evas_common_font_int_memory_load(name, size, data, data_size, + wanted_rend); + if (!fi) return NULL; + fn = calloc(1, sizeof(RGBA_Font)); + if (!fn) + { + fi->references--; + if (fi->references == 0) + { + fonts_lru = eina_list_prepend(fonts_lru, fi); + evas_common_font_int_modify_cache_by(fi, 1); + evas_common_font_flush(); + } + return NULL; + } + fn->fonts = eina_list_append(fn->fonts, fi); + fn->hinting = FONT_BYTECODE_HINT; + fi->hinting = fn->hinting; + fn->references = 1; + LKI(fn->lock); +#ifdef EVAS_FRAME_QUEUING + LKI(fn->ref_fq_add); + LKI(fn->ref_fq_del); + eina_condition_new(&(fn->cond_fq_del), &(fn->ref_fq_del)); +#endif + if (fi->inuse) evas_common_font_int_promote(fi); + else + { + fi->inuse = 1; + fonts_use_lru = eina_inlist_prepend(fonts_use_lru, EINA_INLIST_GET(fi)); + } + return fn; +} + + +//ZZZ: font struct looks like: +// fn->(fi, fi, fi, ...) +// fi->fs + +EAPI RGBA_Font * +evas_common_font_load(const char *name, int size, Font_Rend_Flags wanted_rend) +{ + RGBA_Font *fn; + RGBA_Font_Int *fi; + + fi = evas_common_font_int_load(name, size, wanted_rend); + 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) + { + fonts_lru = eina_list_prepend(fonts_lru, fi); + 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) + { + fonts_lru = eina_list_prepend(fonts_lru, fi); + evas_common_font_int_modify_cache_by(fi, 1); + evas_common_font_flush(); + } + return NULL; + } + + fn->fonts = eina_list_append(fn->fonts, fi); + fn->hinting = FONT_BYTECODE_HINT; + fi->hinting = fn->hinting; + fn->references = 1; + LKI(fn->lock); +#ifdef EVAS_FRAME_QUEUING + LKI(fn->ref_fq_add); + LKI(fn->ref_fq_del); + eina_condition_new(&(fn->cond_fq_del), &(fn->ref_fq_del)); +#endif + if (fi->inuse) evas_common_font_int_promote(fi); + else + { + fi->inuse = 1; + fonts_use_lru = eina_inlist_prepend(fonts_use_lru, EINA_INLIST_GET(fi)); + } + return fn; +} + +EAPI RGBA_Font * +evas_common_font_add(RGBA_Font *fn, const char *name, int size, Font_Rend_Flags wanted_rend) +{ + RGBA_Font_Int *fi; + + if (!fn) return NULL; + fi = evas_common_font_int_load(name, size, wanted_rend); + if (fi) + { + fn->fonts = eina_list_append(fn->fonts, fi); + fi->hinting = fn->hinting; + if (fi->inuse) evas_common_font_int_promote(fi); + else + { + fi->inuse = 1; + fonts_use_lru = eina_inlist_prepend(fonts_use_lru, EINA_INLIST_GET(fi)); + } + 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, Font_Rend_Flags wanted_rend) +{ + RGBA_Font_Int *fi; + + if (!fn) + return NULL; + fi = evas_common_font_int_memory_load(name, size, data, data_size, wanted_rend); + if (fi) + { + fn->fonts = eina_list_append(fn->fonts, fi); + fi->hinting = fn->hinting; + if (fi->inuse) evas_common_font_int_promote(fi); + else + { + fi->inuse = 1; + fonts_use_lru = eina_inlist_prepend(fonts_use_lru, EINA_INLIST_GET(fi)); + } + return fn; + } + return NULL; +} + +EAPI void +evas_common_font_free(RGBA_Font *fn) +{ + Eina_List *l; + RGBA_Font_Int *fi; + + if (!fn) return; + fn->references--; + if (fn->references > 0) return; +#ifdef EVAS_FRAME_QUEUING + LKL(fn->ref_fq_add); + LKL(fn->ref_fq_del); + if (fn->ref_fq[0] != fn->ref_fq[1]) + { + LKU(fn->ref_fq_add); + LKU(fn->ref_fq_del); + return; + } + LKU(fn->ref_fq_add); + LKU(fn->ref_fq_del); +#endif + EINA_LIST_FOREACH(fn->fonts, l, fi) + { + fi->references--; + if (fi->references == 0) + { + fonts_lru = eina_list_append(fonts_lru, fi); + evas_common_font_int_modify_cache_by(fi, 1); + } + } + evas_common_font_flush(); + eina_list_free(fn->fonts); + if (fn->fash) fn->fash->freeme(fn->fash); + LKD(fn->lock); +#ifdef EVAS_FRAME_QUEUING + LKD(fn->ref_fq_add); + LKD(fn->ref_fq_del); + eina_condition_free(&(fn->cond_fq_del)); +#endif + free(fn); +} + +EAPI void +evas_common_font_hinting_set(RGBA_Font *fn, Font_Hint_Flags hinting) +{ + Eina_List *l; + RGBA_Font_Int *fi; + + if (!fn) return; + fn->hinting = hinting; + EINA_LIST_FOREACH(fn->fonts, l, fi) + { + fi->hinting = fn->hinting; + } +} + +EAPI Eina_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 EINA_TRUE; + 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 EINA_TRUE; +#endif + } + /* shouldn't get here - need to add another case statement */ + return EINA_FALSE; +} + +EAPI RGBA_Font * +evas_common_font_memory_hinting_load(const char *name, int size, const void *data, int data_size, Font_Hint_Flags hinting, Font_Rend_Flags wanted_rend) +{ + RGBA_Font *fn; + + fn = evas_common_font_memory_load(name, size, data, data_size, wanted_rend); + 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, Font_Rend_Flags wanted_rend) +{ + RGBA_Font *fn; + + fn = evas_common_font_load(name, size, wanted_rend); + 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, Font_Rend_Flags wanted_rend) +{ + fn = evas_common_font_add(fn, name, size, wanted_rend); + 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, Font_Rend_Flags wanted_rend) +{ + fn = evas_common_font_memory_add(fn, name, size, data, data_size, + wanted_rend); + if (fn) evas_common_font_hinting_set(fn, hinting); + return fn; +} + +static void +_evas_common_font_int_clear(RGBA_Font_Int *fi) +{ + int i, j, k; + + LKL(fi->ft_mutex); + if (!fi->fash) + { + LKU(fi->ft_mutex); + return; + } + evas_common_font_int_modify_cache_by(fi, -1); + if (fi->fash) + { + for (k = 0; k <= 0xff; k++) // 24bits for unicode - v6 up to E01EF (chrs) & 10FFFD for private use (plane 16) + { + Fash_Glyph_Map2 *fmap2 = fi->fash->bucket[k]; + if (fmap2) + { + for (j = 0; j <= 0xff; j++) // 24bits for unicode - v6 up to E01EF (chrs) & 10FFFD for private use (plane 16) + { + Fash_Glyph_Map *fmap = fmap2->bucket[j]; + if (fmap) + { + for (i = 0; i <= 0xff; i++) + { + RGBA_Font_Glyph *fg = fmap->item[i]; + if ((fg) && (fg != (void *)(-1))) + { + FT_Done_Glyph(fg->glyph); + /* extension calls */ + if (fg->ext_dat_free) fg->ext_dat_free(fg->ext_dat); + free(fg); + fmap->item[i] = NULL; + } + } + } + } + } + } + fi->fash->freeme(fi->fash); + fi->fash = NULL; + } + if (fi->inuse) fonts_use_usage -= fi->usage; + fi->usage = 0; + LKU(fi->ft_mutex); +} + +static Eina_Bool +_evas_common_font_all_clear_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__) +{ + RGBA_Font_Int *fi = data; + _evas_common_font_int_clear(fi); + return 1; +} + +EAPI void +evas_common_font_all_clear(void) +{ + eina_hash_foreach(fonts, _evas_common_font_all_clear_cb, NULL); +} + +void +evas_common_font_int_promote(RGBA_Font_Int *fi) +{ + return; + if (fonts_use_lru == (Eina_Inlist *)fi) return; + if (!fi->inuse) return; + fonts_use_lru = eina_inlist_remove(fonts_use_lru, EINA_INLIST_GET(fi)); + fonts_use_lru = eina_inlist_prepend(fonts_use_lru, EINA_INLIST_GET(fi)); +} + +void +evas_common_font_int_use_increase(int size) +{ + fonts_use_usage += size; +} + +void +evas_common_font_int_use_trim(void) +{ + Eina_Inlist *l; + + return; + if (fonts_use_usage <= (font_cache << 1)) return; + if (!fonts_use_lru) return; + l = fonts_use_lru->last; + while (l) + { + RGBA_Font_Int *fi = (RGBA_Font_Int *)l; + if (fonts_use_usage <= (font_cache << 1)) break; + // FIXME: del fi->kerning content + _evas_common_font_int_clear(fi); + evas_common_font_int_unload(fi); + evas_common_font_int_promote(fi); + l = l->prev; + } +} + +void +evas_common_font_int_unload(RGBA_Font_Int *fi) +{ + return; + if (!fi->src->ft.face) return; + _evas_common_font_int_clear(fi); + FT_Done_Size(fi->ft.size); + fi->ft.size = NULL; + evas_common_font_source_unload(fi->src); +} + +void +evas_common_font_int_reload(RGBA_Font_Int *fi) +{ + if (fi->src->ft.face) return; + evas_common_font_source_load_complete(fi->src); + return; + evas_common_font_source_reload(fi->src); + evas_common_font_int_load_complete(fi); +} + +/* 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) +{ + font_cache_usage += dir * (sizeof(RGBA_Font) + fi->usage + + 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(); + evas_common_font_int_use_trim(); +} + +EAPI void +evas_common_font_flush(void) +{ + if (font_cache_usage < font_cache) return; + while (font_cache_usage > font_cache) + { + int pfont_cache_usage; + + pfont_cache_usage = font_cache_usage; + evas_common_font_flush_last(); + if (pfont_cache_usage == font_cache_usage) break; + } +} + +/* 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) +{ + RGBA_Font_Int *fi = NULL; + + if (!fonts_lru) return ; + fi = eina_list_data_get(fonts_lru); + fonts_lru = eina_list_remove_list(fonts_lru, fonts_lru); + eina_hash_del(fonts, fi, fi); +} + +EAPI RGBA_Font_Int * +evas_common_font_int_find(const char *name, int size, + Font_Rend_Flags wanted_rend) +{ + RGBA_Font_Int tmp_fi; + RGBA_Font_Source tmp_fn; + RGBA_Font_Int *fi; + + tmp_fn.name = (char*) eina_stringshare_add(name); + tmp_fi.src = &tmp_fn; + tmp_fi.size = size; + tmp_fi.wanted_rend = wanted_rend; + fi = eina_hash_find(fonts, &tmp_fi); + if (fi) + { + if (fi->references == 0) + { + evas_common_font_int_modify_cache_by(fi, -1); + fonts_lru = eina_list_remove(fonts_lru, fi); + } + fi->references++; + } + eina_stringshare_del(tmp_fn.name); + return fi; +} diff --git a/libraries/evas/src/lib/engines/common/evas_font_main.c b/libraries/evas/src/lib/engines/common/evas_font_main.c new file mode 100644 index 0000000..64b1d5e --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_main.c @@ -0,0 +1,547 @@ +#include "evas_common.h" +#include "evas_private.h" + +#include "evas_font_private.h" + +#include FT_OUTLINE_H + +FT_Library evas_ft_lib = 0; +static int initialised = 0; + +LK(lock_font_draw); // for freetype2 API calls +LK(lock_bidi); // for evas bidi internal usage. +LK(lock_ot); // for evas bidi internal usage. + +EAPI void +evas_common_font_init(void) +{ + int error; + const char *s; + + initialised++; + if (initialised != 1) return; + error = FT_Init_FreeType(&evas_ft_lib); + if (error) return; + evas_common_font_load_init(); + evas_common_font_draw_init(); + s = getenv("EVAS_FONT_DPI"); + if (s) + { + int dpi = atoi(s); + + if (dpi > 0) evas_common_font_dpi_set(dpi); + } + LKI(lock_font_draw); + LKI(lock_bidi); + LKI(lock_ot); +} + +EAPI void +evas_common_font_shutdown(void) +{ + int error; + + if (initialised < 1) return; + initialised--; + if (initialised != 0) return; + + LKD(lock_font_draw); + LKD(lock_bidi); + LKD(lock_ot); + + evas_common_font_load_shutdown(); + evas_common_font_cache_set(0); + evas_common_font_flush(); + + error = FT_Done_FreeType(evas_ft_lib); +#ifdef EVAS_FRAME_QUEUING + evas_common_font_draw_finish(); +#endif + evas_ft_lib = 0; +} + +EAPI void +evas_common_font_font_all_unload(void) +{ + evas_common_font_all_clear(); +} + +EAPI int +evas_common_font_ascent_get(RGBA_Font *fn) +{ + int val; + RGBA_Font_Int *fi; + +// evas_common_font_size_use(fn); +#if 0 + { + Eina_List *l; + + EINA_LIST_FOREACH(fn->fonts, l, fi) + { + if (!fi->src->ft.face) continue; + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + 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); + printf(" ==== %p: %i\n", fi, ret); + } + } +#endif + fi = fn->fonts->data; + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + if (!FT_IS_SCALABLE(fi->src->ft.face)) + { + WRN("NOT SCALABLE!"); + } + val = (int)fi->src->ft.face->size->metrics.ascender; + return val >> 6; +// printf("%i | %i\n", val, val >> 6); +// 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; + RGBA_Font_Int *fi; + +// evas_common_font_size_use(fn); + fi = fn->fonts->data; + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + val = -(int)fi->src->ft.face->size->metrics.descender; + return val >> 6; +// 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; + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + 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; + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + 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; + RGBA_Font_Int *fi; + +// evas_common_font_size_use(fn); + fi = fn->fonts->data; + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + val = (int)fi->src->ft.face->size->metrics.height; + if (fi->src->ft.face->units_per_EM == 0) + return val; + return val >> 6; +// 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; +} + +/* Set of common functions that are used in a couple of places. */ + +static void +_fash_int2_free(Fash_Int_Map2 *fash) +{ + int i; + + for (i = 0; i < 256; i++) if (fash->bucket[i]) free(fash->bucket[i]); + free(fash); +} + +static void +_fash_int_free(Fash_Int *fash) +{ + int i; + + for (i = 0; i < 256; i++) if (fash->bucket[i]) _fash_int2_free(fash->bucket[i]); + free(fash); +} + +static Fash_Int * +_fash_int_new(void) +{ + Fash_Int *fash = calloc(1, sizeof(Fash_Int)); + fash->freeme = _fash_int_free; + return fash; +} + +static Fash_Item_Index_Map * +_fash_int_find(Fash_Int *fash, int item) +{ + int grp, maj, min; + + // 24bits for unicode - v6 up to E01EF (chrs) & 10FFFD for private use (plane 16) + grp = (item >> 16) & 0xff; + maj = (item >> 8) & 0xff; + min = item & 0xff; + if (!fash->bucket[grp]) return NULL; + if (!fash->bucket[grp]->bucket[maj]) return NULL; + return &(fash->bucket[grp]->bucket[maj]->item[min]); +} + +static void +_fash_int_add(Fash_Int *fash, int item, RGBA_Font_Int *fint, int idx) +{ + int grp, maj, min; + + // 24bits for unicode - v6 up to E01EF (chrs) & 10FFFD for private use (plane 16) + grp = (item >> 16) & 0xff; + maj = (item >> 8) & 0xff; + min = item & 0xff; + if (!fash->bucket[grp]) + fash->bucket[grp] = calloc(1, sizeof(Fash_Int_Map2)); + EINA_SAFETY_ON_NULL_RETURN(fash->bucket[grp]); + if (!fash->bucket[grp]->bucket[maj]) + fash->bucket[grp]->bucket[maj] = calloc(1, sizeof(Fash_Int_Map)); + EINA_SAFETY_ON_NULL_RETURN(fash->bucket[grp]->bucket[maj]); + fash->bucket[grp]->bucket[maj]->item[min].fint = fint; + fash->bucket[grp]->bucket[maj]->item[min].index = idx; +} + +static void +_fash_gl2_free(Fash_Glyph_Map2 *fash) +{ + int i; + + for (i = 0; i < 256; i++) if (fash->bucket[i]) free(fash->bucket[i]); + free(fash); +} + +static void +_fash_gl_free(Fash_Glyph *fash) +{ + int i; + + for (i = 0; i < 256; i++) if (fash->bucket[i]) _fash_gl2_free(fash->bucket[i]); + free(fash); +} + +static Fash_Glyph * +_fash_gl_new(void) +{ + Fash_Glyph *fash = calloc(1, sizeof(Fash_Glyph)); + fash->freeme = _fash_gl_free; + return fash; +} + +static RGBA_Font_Glyph * +_fash_gl_find(Fash_Glyph *fash, int item) +{ + int grp, maj, min; + + // 24bits for unicode - v6 up to E01EF (chrs) & 10FFFD for private use (plane 16) + grp = (item >> 16) & 0xff; + maj = (item >> 8) & 0xff; + min = item & 0xff; + if (!fash->bucket[grp]) return NULL; + if (!fash->bucket[grp]->bucket[maj]) return NULL; + return fash->bucket[grp]->bucket[maj]->item[min]; +} + +static void +_fash_gl_add(Fash_Glyph *fash, int item, RGBA_Font_Glyph *glyph) +{ + int grp, maj, min; + + // 24bits for unicode - v6 up to E01EF (chrs) & 10FFFD for private use (plane 16) + grp = (item >> 16) & 0xff; + maj = (item >> 8) & 0xff; + min = item & 0xff; + if (!fash->bucket[grp]) + fash->bucket[grp] = calloc(1, sizeof(Fash_Glyph_Map2)); + EINA_SAFETY_ON_NULL_RETURN(fash->bucket[grp]); + if (!fash->bucket[grp]->bucket[maj]) + fash->bucket[grp]->bucket[maj] = calloc(1, sizeof(Fash_Glyph_Map)); + EINA_SAFETY_ON_NULL_RETURN(fash->bucket[grp]->bucket[maj]); + fash->bucket[grp]->bucket[maj]->item[min] = glyph; +} + +EAPI RGBA_Font_Glyph * +evas_common_font_int_cache_glyph_get(RGBA_Font_Int *fi, FT_UInt idx) +{ + RGBA_Font_Glyph *fg; + FT_UInt hindex; + FT_Error error; + int size; + const FT_Int32 hintflags[3] = + { FT_LOAD_NO_HINTING, FT_LOAD_FORCE_AUTOHINT, FT_LOAD_NO_AUTOHINT }; + static FT_Matrix transform = {0x10000, 0x05000, 0x0000, 0x10000}; // about 12 degree. + + evas_common_font_int_promote(fi); + if (fi->fash) + { + fg = _fash_gl_find(fi->fash, idx); + if (fg == (void *)(-1)) return NULL; + else if (fg) return fg; + } + + hindex = idx + (fi->hinting * 500000000); + +// fg = eina_hash_find(fi->glyphs, &hindex); +// if (fg) return fg; + + evas_common_font_int_reload(fi); + FTLOCK(); + error = FT_Load_Glyph(fi->src->ft.face, idx, + FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | + hintflags[fi->hinting]); + FTUNLOCK(); + if (error) + { + if (!fi->fash) fi->fash = _fash_gl_new(); + if (fi->fash) _fash_gl_add(fi->fash, idx, (void *)(-1)); + return NULL; + } + + /* Transform the outline of Glyph according to runtime_rend. */ + if (fi->runtime_rend & FONT_REND_SLANT) + FT_Outline_Transform(&fi->src->ft.face->glyph->outline, &transform); + /* Embolden the outline of Glyph according to rundtime_rend. */ + if (fi->runtime_rend & FONT_REND_WEIGHT) + FT_Outline_Embolden(&fi->src->ft.face->glyph->outline, + (fi->src->ft.face->size->metrics.x_ppem * 5 * 64) / 100); + + fg = malloc(sizeof(struct _RGBA_Font_Glyph)); + if (!fg) return NULL; + memset(fg, 0, (sizeof(struct _RGBA_Font_Glyph))); + + FTLOCK(); + error = FT_Get_Glyph(fi->src->ft.face->glyph, &(fg->glyph)); + FTUNLOCK(); + if (error) + { + free(fg); + if (!fi->fash) fi->fash = _fash_gl_new(); + if (fi->fash) _fash_gl_add(fi->fash, idx, (void *)(-1)); + return NULL; + } + + FTLOCK(); + error = FT_Glyph_To_Bitmap(&(fg->glyph), FT_RENDER_MODE_NORMAL, 0, 1); + if (error) + { + FT_Done_Glyph(fg->glyph); + FTUNLOCK(); + free(fg); + if (!fi->fash) fi->fash = _fash_gl_new(); + if (fi->fash) _fash_gl_add(fi->fash, idx, (void *)(-1)); + return NULL; + } + FTUNLOCK(); + + fg->glyph_out = (FT_BitmapGlyph)fg->glyph; + fg->index = hindex; + fg->fi = fi; + + if (!fi->fash) fi->fash = _fash_gl_new(); + if (fi->fash) _fash_gl_add(fi->fash, idx, fg); + /* This '+ 200' is just an estimation of how much memory freetype will use + * on it's size. This value is not really used anywhere in code - it's + * only for statistics. */ + size = sizeof(RGBA_Font_Glyph) + sizeof(Eina_List) + + (fg->glyph_out->bitmap.width * fg->glyph_out->bitmap.rows) + 200; + fi->usage += size; + if (fi->inuse) evas_common_font_int_use_increase(size); + +// eina_hash_direct_add(fi->glyphs, &fg->index, fg); + return fg; +} + +typedef struct _Font_Char_Index Font_Char_Index; +struct _Font_Char_Index +{ + FT_UInt index; + Eina_Unicode gl; +}; + +EAPI FT_UInt +evas_common_get_char_index(RGBA_Font_Int* fi, Eina_Unicode gl) +{ + Font_Char_Index result; + //FT_UInt ret; + +#ifdef HAVE_PTHREAD +/// pthread_mutex_lock(&fi->ft_mutex); +#endif + +// result = eina_hash_find(fi->indexes, &gl); +// if (result) goto on_correct; +// +// result = malloc(sizeof (Font_Char_Index)); +// if (!result) +// { +//#ifdef HAVE_PTHREAD +// pthread_mutex_unlock(&fi->ft_mutex); +//#endif +// return FT_Get_Char_Index(fi->src->ft.face, gl); +// } + + evas_common_font_int_reload(fi); + FTLOCK(); + result.index = FT_Get_Char_Index(fi->src->ft.face, gl); + FTUNLOCK(); + result.gl = gl; + +// eina_hash_direct_add(fi->indexes, &result->gl, result); +// +// on_correct: +#ifdef HAVE_PTHREAD +// pthread_mutex_unlock(&fi->ft_mutex); +#endif + return result.index; +} + +EAPI int +evas_common_font_glyph_search(RGBA_Font *fn, RGBA_Font_Int **fi_ret, Eina_Unicode gl) +{ + Eina_List *l; + + if (fn->fash) + { + Fash_Item_Index_Map *fm = _fash_int_find(fn->fash, gl); + if (fm) + { + if (fm->fint) + { + *fi_ret = fm->fint; + return fm->index; + } + else if (fm->index == -1) return 0; + } + } + + for (l = fn->fonts; l; l = l->next) + { + RGBA_Font_Int *fi; + int idx; + + fi = l->data; + +#if 0 /* FIXME: charmap user is disabled and use a deprecated data type. */ +/* + if (fi->src->charmap) // Charmap loaded, FI/FS blank + { + idx = evas_array_hash_search(fi->src->charmap, gl); + if (idx != 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 idx; + } + } + else +*/ +#endif + if (!fi->src->ft.face) /* Charmap not loaded, FI/FS blank */ + { + evas_common_font_int_reload(fi); + } + if (fi->src->ft.face) + { + idx = evas_common_get_char_index(fi, gl); + if (idx != 0) + { + if (!fi->ft.size) + evas_common_font_int_load_complete(fi); + if (!fn->fash) fn->fash = _fash_int_new(); + if (fn->fash) _fash_int_add(fn->fash, gl, fi, idx); + *fi_ret = fi; + return idx; + } + else + { + if (!fn->fash) fn->fash = _fash_int_new(); + if (fn->fash) _fash_int_add(fn->fash, gl, NULL, -1); + } + } + } + *fi_ret = NULL; + return 0; +} diff --git a/libraries/evas/src/lib/engines/common/evas_font_ot.c b/libraries/evas/src/lib/engines/common/evas_font_ot.c new file mode 100644 index 0000000..2912d55 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_ot.c @@ -0,0 +1,336 @@ +#include "evas_font_ot.h" + +#ifdef USE_HARFBUZZ +# include +# include +#endif + +#include "evas_common.h" + +#include +#include "evas_font_private.h" + +#ifdef USE_HARFBUZZ +static const hb_script_t +_evas_script_to_harfbuzz[] = +{ + HB_SCRIPT_COMMON, + HB_SCRIPT_INHERITED, + HB_SCRIPT_ARABIC, + HB_SCRIPT_ARMENIAN, + HB_SCRIPT_BENGALI, + HB_SCRIPT_BOPOMOFO, + HB_SCRIPT_CHEROKEE, + HB_SCRIPT_COPTIC, + HB_SCRIPT_CYRILLIC, + HB_SCRIPT_DESERET, + HB_SCRIPT_DEVANAGARI, + HB_SCRIPT_ETHIOPIC, + HB_SCRIPT_GEORGIAN, + HB_SCRIPT_GOTHIC, + HB_SCRIPT_GREEK, + HB_SCRIPT_GUJARATI, + HB_SCRIPT_GURMUKHI, + HB_SCRIPT_HAN, + HB_SCRIPT_HANGUL, + HB_SCRIPT_HEBREW, + HB_SCRIPT_HIRAGANA, + HB_SCRIPT_KANNADA, + HB_SCRIPT_KATAKANA, + HB_SCRIPT_KHMER, + HB_SCRIPT_LAO, + HB_SCRIPT_LATIN, + HB_SCRIPT_MALAYALAM, + HB_SCRIPT_MONGOLIAN, + HB_SCRIPT_MYANMAR, + HB_SCRIPT_OGHAM, + HB_SCRIPT_OLD_ITALIC, + HB_SCRIPT_ORIYA, + HB_SCRIPT_RUNIC, + HB_SCRIPT_SINHALA, + HB_SCRIPT_SYRIAC, + HB_SCRIPT_TAMIL, + HB_SCRIPT_TELUGU, + HB_SCRIPT_THAANA, + HB_SCRIPT_THAI, + HB_SCRIPT_TIBETAN, + HB_SCRIPT_CANADIAN_ABORIGINAL, + HB_SCRIPT_YI, + HB_SCRIPT_TAGALOG, + HB_SCRIPT_HANUNOO, + HB_SCRIPT_BUHID, + HB_SCRIPT_TAGBANWA, + + /* Unicode-4.0 additions */ + HB_SCRIPT_BRAILLE, + HB_SCRIPT_CYPRIOT, + HB_SCRIPT_LIMBU, + HB_SCRIPT_OSMANYA, + HB_SCRIPT_SHAVIAN, + HB_SCRIPT_LINEAR_B, + HB_SCRIPT_TAI_LE, + HB_SCRIPT_UGARITIC, + + /* Unicode-4.1 additions */ + HB_SCRIPT_NEW_TAI_LUE, + HB_SCRIPT_BUGINESE, + HB_SCRIPT_GLAGOLITIC, + HB_SCRIPT_TIFINAGH, + HB_SCRIPT_SYLOTI_NAGRI, + HB_SCRIPT_OLD_PERSIAN, + HB_SCRIPT_KHAROSHTHI, + + /* Unicode-5.0 additions */ + HB_SCRIPT_UNKNOWN, + HB_SCRIPT_BALINESE, + HB_SCRIPT_CUNEIFORM, + HB_SCRIPT_PHOENICIAN, + HB_SCRIPT_PHAGS_PA, + HB_SCRIPT_NKO, + + /* Unicode-5.1 additions */ + HB_SCRIPT_KAYAH_LI, + HB_SCRIPT_LEPCHA, + HB_SCRIPT_REJANG, + HB_SCRIPT_SUNDANESE, + HB_SCRIPT_SAURASHTRA, + HB_SCRIPT_CHAM, + HB_SCRIPT_OL_CHIKI, + HB_SCRIPT_VAI, + HB_SCRIPT_CARIAN, + HB_SCRIPT_LYCIAN, + HB_SCRIPT_LYDIAN, + + /* Unicode-5.2 additions */ + HB_SCRIPT_AVESTAN, + HB_SCRIPT_BAMUM, + HB_SCRIPT_EGYPTIAN_HIEROGLYPHS, + HB_SCRIPT_IMPERIAL_ARAMAIC, + HB_SCRIPT_INSCRIPTIONAL_PAHLAVI, + HB_SCRIPT_INSCRIPTIONAL_PARTHIAN, + HB_SCRIPT_JAVANESE, + HB_SCRIPT_KAITHI, + HB_SCRIPT_TAI_THAM, + HB_SCRIPT_LISU, + HB_SCRIPT_MEETEI_MAYEK, + HB_SCRIPT_OLD_SOUTH_ARABIAN, + HB_SCRIPT_OLD_TURKIC, + HB_SCRIPT_SAMARITAN, + HB_SCRIPT_TAI_VIET, + + /* Unicode-6.0 additions */ + HB_SCRIPT_BATAK, + HB_SCRIPT_BRAHMI, + HB_SCRIPT_MANDAIC +}; +#endif + +#ifdef OT_SUPPORT +/* FIXME: doc. returns #items */ +EAPI int +evas_common_font_ot_cluster_size_get(const Evas_Text_Props *props, size_t char_index) +{ + int i; + int items; + int left_bound, right_bound; + size_t base_cluster; + char_index += props->start; + base_cluster = EVAS_FONT_OT_POS_GET(props->info->ot[char_index]); + for (i = (int) char_index ; + (i >= (int) props->start) && + (EVAS_FONT_OT_POS_GET(props->info->ot[i]) == base_cluster) ; + i--) + ; + left_bound = i; + for (i = (int) char_index + 1; + (i < (int) (props->start + props->len)) && + (EVAS_FONT_OT_POS_GET(props->info->ot[i]) == base_cluster) ; + i++) + ; + right_bound = i; + + if (right_bound == left_bound) + { + items = 1; + } + else if (props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + if (left_bound < 0) + { + items = props->text_offset + props->text_len - base_cluster; + } + else + { + items = props->info->ot[left_bound].source_cluster - base_cluster; + } + } + else + { + if (right_bound >= (int) (props->text_offset + props->text_len)) + { + items = props->text_offset + props->text_len - base_cluster; + } + else + { + items = props->info->ot[right_bound].source_cluster - base_cluster; + } + } + return (items > 0) ? items : 1; +} + +/* Harfbuzz font functions */ + +static hb_position_t +_evas_common_font_ot_hb_get_glyph_advance(hb_font_t *font, + void *font_data, hb_codepoint_t glyph, + void *user_data) +{ + /* Use our cache*/ + RGBA_Font_Int *fi = (RGBA_Font_Int *) font_data; + RGBA_Font_Glyph *fg; + (void) font; + (void) user_data; + fg = evas_common_font_int_cache_glyph_get(fi, glyph); + if (fg) + { + return fg->glyph->advance.x >> 10; + } + return 0; +} + +static hb_position_t +_evas_common_font_ot_hb_get_kerning(hb_font_t *font, void *font_data, + hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, void *user_data) +{ + RGBA_Font_Int *fi = (RGBA_Font_Int *) font_data; + int kern; + (void) font; + (void) user_data; + if (evas_common_font_query_kerning(fi, first_glyph, second_glyph, &kern)) + return kern; + + return 0; +} + +/* End of harfbuzz font funcs */ + +static inline hb_font_funcs_t * +_evas_common_font_ot_font_funcs_get(void) +{ + static hb_font_funcs_t *font_funcs = NULL; + if (!font_funcs) + { + font_funcs = hb_font_funcs_create(); + hb_font_funcs_set_glyph_h_advance_func(font_funcs, + _evas_common_font_ot_hb_get_glyph_advance, NULL, NULL); + hb_font_funcs_set_glyph_h_kerning_func(font_funcs, + _evas_common_font_ot_hb_get_kerning, NULL, NULL); + } + + return font_funcs; +} + +static inline hb_unicode_funcs_t * +_evas_common_font_ot_unicode_funcs_get(void) +{ + static hb_unicode_funcs_t *unicode_funcs = NULL; + if (!unicode_funcs) + { + unicode_funcs = hb_unicode_funcs_get_default(); + } + + return unicode_funcs; +} + +static void +_evas_common_font_ot_shape(hb_buffer_t *buffer, RGBA_Font_Int *fi) +{ + /* Create hb_font if not previously created */ + if (!fi->ft.hb_font) + { + hb_font_t *hb_ft_font; + + hb_ft_font = hb_ft_font_create(fi->src->ft.face, NULL); + fi->ft.hb_font = hb_font_create_sub_font(hb_ft_font); + hb_font_destroy(hb_ft_font); + + hb_font_set_funcs(fi->ft.hb_font, + _evas_common_font_ot_font_funcs_get(), fi, NULL); + } + + hb_shape(fi->ft.hb_font, buffer, NULL, 0); +} + +EAPI Eina_Bool +evas_common_font_ot_populate_text_props(const Eina_Unicode *text, + Evas_Text_Props *props, int len) +{ + RGBA_Font_Int *fi; + hb_buffer_t *buffer; + hb_glyph_position_t *positions; + hb_glyph_info_t *infos; + int slen; + unsigned int i; + Evas_Font_Glyph_Info *gl_itr; + Evas_Font_OT_Info *ot_itr; + Evas_Coord pen_x = 0; + + fi = props->font_instance; + + if (len < 0) + { + slen = eina_unicode_strlen(text); + } + else + { + slen = len; + } + + buffer = hb_buffer_create(); + hb_buffer_set_unicode_funcs(buffer, _evas_common_font_ot_unicode_funcs_get()); + hb_buffer_set_language(buffer, hb_language_from_string( + evas_common_language_from_locale_get(), -1)); + hb_buffer_set_script(buffer, _evas_script_to_harfbuzz[props->script]); + hb_buffer_set_direction(buffer, + (props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) ? + HB_DIRECTION_RTL : HB_DIRECTION_LTR); + /* FIXME: add run-time conversions if needed, which is very unlikely */ + hb_buffer_add_utf32(buffer, (const uint32_t *) text, slen, 0, slen); + + _evas_common_font_ot_shape(buffer, fi); + + props->len = hb_buffer_get_length(buffer); + props->info->ot = calloc(props->len, + sizeof(Evas_Font_OT_Info)); + props->info->glyph = calloc(props->len, + sizeof(Evas_Font_Glyph_Info)); + positions = hb_buffer_get_glyph_positions(buffer, NULL); + infos = hb_buffer_get_glyph_infos(buffer, NULL); + gl_itr = props->info->glyph; + ot_itr = props->info->ot; + for (i = 0 ; i < props->len ; i++) + { + Evas_Coord adv; + ot_itr->source_cluster = infos->cluster; + ot_itr->x_offset = positions->x_offset; + ot_itr->y_offset = positions->y_offset; + gl_itr->index = infos->codepoint; + adv = positions->x_advance; + + pen_x += adv; + gl_itr->pen_after = EVAS_FONT_ROUND_26_6_TO_INT(pen_x); + + ot_itr++; + gl_itr++; + infos++; + positions++; + } + + hb_buffer_destroy(buffer); + evas_common_font_int_use_trim(); + + return EINA_FALSE; +} + +#endif + diff --git a/libraries/evas/src/lib/engines/common/evas_font_ot.h b/libraries/evas/src/lib/engines/common/evas_font_ot.h new file mode 100644 index 0000000..bc5ab02 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_ot.h @@ -0,0 +1,45 @@ +#ifndef _EVAS_FONT_OT_H +# define _EVAS_FONT_OT_H + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# ifdef HAVE_HARFBUZZ +# define OT_SUPPORT +# define USE_HARFBUZZ +# endif + +# ifdef OT_SUPPORT +# include +typedef struct _Evas_Font_OT_Info Evas_Font_OT_Info; +# else +typedef void *Evas_Font_OT_Info; +# endif + +# include "Evas.h" + +# ifdef OT_SUPPORT +struct _Evas_Font_OT_Info +{ + size_t source_cluster; + Evas_Coord x_offset; + Evas_Coord y_offset; +}; +# endif + +# ifdef OT_SUPPORT +# define EVAS_FONT_OT_X_OFF_GET(a) ((a).x_offset) +# define EVAS_FONT_OT_Y_OFF_GET(a) ((a).y_offset) +# define EVAS_FONT_OT_POS_GET(a) ((a).source_cluster) +# endif + +# include "evas_text_utils.h" +EAPI int +evas_common_font_ot_cluster_size_get(const Evas_Text_Props *props, size_t char_index); + +EAPI Eina_Bool +evas_common_font_ot_populate_text_props(const Eina_Unicode *text, + Evas_Text_Props *props, int len); +#endif + diff --git a/libraries/evas/src/lib/engines/common/evas_font_private.h b/libraries/evas/src/lib/engines/common/evas_font_private.h new file mode 100644 index 0000000..eed3faf --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_private.h @@ -0,0 +1,52 @@ +#ifndef _EVAS_FONT_PRIVATE_H +# define _EVAS_FONT_PRIVATE_H +#include "evas_font_ot.h" + +#ifdef BUILD_PTHREAD +extern LK(lock_font_draw); // for freetype2 API calls +extern LK(lock_bidi); // for fribidi API calls +extern LK(lock_ot); // for harfbuzz calls +#endif + +# if defined(EVAS_FRAME_QUEUING) || defined(BUILD_PIPE_RENDER) +# define FTLOCK() LKL(lock_font_draw) +# define FTUNLOCK() LKU(lock_font_draw) + +# define BIDILOCK() LKL(lock_bidi) +# define BIDIUNLOCK() LKU(lock_bidi) + +# define OTLOCK() LKL(lock_ot) +# define OTUNLOCK() LKU(lock_ot) +# else +# define FTLOCK(x) +# define FTUNLOCK(x) + +# define BIDILOCK() +# define BIDIUNLOCK() + +/* Macros for text walking */ +# define OTLOCK() +# define OTUNLOCK() +# endif + +void evas_common_font_source_unload(RGBA_Font_Source *fs); +void evas_common_font_source_reload(RGBA_Font_Source *fs); + +void evas_common_font_int_promote(RGBA_Font_Int *fi); +void evas_common_font_int_use_increase(int size); +void evas_common_font_int_use_trim(void); +void evas_common_font_int_unload(RGBA_Font_Int *fi); +void evas_common_font_int_reload(RGBA_Font_Int *fi); + +/* 6th bit is on is the same as frac part >= 0.5 */ +# define EVAS_FONT_ROUND_26_6_TO_INT(x) \ + (((x + 0x20) & -0x40) >> 6) + +# define EVAS_FONT_CHARACTER_IS_INVISIBLE(x) ( \ + ((0x200C <= (x)) && ((x) <= 0x200D)) || /* ZWNJ..ZWH */ \ + ((0x200E <= (x)) && ((x) <= 0x200F)) || /* BIDI stuff */ \ + ((0x202A <= (x)) && ((x) <= 0x202E)) /* BIDI stuff */ \ + ) + +# include "evas_font_default_walk.x" +#endif /* !_EVAS_FONT_PRIVATE_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_font_query.c b/libraries/evas/src/lib/engines/common/evas_font_query.c new file mode 100644 index 0000000..af2cc84 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_font_query.c @@ -0,0 +1,789 @@ +#include "evas_common.h" +#include "language/evas_bidi_utils.h" /*defines BIDI_SUPPORT if possible */ +#include "evas_font_private.h" /* for Frame-Queuing support */ +#include "evas_font_ot.h" + + +/* FIXME: Check coverage according to the font and not by actually loading */ +/** + * @internal + * Find the end of a run according to font coverage, and return the base script + * font and the current wanted font. + * + * @param[in] fn the font to use. + * @param script_fi The base font instance to be used with the script. If NULL, then it's calculated and returned in this variable, if not NULL, it's used and not modified. + * @param[out] cur_fi The font instance found for the current run. + * @param[in] script the base script + * @param[in] text the text to work on. + * @param[in] run_let the current run len, i.e "search limit". + * @return length of the run found. + */ +EAPI int +evas_common_font_query_run_font_end_get(RGBA_Font *fn, RGBA_Font_Int **script_fi, RGBA_Font_Int **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len) +{ + RGBA_Font_Int *fi = NULL; + const Eina_Unicode *run_end = text + run_len; + const Eina_Unicode *itr; + + /* If there's no current script_fi, find it first */ + if (!*script_fi) + { + const Eina_Unicode *base_char = NULL; + /* Skip common chars */ + for (base_char = text ; + (base_char < run_end) && + (evas_common_language_char_script_get(*base_char) != script) ; + base_char++) + ; + if (base_char == run_end) base_char = text; + + /* Find the first renderable char */ + while (base_char < run_end) + { + /* 0x1F is the last ASCII contral char, just a hack in + * the meanwhile. */ + if ((*base_char > 0x1F) && + evas_common_font_glyph_search(fn, &fi, *base_char)) + break; + base_char++; + } + + + /* If everything else fails, at least try to find a font for the + * replacement char */ + if (base_char == run_end) + evas_common_font_glyph_search(fn, &fi, REPLACEMENT_CHAR); + + if (!fi) + fi = fn->fonts->data; + + *script_fi = fi; + } + else + { + fi = *script_fi; + } + + /* Find the longest run of the same font starting from the start position + * and update cur_fi accordingly. */ + itr = text; + while (itr < run_end) + { + RGBA_Font_Int *tmp_fi; + /* Itr will end up being the first of the next run */ + for ( ; itr < run_end ; itr++) + { + /* 0x1F is the last ASCII contral char, just a hack in + * the meanwhile. */ + if (*itr <= 0x1F) + continue; + /* Break if either it's not in the font, or if it is in the + * script's font. */ + if (fi == *script_fi) + { + if (!evas_common_get_char_index(fi, *itr)) + break; + } + else + { + if (evas_common_get_char_index(*script_fi, *itr)) + break; + } + } + + /* Abort if we reached the end */ + if (itr == run_end) + break; + + /* If the script font doesn't fit even one char, find a new font. */ + if (itr == text) + { + /* If we can find a font, use it. Otherwise, find the first + * char the run of chars that can't be rendered until the first + * one that can. */ + if (evas_common_font_glyph_search(fn, &tmp_fi, *itr)) + { + fi = tmp_fi; + } + else + { + itr++; + /* Go through all the chars that can't be rendered with any + * font */ + for ( ; itr < run_end ; itr++) + { + tmp_fi = fi; + if (evas_common_get_char_index(fi, *itr) || + evas_common_font_glyph_search(fn, &tmp_fi, *itr)) + { + fi = tmp_fi; + break; + } + } + + /* If we found a renderable character and the found font + * can render the replacement char, continue, otherwise + * find a font most suitable for the replacement char and + * break */ + if ((itr == run_end) || + !evas_common_get_char_index(fi, REPLACEMENT_CHAR)) + { + evas_common_font_glyph_search(fn, &fi, REPLACEMENT_CHAR); + break; + } + } + itr++; + } + else + { + /* If this char is not renderable by any font, but the replacement + * char can be rendered using the currentfont, continue this + * run. */ + if (!evas_common_font_glyph_search(fn, &tmp_fi, *itr) && + evas_common_get_char_index(fi, REPLACEMENT_CHAR)) + { + itr++; + } + else + { + /* Done, we did as much as possible */ + break; + } + } + } + + if (fi) + *cur_fi = fi; + else + *cur_fi = *script_fi; + + return itr - text; +} + +/** + * @internal + * Calculate the kerning between "left" and "right. + * + * @param fi the font instance to use + * @param left the left glyph index + * @param right the right glyph index + * @param[out] kerning the kerning calculated. + * @return FALSE on error, TRUE on success. + */ +EAPI int +evas_common_font_query_kerning(RGBA_Font_Int *fi, FT_UInt left, FT_UInt right, + int *kerning) +{ + int *result; + FT_Vector delta; + int key[2]; + int error = 1; + + key[0] = left; + key[1] = right; + + result = eina_hash_find(fi->kerning, key); + if (result) + { + *kerning = result[2]; + goto on_correct; + } + + /* NOTE: ft2 seems to have a bug. and sometimes returns bizarre + * values to kern by - given same font, same size and same + * prev_index and index. auto/bytecode or none hinting doesn't + * matter */ + evas_common_font_int_reload(fi); + FTLOCK(); + if (FT_Get_Kerning(fi->src->ft.face, + key[0], key[1], + FT_KERNING_DEFAULT, &delta) == 0) + { + int *push; + + FTUNLOCK(); + *kerning = delta.x; + + push = malloc(sizeof (int) * 3); + if (!push) return 1; + + push[0] = key[0]; + push[1] = key[1]; + push[2] = *kerning; + + eina_hash_direct_add(fi->kerning, push, push); + + goto on_correct; + } + + FTUNLOCK(); + error = 0; + + on_correct: + return error; +} + +/** + * @internal + * Calculate the inset of the text. Inset is the difference between the pen + * position of the first char in the string, and the first pixel drawn. + * (can be negative). + * + * @param fn the font set to use. + * @param text_props the string object. + * @return the calculated inset. + */ +EAPI int +evas_common_font_query_inset(RGBA_Font *fn __UNUSED__, const Evas_Text_Props *text_props) +{ + if (!text_props->len) return 0; + return text_props->info->glyph[text_props->start].x_bear; +} + +/** + * @internal + * Calculate the right inset of the text. This is the difference between the + * pen position of the glyph after the last glyph in the text, and the last + * pixel drawn in the text (essentially "advance - width" of the last char). + * + * @param fn the font set to use. + * @param text_props the string object. + * @return the calculated inset. + * + * @see evas_common_font_query_inset() + */ +EAPI int +evas_common_font_query_right_inset(RGBA_Font *fn __UNUSED__, const Evas_Text_Props *text_props) +{ + const Evas_Font_Glyph_Info *gli; + if (!text_props->len) return 0; + gli = text_props->info->glyph + text_props->start + text_props->len - 1; + + /* If the last char is a whitespace, we use the advance as the size, + * so the right_inset is 0. */ + if (gli->width == 0) + return 0; + + return ((gli > text_props->info->glyph) ? + gli->pen_after - (gli - 1)->pen_after : gli->pen_after) - + (gli->width + gli->x_bear +#ifdef OT_SUPPORT + + EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_X_OFF_GET( + text_props->info->ot[text_props->start + text_props->len - 1])) +#endif + ); +} + +/** + * @internal + * Calculate the size of the string (width and height). + * The width is the disntance between the first pen position and the last pixel + * drawn. + * The height is the max ascent+descent of the font. + * + * @param fn the font set to use. + * @param text_props the string object. + * @param[out] w the calculated width + * @param[out] h the calculated height + */ +EAPI void +evas_common_font_query_size(RGBA_Font *fn, const Evas_Text_Props *text_props, int *w, int *h) +{ + Evas_Coord ret_w = 0; + + if (text_props->len > 0) + { + const Evas_Font_Glyph_Info *glyph = text_props->info->glyph + + text_props->start; + const Evas_Font_Glyph_Info *last_glyph = glyph; + + if (text_props->len > 1) + { + last_glyph += text_props->len - 1; + ret_w = last_glyph[-1].pen_after; + if (text_props->start > 0) + ret_w -= glyph[-1].pen_after; + } +#ifdef OT_SUPPORT + ret_w += EVAS_FONT_ROUND_26_6_TO_INT(EVAS_FONT_OT_X_OFF_GET( + text_props->info->ot[text_props->start + text_props->len - 1])); +#endif + ret_w += last_glyph->width + last_glyph->x_bear; + } + + if (w) *w = ret_w; + if (h) *h = evas_common_font_max_ascent_get(fn) + evas_common_font_max_descent_get(fn); +} + +/** + * @internal + * Calculate the advance of the string. Advance is the distance between the + * first pen position and the pen position after the string. + * + * @param fn the font set to use. + * @param text_props the string object. + * @param[out] h_adv the calculated horizontal advance. + * @param[out] v_adv the calculated vertical advance. + */ +EAPI void +evas_common_font_query_advance(RGBA_Font *fn, const Evas_Text_Props *text_props, int *h_adv, int *v_adv) +{ + Evas_Coord ret_adv = 0; + if (text_props->len > 0) + { + const Evas_Font_Glyph_Info *glyph = text_props->info->glyph + + text_props->start; + ret_adv = glyph[text_props->len - 1].pen_after; + if (text_props->start > 0) + ret_adv -= glyph[-1].pen_after; + } + + if (h_adv) *h_adv = ret_adv; + if (v_adv) *v_adv = evas_common_font_get_line_advance(fn); +} + +/** + * @internal + * Query the coordinates of the char at position pos. If the position is at the + * end of the string (i.e where the finishing null would be) it returns the + * coordinates of the position right after the last char. This is either on + * the left or on the right of the string, depending on BiDi direction. Returned + * width in this case is 0. It returns the x of the leftmost pixel drawn. + * + * @param fn the font set to use. + * @param text_props the string object. + * @param pos the position of the char in the string object (not actual position in the string object, but the position of the source character). + * @param[out] cx the calculated x - CAN BE NULL + * @param[out] cy the calculated y - CAN BE NULL + * @param[out] cw the calculated width - CAN BE NULL + * @param[out] ch the calculated height - CAN BE NULL + * @return TRUE on success, FALSE otherwise. + * + * @see evas_common_font_query_pen_coords() + */ +EAPI int +evas_common_font_query_char_coords(RGBA_Font *fn, const Evas_Text_Props *text_props, int pos, int *cx, int *cy, int *cw, int *ch) +{ + int asc, desc; + size_t position = 0; + int ret_val = 0; + EVAS_FONT_WALK_TEXT_INIT(); + + asc = evas_common_font_max_ascent_get(fn); + desc = evas_common_font_max_descent_get(fn); + + position = pos; + /* If it's the null, choose location according to the direction. */ + if (position == text_props->text_len) + { + /* if it's rtl then the location is the left of the string, + * otherwise, the right. */ +#ifdef BIDI_SUPPORT + if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + if (cx) *cx = 0; + if (ch) *ch = asc + desc; + } + else +#endif + { + evas_common_font_query_advance(fn, text_props, cx, ch); + } + if (cy) *cy = 0; + if (cw) *cw = 0; + ret_val = 1; + goto end; + } + + Evas_Coord cluster_start = 0, last_end = 0; + int prev_cluster = -1; + int found = 0, items = 1, item_pos = 1; + int last_is_visible = 0; + EVAS_FONT_WALK_TEXT_START() + { + EVAS_FONT_WALK_TEXT_WORK(); + + if (prev_cluster != (int) EVAS_FONT_WALK_POS) + { + if (found) + { + break; + } + else + { + cluster_start = EVAS_FONT_WALK_PEN_X + + EVAS_FONT_WALK_X_OFF + + EVAS_FONT_WALK_X_BEAR; + } + } + last_is_visible = EVAS_FONT_WALK_IS_VISIBLE; + last_end = EVAS_FONT_WALK_PEN_X + EVAS_FONT_WALK_X_OFF + + EVAS_FONT_WALK_X_BEAR + EVAS_FONT_WALK_WIDTH; + /* we need to see if the char at the visual position is the char wanted */ + if ((text_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) && + (EVAS_FONT_WALK_POS <= (size_t) position) && + ((((size_t) position) < EVAS_FONT_WALK_POS_NEXT) || + (EVAS_FONT_WALK_IS_LAST))) + { + found = 1; +#ifdef OT_SUPPORT + items = evas_common_font_ot_cluster_size_get(text_props, + char_index); +#endif + item_pos = position - EVAS_FONT_WALK_POS + 1; + } + else if ((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && + ((EVAS_FONT_WALK_POS_PREV > (size_t) position) || + (EVAS_FONT_WALK_IS_FIRST)) && + (((size_t) position) >= EVAS_FONT_WALK_POS)) + { + found = 1; +#ifdef OT_SUPPORT + items = evas_common_font_ot_cluster_size_get(text_props, + char_index); +#endif + item_pos = items - (position - EVAS_FONT_WALK_POS); + } + + prev_cluster = EVAS_FONT_WALK_POS; + } + EVAS_FONT_WALK_TEXT_END(); + if (found) + { + Evas_Coord cluster_w; + cluster_w = last_end - cluster_start; + if (cy) *cy = -asc; + if (ch) *ch = asc + desc; + if (last_is_visible) + { + if (cx) *cx = cluster_start + + (cluster_w / items) * + (item_pos - 1); + if (cw) *cw = (cluster_w / items); + } + else + { + if (cx) *cx = cluster_start; + if (cw) *cw = 0; + } + ret_val = 1; + goto end; + } +end: + + return ret_val; +} + +/** + * @internal + * Query the coordinates of the char at position pos. If the position is at the + * end of the string (i.e where the finishing null would be) it returns the + * coordinates of the position right after the last char. This is either on + * the left or on the right of the string, depending on BiDi direction. Returned + * advance in this case is 0. + * + * This is the same as evas_common_font_query_char_coords() except that the + * advance of the character is returned instead of the width and the pen + * position is returned instead of the actual pixel position. + * + * @param fn the font set to use. + * @param text_props the string object. + * @param pos the position of the char in the string object (not actual position in the string object, but the position of the source character). + * @param[out] cpenx the calculated x - CAN BE NULL + * @param[out] cy the calculated y - CAN BE NULL + * @param[out] cadv the calculated advance - CAN BE NULL + * @param[out] ch the calculated height - CAN BE NULL + * @return TRUE on success, FALSE otherwise. + * + * @see evas_common_font_query_char_coords() + */ +EAPI int +evas_common_font_query_pen_coords(RGBA_Font *fn, const Evas_Text_Props *text_props, int pos, int *cpen_x, int *cy, int *cadv, int *ch) +{ + int asc, desc; + size_t position; + int ret_val = 0; + EVAS_FONT_WALK_TEXT_INIT(); + + asc = evas_common_font_max_ascent_get(fn); + desc = evas_common_font_max_descent_get(fn); + + position = pos; + /* If it's the null, choose location according to the direction. */ + if (position == text_props->text_len) + { + /* if it's rtl then the location is the left of the string, + * otherwise, the right. */ +#ifdef BIDI_SUPPORT + if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + if (cpen_x) *cpen_x = 0; + if (ch) *ch = asc + desc; + } + else +#endif + { + evas_common_font_query_advance(fn, text_props, cpen_x, ch); + } + if (cy) *cy = 0; + if (cadv) *cadv = 0; + ret_val = 1; + goto end; + } + Evas_Coord cluster_start = 0; + int prev_cluster = -1; + int found = 0, items = 1, item_pos = 1; + int last_is_visible = 0; + EVAS_FONT_WALK_TEXT_START() + { + EVAS_FONT_WALK_TEXT_WORK(); + + if (prev_cluster != (int) EVAS_FONT_WALK_POS) + { + if (found) + { + break; + } + else + { + cluster_start = EVAS_FONT_WALK_PEN_X; + } + } + last_is_visible = EVAS_FONT_WALK_IS_VISIBLE; + + if ((text_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) && + (EVAS_FONT_WALK_POS <= (size_t) position) && + ((((size_t) position) < EVAS_FONT_WALK_POS_NEXT) || + (EVAS_FONT_WALK_IS_LAST))) + { + found = 1; +#ifdef OT_SUPPORT + items = evas_common_font_ot_cluster_size_get(text_props, + char_index); +#endif + item_pos = position - EVAS_FONT_WALK_POS + 1; + } + else if ((text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && + ((EVAS_FONT_WALK_POS_PREV > (size_t) position) || + (EVAS_FONT_WALK_IS_FIRST)) && + (((size_t) position) >= EVAS_FONT_WALK_POS)) + { + found = 1; +#ifdef OT_SUPPORT + items = evas_common_font_ot_cluster_size_get(text_props, + char_index); +#endif + item_pos = items - (position - EVAS_FONT_WALK_POS); + } + + prev_cluster = EVAS_FONT_WALK_POS; + } + EVAS_FONT_WALK_TEXT_END(); + + if (found) + { + Evas_Coord cluster_adv; + cluster_adv = EVAS_FONT_WALK_PEN_X - cluster_start; + if (cy) *cy = -asc; + if (ch) *ch = asc + desc; + if (last_is_visible) + { + if (cpen_x) *cpen_x = cluster_start + + (cluster_adv / items) * + (item_pos - 1); + if (cadv) *cadv = (cluster_adv / items); + } + else + { + if (cpen_x) *cpen_x = EVAS_FONT_WALK_PEN_X; + if (cadv) *cadv = 0; + } + ret_val = 1; + goto end; + } +end: + + return ret_val; +} + +/** + * @internal + * Find the character at a specific x, y coordinates and return it's position + * in the text (not in the text object, but in the source text). Also calculate + * the char's geometry. + * + * @param fn the font set to use. + * @param text_props the string object. + * @param x the x to look at. + * @param y the y to look at. + * @param[out] cx the calculated x - CAN BE NULL + * @param[out] cy the calculated y - CAN BE NULL + * @param[out] cw the calculated width - CAN BE NULL + * @param[out] ch the calculated height - CAN BE NULL + * @return the position found, -1 on failure. + */ +EAPI int +evas_common_font_query_char_at_coords(RGBA_Font *fn, const Evas_Text_Props *text_props, int x, int y, int *cx, int *cy, int *cw, int *ch) +{ + int asc, desc; + int ret_val = -1; + EVAS_FONT_WALK_TEXT_INIT(); + + asc = evas_common_font_max_ascent_get(fn); + desc = evas_common_font_max_descent_get(fn); + Evas_Coord cluster_start = 0; + int prev_cluster = -1; + int found = 0, items = 1; + EVAS_FONT_WALK_TEXT_START() + { + EVAS_FONT_WALK_TEXT_WORK(); + if (prev_cluster != (int) EVAS_FONT_WALK_POS) + { + if (found) + { + break; + } + else + { + cluster_start = EVAS_FONT_WALK_PEN_X; + } + } + + if (!EVAS_FONT_WALK_IS_VISIBLE) continue; + + /* we need to see if the char at the visual position is the char, + * we check that by checking if it's before the current pen + * position and the next */ + if ((x >= EVAS_FONT_WALK_PEN_X) && + (x <= (EVAS_FONT_WALK_PEN_X_AFTER)) && (y >= -asc) && (y <= desc)) + { +#ifdef OT_SUPPORT + items = evas_common_font_ot_cluster_size_get(text_props, + char_index); +#endif + found = 1; + } + + prev_cluster = EVAS_FONT_WALK_POS; + } + EVAS_FONT_WALK_TEXT_END(); + if (found) + { + int item_pos; + Evas_Coord cluster_adv; + cluster_adv = EVAS_FONT_WALK_PEN_X - cluster_start; + + if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) + { + double part; + part = cluster_adv / items; + item_pos = (int) ((x - cluster_start) / part); + } + else + { + double part; + part = cluster_adv / items; + item_pos = items - ((int) ((x - cluster_start) / part)) - 1; + } + if (cx) *cx = EVAS_FONT_WALK_PEN_X + + ((cluster_adv / items) * (item_pos - 1)); + if (cy) *cy = -asc; + if (cw) *cw = (cluster_adv / items); + if (ch) *ch = asc + desc; + ret_val = prev_cluster + item_pos; + goto end; + } +end: + + return ret_val; +} + +/** + * @internal + * Find one after the last character that fits until the boundaries set by x + * and y. I.e find the first char that doesn't fit. + * This LOGICALLY walks the string. This is needed for wrapping for example + * where we want the first part to be the first logical part. + * + * @param fn the font set to use. + * @param text_props the string object. + * @param x the x boundary. + * @param y the y boundary. + * @return the position found, -1 on failure. + */ +EAPI int +evas_common_font_query_last_up_to_pos(RGBA_Font *fn, const Evas_Text_Props *text_props, int x, int y) +{ + int asc, desc; + int ret=-1; + + asc = evas_common_font_max_ascent_get(fn); + desc = evas_common_font_max_descent_get(fn); + +#ifdef BIDI_SUPPORT + if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + Evas_Font_Glyph_Info *gli = NULL; + Evas_Coord full_adv = 0, pen_x = 0, start_pen = 0; + int i; + + if ((text_props->info) && (text_props->len > 0)) + { + gli = text_props->info->glyph + text_props->start; + full_adv = gli[text_props->len - 1].pen_after; + if (text_props->start > 0) + { + start_pen = gli[-1].pen_after; + full_adv -= start_pen; + } + + gli += text_props->len - 1; + + for (i = text_props->len - 1 ; i >= 0 ; i--, gli--) + { + pen_x = full_adv - (gli->pen_after - start_pen); + /* If invisible, skip */ + if (gli->index == 0) continue; + if ((x >= pen_x) && + (((i == 0) && (x <= full_adv)) || + (x <= (full_adv - (gli[-1].pen_after - start_pen)))) && + (y >= -asc) && (y <= desc)) + { +#ifdef OT_SUPPORT + ret = EVAS_FONT_OT_POS_GET( + text_props->info->ot[text_props->start + i]) - + text_props->text_offset; +#else + ret = text_props->text_len - i - 1; +#endif + goto end; + } + } + } + } + else +#endif + { + EVAS_FONT_WALK_TEXT_INIT(); + /* When text is not rtl, visual direction = logical direction */ + EVAS_FONT_WALK_TEXT_START() + { + EVAS_FONT_WALK_TEXT_WORK(); + if (!EVAS_FONT_WALK_IS_VISIBLE) continue; + + if ((x >= EVAS_FONT_WALK_PEN_X) && + (x <= (EVAS_FONT_WALK_PEN_X_AFTER)) && + (y >= -asc) && (y <= desc)) + { + ret = EVAS_FONT_WALK_POS; + goto end; + } + } + EVAS_FONT_WALK_TEXT_END(); + } + +end: + + return ret; +} + diff --git a/libraries/evas/src/lib/engines/common/evas_image.h b/libraries/evas/src/lib/engines/common/evas_image.h new file mode 100644 index 0000000..300697c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_image.h @@ -0,0 +1,63 @@ +#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_image_all_unload (void); + +EAPI void evas_common_rgba_image_free (Image_Entry *ie); +EAPI void evas_common_rgba_image_unload (Image_Entry *ie); +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 (unsigned int w, unsigned int h, unsigned int alpha); +EAPI Evas_Cache_Image *evas_common_image_cache_get (void); + +EAPI void evas_common_image_set_cache (unsigned 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, int *error); +EAPI int evas_common_save_image_to_file (RGBA_Image *im, const char *file, const char *key, int quality, int compress); + +EAPI void evas_common_rgba_image_scalecache_size_set(unsigned int size); +EAPI unsigned int evas_common_rgba_image_scalecache_size_get(void); +EAPI void evas_common_rgba_image_scalecache_flush(void); +EAPI void evas_common_rgba_image_scalecache_dump(void); +EAPI void + evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, 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); +EAPI void + evas_common_rgba_image_scalecache_do(Image_Entry *ie, 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); + + +EAPI int evas_common_load_rgba_image_module_from_file (Image_Entry *im); +EAPI int evas_common_load_rgba_image_data_from_file (Image_Entry *im); +EAPI double evas_common_load_rgba_image_frame_duration_from_file(Image_Entry *im, int start_frame, int frame_num); + +void _evas_common_rgba_image_post_surface(Image_Entry *ie); + +EAPI Eina_Bool evas_common_extension_can_load_get(const char *file); + +#endif /* _EVAS_IMAGE_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_image_data.c b/libraries/evas/src/lib/engines/common/evas_image_data.c new file mode 100644 index 0000000..10b3988 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_image_data.c @@ -0,0 +1,147 @@ +#include + +#include "evas_common.h" +#include "evas_private.h" +#include "evas_image.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: + case EVAS_COLORSPACE_YCBCR422601_PL: + case EVAS_COLORSPACE_YCBCR420TM12601_PL: + case EVAS_COLORSPACE_YCBCR420NV12601_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); + _evas_common_rgba_image_post_surface(ie_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: + case EVAS_COLORSPACE_YCBCR422601_PL: + case EVAS_COLORSPACE_YCBCR420TM12601_PL: + case EVAS_COLORSPACE_YCBCR420NV12601_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); + _evas_common_rgba_image_post_surface(ie_dst); + return 0; +} + +int +evas_common_rgba_image_size_set(Image_Entry *ie_dst, const Image_Entry *ie_im, unsigned int w, unsigned int h __UNUSED__) +{ + 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) || + (im->cache_entry.space == EVAS_COLORSPACE_YCBCR422601_PL) || + (im->cache_entry.space == EVAS_COLORSPACE_YCBCR420TM12601_PL) || + (im->cache_entry.space == EVAS_COLORSPACE_YCBCR420NV12601_PL)) + { + w &= ~0x1; + dst->cs.data = calloc(1, dst->cache_entry.h * sizeof(unsigned char *) * 2); + } + + dst->flags = im->flags; + dst->cs.no_free = 0; + evas_common_image_colorspace_dirty(dst); + + _evas_common_rgba_image_post_surface(ie_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: + case EVAS_COLORSPACE_YCBCR422601_PL: + case EVAS_COLORSPACE_YCBCR420TM12601_PL: + case EVAS_COLORSPACE_YCBCR420NV12601_PL: + if (dst->image.no_free) + { + ie_dst->allocated.w = 0; + ie_dst->allocated.h = 0; +#ifdef BUILD_ASYNC_PRELOAD + ie_dst->flags.preload_done = 0; +#endif + ie_dst->flags.loaded = 0; + 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); + + _evas_common_rgba_image_post_surface(ie_dst); + return 0; +} diff --git a/libraries/evas/src/lib/engines/common/evas_image_load.c b/libraries/evas/src/lib/engines/common/evas_image_load.c new file mode 100644 index 0000000..c7eff3f --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_image_load.c @@ -0,0 +1,381 @@ +#include +#include +#include + +#include "evas_common.h" +#include "evas_private.h" +#include "evas_cs.h" + +struct ext_loader_s +{ + unsigned int length; + const char *extension; + const char *loader; +}; + +#define MATCHING(Ext, Module) \ + { sizeof (Ext), Ext, Module } + +static const struct ext_loader_s loaders[] = +{ /* map extensions to loaders to use for good first-guess tries */ + MATCHING(".png", "png"), + MATCHING(".jpg", "jpeg"), + MATCHING(".jpeg", "jpeg"), + MATCHING(".jfif", "jpeg"), + MATCHING(".eet", "eet"), + MATCHING(".edj", "eet"), + MATCHING(".eap", "eet"), + MATCHING(".edb", "edb"), + MATCHING(".xpm", "xpm"), + MATCHING(".tiff", "tiff"), + MATCHING(".tif", "tiff"), + MATCHING(".svg", "svg"), + MATCHING(".svgz", "svg"), + MATCHING(".svg.gz", "svg"), + MATCHING(".gif", "gif"), + MATCHING(".pbm", "pmaps"), + MATCHING(".pgm", "pmaps"), + MATCHING(".ppm", "pmaps"), + MATCHING(".pnm", "pmaps"), + MATCHING(".bmp", "bmp"), + MATCHING(".tga", "tga"), + MATCHING(".wbmp", "wbmp"), + MATCHING(".ico", "ico"), + MATCHING(".cur", "ico"), + MATCHING(".psd", "psd"), + MATCHING(".pdf", "generic"), + MATCHING(".ps", "generic"), + MATCHING(".xcf", "generic"), + MATCHING(".xcf.gz", "generic"), + /* RAW */ + MATCHING(".arw", "generic"), + MATCHING(".cr2", "generic"), + MATCHING(".crw", "generic"), + MATCHING(".dcr", "generic"), + MATCHING(".dng", "generic"), + MATCHING(".k25", "generic"), + MATCHING(".kdc", "generic"), + MATCHING(".erf", "generic"), + MATCHING(".mrw", "generic"), + MATCHING(".nef", "generic"), + MATCHING(".nrf", "generic"), + MATCHING(".nrw", "generic"), + MATCHING(".orf", "generic"), + MATCHING(".raw", "generic"), + MATCHING(".rw2", "generic"), + MATCHING(".pef", "generic"), + MATCHING(".raf", "generic"), + MATCHING(".sr2", "generic"), + MATCHING(".srf", "generic"), + MATCHING(".x3f", "generic"), + /* video */ + MATCHING(".264", "generic"), + MATCHING(".3g2", "generic"), + MATCHING(".3gp", "generic"), + MATCHING(".3gp2", "generic"), + MATCHING(".3gpp", "generic"), + MATCHING(".3gpp2", "generic"), + MATCHING(".3p2", "generic"), + MATCHING(".asf", "generic"), + MATCHING(".avi", "generic"), + MATCHING(".bdm", "generic"), + MATCHING(".bdmv", "generic"), + MATCHING(".clpi", "generic"), + MATCHING(".clp", "generic"), + MATCHING(".fla", "generic"), + MATCHING(".flv", "generic"), + MATCHING(".m1v", "generic"), + MATCHING(".m2v", "generic"), + MATCHING(".m2t", "generic"), + MATCHING(".m4v", "generic"), + MATCHING(".mkv", "generic"), + MATCHING(".mov", "generic"), + MATCHING(".mp2", "generic"), + MATCHING(".mp2ts", "generic"), + MATCHING(".mp4", "generic"), + MATCHING(".mpe", "generic"), + MATCHING(".mpeg", "generic"), + MATCHING(".mpg", "generic"), + MATCHING(".mpl", "generic"), + MATCHING(".mpls", "generic"), + MATCHING(".mts", "generic"), + MATCHING(".mxf", "generic"), + MATCHING(".nut", "generic"), + MATCHING(".nuv", "generic"), + MATCHING(".ogg", "generic"), + MATCHING(".ogm", "generic"), + MATCHING(".ogv", "generic"), + MATCHING(".rm", "generic"), + MATCHING(".rmj", "generic"), + MATCHING(".rmm", "generic"), + MATCHING(".rms", "generic"), + MATCHING(".rmx", "generic"), + MATCHING(".rmvb", "generic"), + MATCHING(".swf", "generic"), + MATCHING(".ts", "generic"), + MATCHING(".weba", "generic"), + MATCHING(".webm", "generic"), + MATCHING(".wmv", "generic") +}; + +static const char *loaders_name[] = +{ /* in order of most likely needed */ + "png", "jpeg", "eet", "xpm", "tiff", "gif", "svg", "pmaps", "bmp", "tga", "wbmp", "ico", "psd", "edb", "generic" +}; + +struct evas_image_foreach_loader_data +{ + Image_Entry *ie; + int *error; + Evas_Module *em; +}; + + +static Eina_Bool +_evas_image_foreach_loader(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata) +{ + Evas_Image_Load_Func *evas_image_load_func = NULL; + Evas_Module *em = data; + struct evas_image_foreach_loader_data *d = fdata; + Image_Entry *ie = d->ie; + + if (!evas_module_load(em)) return EINA_TRUE; + evas_image_load_func = em->functions; + evas_module_use(em); + *(d->error) = EVAS_LOAD_ERROR_NONE; + if (evas_image_load_func && + evas_image_load_func->file_head(ie, ie->file, ie->key, d->error) && + (*(d->error) == EVAS_LOAD_ERROR_NONE)) + { + d->em = em; + return EINA_FALSE; + } + + return EINA_TRUE; +} + +EAPI 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, *end; + Evas_Module *em; + struct stat st; + unsigned int i; + int len, ret = EVAS_LOAD_ERROR_NONE; + struct evas_image_foreach_loader_data fdata; + + +#ifdef EVAS_CSERVE + if (evas_cserve_use_get()) + { + // TODO: handle errors from server and return them? + DBG("try cserve '%s' '%s'", ie->file, ie->key ? ie->key : ""); + if (evas_cserve_image_load(ie, ie->file, ie->key, &(ie->load_opts))) + { + DBG("try cserve '%s' '%s' loaded!", + ie->file, ie->key ? ie->key : ""); + return EVAS_LOAD_ERROR_NONE; + } + } +#endif + if (stat(ie->file, &st) != 0 || S_ISDIR(st.st_mode)) + { + DBG("trying to open directory '%s' !", ie->file); + return EVAS_LOAD_ERROR_DOES_NOT_EXIST; + } + + len = strlen(ie->file); + end = ie->file + len; + for (i = 0; i < (sizeof (loaders) / sizeof(struct ext_loader_s)); i++) + { + int len2 = strlen(loaders[i].extension); + if (len2 > len) continue; + if (!strcasecmp(end - len2, loaders[i].extension)) + { + loader = loaders[i].loader; + DBG("known loader '%s' handles extension '%s' of file '%s'", + loader, end - len2, ie->file); + break; + } + } + + if (loader) + { + em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loader); + if (em) + { + DBG("found image loader '%s' (%p)", loader, em); + if (evas_module_load(em)) + { + evas_module_use(em); + evas_image_load_func = em->functions; + ret = EVAS_LOAD_ERROR_NONE; + if (evas_image_load_func->file_head(ie, ie->file, ie->key, &ret)) + { + DBG("loaded file head using module '%s' (%p): %s", + loader, em, ie->file); + goto end; + } + evas_module_unload(em); + INF("failed to load file head using module '%s' (%p): " + "%s (%s)", + loader, em, ie->file, evas_load_error_str(ret)); + } + else + WRN("failed to load module '%s' (%p)", loader, em); + } + else + INF("image loader '%s' is not enabled or missing!", loader); + } + + fdata.ie = ie; + fdata.error = &ret; + fdata.em = NULL; + ret = EVAS_LOAD_ERROR_NONE; + evas_module_foreach_image_loader(_evas_image_foreach_loader, &fdata); + em = fdata.em; + evas_image_load_func = em ? em->functions : NULL; + if (em) goto end; + + /* This is our last chance, try all known image loader. */ + /* FIXME: We could use eina recursive module search ability. */ + for (i = 0; i < sizeof (loaders_name) / sizeof (char *); i++) + { + em = evas_module_find_type(EVAS_MODULE_TYPE_IMAGE_LOADER, loaders_name[i]); + if (em) + { + if (evas_module_load(em)) + { + evas_module_use(em); + evas_image_load_func = em->functions; + ret = EVAS_LOAD_ERROR_NONE; + if (evas_image_load_func->file_head(ie, ie->file, ie->key, &ret)) + { + DBG("brute force loader '%s' (%p) worked on %s", + loaders_name[i], em, ie->file); + goto end; + } + else + INF("brute force loader '%s' (%p) failed on %s (%s)", + loaders_name[i], em, ie->file, + evas_load_error_str(ret)); + + evas_module_unload(em); + } + else + INF("failed to load module '%s' (%p)", loaders_name[i], em); + } + else + DBG("could not find module '%s'", loaders_name[i]); + } + + INF("exhausted all means to load image '%s'", ie->file); + return EVAS_LOAD_ERROR_UNKNOWN_FORMAT; + + end: + + if (ret != EVAS_LOAD_ERROR_NONE) + { + const char *modname = NULL; + int modversion = -1; + if (em && em->definition) + { + modname = em->definition->name; + modversion = em->definition->version; + } + WRN("loader '%s' (version %d) " + "handled file '%s', key '%s' with errors: %s", + modname ? modname : "", modversion, + ie->file, ie->key ? ie->key : "", + evas_load_error_str(ret)); + goto end; + } + + DBG("loader '%s' used for file %s", + (em && em->definition && em->definition->name) ? + em->definition->name : "", + ie->file); + + ie->info.module = (void*) em; + ie->info.loader = (void*) evas_image_load_func; + evas_module_ref((Evas_Module*) ie->info.module); + return ret; +} + +EAPI int +evas_common_load_rgba_image_data_from_file(Image_Entry *ie) +{ + Evas_Image_Load_Func *evas_image_load_func = NULL; + int ret = EVAS_LOAD_ERROR_NONE; + + if ((ie->flags.loaded) && (!ie->flags.animated)) return EVAS_LOAD_ERROR_GENERIC; + +#ifdef EVAS_CSERVE + if (ie->data1) + { + if (evas_cserve_image_data_load(ie)) + { + RGBA_Image *im = (RGBA_Image *)ie; + Mem *mem = ie->data2; + if (mem) + { + im->image.data = (void*) (mem->data + mem->offset); + im->image.no_free = 1; + return EVAS_LOAD_ERROR_NONE; + } + } + return EVAS_LOAD_ERROR_GENERIC; + } +#endif + + if (!ie->info.module) return EVAS_LOAD_ERROR_GENERIC; + +// printf("load data [%p] %s %s\n", ie, ie->file, ie->key); + + 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, &ret)) + { + return ret; + } + +// evas_module_unref((Evas_Module*) ie->info.module); +// ie->info.module = NULL; + + return EVAS_LOAD_ERROR_NONE; +} + +EAPI double +evas_common_load_rgba_image_frame_duration_from_file(Image_Entry *ie, const int start, const int frame_num) +{ + Evas_Image_Load_Func *evas_image_load_func = NULL; + + if (!ie->info.module) return -1; + + evas_image_load_func = ie->info.loader; + evas_module_use((Evas_Module*) ie->info.module); + if (evas_image_load_func->frame_duration) + return evas_image_load_func->frame_duration(ie, ie->file, start, frame_num); + return -1; +} + +EAPI Eina_Bool +evas_common_extension_can_load_get(const char *file) +{ + unsigned int length; + unsigned int i; + + length = eina_stringshare_strlen(file) + 1; + if (length < 5) return EINA_FALSE; + + for (i = 0; i < sizeof (loaders) / sizeof (struct ext_loader_s); ++i) + { + if (loaders[i].length > length) continue; + + if (!strcasecmp(loaders[i].extension, file + length - loaders[i].length)) + return EINA_TRUE; + } + + return EINA_FALSE; +} diff --git a/libraries/evas/src/lib/engines/common/evas_image_main.c b/libraries/evas/src/lib/engines/common/evas_image_main.c new file mode 100644 index 0000000..d4d847c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_image_main.c @@ -0,0 +1,818 @@ +#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" +#include "evas_cs.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, unsigned int w, unsigned 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, unsigned int x, unsigned int y, unsigned int w, unsigned 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); + +#if 0 +static void +_evas_common_rgba_image_debug(const char* context, Image_Entry *eim) +{ + DBG("%p = [%s] {%s,%s} %i [%i|%i]", eim, context, eim->file, eim->key, eim->references, eim->w, eim->h); +} +#endif + +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++; +//// ERR("REF++=%i", reference); + +#ifdef BUILD_LOADER_EET + eet_init(); +#endif + evas_common_scalecache_init(); +} + +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. + +// ENABLE IT AGAIN, hope it is fixed. Gustavo @ January 22nd, 2009. + evas_cache_image_shutdown(eci); + eci = NULL; + } + +#ifdef BUILD_LOADER_EET + eet_shutdown(); +#endif + evas_common_scalecache_shutdown(); +} + +EAPI void +evas_common_image_image_all_unload(void) +{ + evas_common_rgba_image_scalecache_dump(); + evas_cache_image_unload_all(eci); +} + +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; +#ifdef EVAS_FRAME_QUEUING + LKI(im->cache_entry.ref_fq_add); + LKI(im->cache_entry.ref_fq_del); + eina_condition_new(&(im->cache_entry.cond_fq_del), + &(im->cache_entry.ref_fq_del)); +#endif + + evas_common_rgba_image_scalecache_init(&im->cache_entry); + + return &im->cache_entry; +} + +static void +_evas_common_rgba_image_delete(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *)ie; + +#ifdef BUILD_PIPE_RENDER + evas_common_pipe_free(im); +# ifdef EVAS_FRAME_QUEUING + LKD(im->cache_entry.ref_fq_add); + LKD(im->cache_entry.ref_fq_del); + eina_condition_free(&(im->cache_entry.cond_fq_del)); +# endif +#endif + evas_common_rgba_image_scalecache_shutdown(&im->cache_entry); + 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)); +#ifdef EVAS_CSERVE + if (ie->data1) evas_cserve_image_free(ie); +#endif +/* + * FIXME: This doesn't seem to be needed... But I'm not sure why. + * -- nash + { + Filtered_Image *fi; + + EINA_LIST_FREE(im->filtered, fi) + { + free(fi->key); + _evas_common_rgba_image_delete((Image_Entry *)(fi->image)); + free(fi); + } + } +*/ + if (ie->frames) + { + Eina_List *l; + Image_Entry_Frame *frame; + EINA_LIST_FOREACH(ie->frames, l, frame) + { + if (frame) + { + if (frame->data) free(frame->data); + if (frame->info) free(frame->info); + free (frame); + } + } + } + free(im); +} + +EAPI void +evas_common_rgba_image_free(Image_Entry *ie) +{ + _evas_common_rgba_image_surface_delete(ie); + _evas_common_rgba_image_delete(ie); +} + +EAPI void +evas_common_rgba_image_unload(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *) ie; + + if (!ie->flags.loaded) return; + if ((!ie->info.module) && (!ie->data1)) return; + if (!ie->file) return; + + ie->flags.loaded = 0; + + 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; + +#ifdef EVAS_CSERVE + if (ie->data1) + { + evas_cserve_image_useless(ie); + im->image.data = NULL; + ie->allocated.w = 0; + ie->allocated.h = 0; + ie->flags.loaded = 0; +#ifdef BUILD_ASYNC_PRELOAD + ie->flags.preload_done = 0; +#endif + return; + } +#endif + + if (im->image.data && !im->image.no_free) + free(im->image.data); + im->image.data = NULL; + ie->allocated.w = 0; + ie->allocated.h = 0; + ie->flags.loaded = 0; +#ifdef BUILD_ASYNC_PRELOAD + ie->flags.preload_done = 0; +#endif +} + +void +_evas_common_rgba_image_post_surface(Image_Entry *ie) +{ +#ifdef HAVE_PIXMAN + RGBA_Image *im = (RGBA_Image *) ie; + + if (im->pixman.im) pixman_image_unref(im->pixman.im); + if (im->cache_entry.flags.alpha) + { + im->pixman.im = pixman_image_create_bits + ( +// FIXME: endianess determines this + PIXMAN_a8r8g8b8, +// PIXMAN_b8g8r8a8, + im->cache_entry.w, im->cache_entry.h, + im->image.data, + im->cache_entry.w * 4 + ); + } + else + { + im->pixman.im = pixman_image_create_bits + ( +// FIXME: endianess determines this + PIXMAN_x8r8g8b8, +// PIXMAN_b8g8r8x8, + im->cache_entry.w, im->cache_entry.h, + im->image.data, + im->cache_entry.w * 4 + ); + } +#else + ie = NULL; +#endif +} + +static int +_evas_common_rgba_image_surface_alloc(Image_Entry *ie, unsigned int w, unsigned int h) +{ + RGBA_Image *im = (RGBA_Image *) ie; + size_t siz = 0; + +#ifdef EVAS_CSERVE + if (ie->data1) return 0; +#endif + if (im->image.no_free) return 0; + + if (im->flags & RGBA_IMAGE_ALPHA_ONLY) + 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) 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 + _evas_common_rgba_image_post_surface(ie); + + return 0; +} + +static void +_evas_common_rgba_image_surface_delete(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *) ie; + +#ifdef HAVE_PIXMAN + if (im->pixman.im) + { + pixman_image_unref(im->pixman.im); + im->pixman.im = NULL; + } +#endif + if (ie->file) + DBG("unload: [%p] %s %s", ie, ie->file, ie->key); + 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); +#ifdef EVAS_CSERVE + else if (ie->data1) + evas_cserve_image_free(ie); +#endif + + im->image.data = NULL; + ie->allocated.w = 0; + ie->allocated.h = 0; +#ifdef BUILD_ASYNC_PRELOAD + ie->flags.preload_done = 0; +#endif + ie->flags.loaded = 0; + evas_common_rgba_image_scalecache_dirty(&im->cache_entry); +} + +static void +_evas_common_rgba_image_unload(Image_Entry *im) +{ +// DBG("unload: [%p] %s %s", im, im->file, im->key); + evas_common_rgba_image_scalecache_dirty(im); + evas_common_rgba_image_unload(im); +} + +static void +_evas_common_rgba_image_dirty_region(Image_Entry* ie, unsigned int x __UNUSED__, unsigned int y __UNUSED__, unsigned int w __UNUSED__, unsigned int h __UNUSED__) +{ + RGBA_Image *im = (RGBA_Image *) ie; + +#ifdef EVAS_CSERVE + if (ie->data1) evas_cserve_image_free(ie); +#endif + im->flags |= RGBA_IMAGE_IS_DIRTY; + evas_common_rgba_image_scalecache_dirty(&im->cache_entry); +} + +/* 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_common_rgba_image_scalecache_dirty((Image_Entry *)ie_src); + evas_common_rgba_image_scalecache_dirty(ie_dst); + 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)) + { +#ifdef EVAS_CSERVE + if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src); +#endif + return 1; + } + +#ifdef EVAS_CSERVE + if (ie_src->data1) evas_cserve_image_free((Image_Entry*) ie_src); +#endif + evas_common_image_colorspace_normalize(src); + evas_common_image_colorspace_normalize(dst); +/* evas_common_blit_rectangle(src, dst, 0, 0, src->cache_entry.w, src->cache_entry.h, 0, 0); */ +/* evas_common_cpu_end_opt(); */ + + return 0; +} + +static int +_evas_common_rgba_image_ram_usage(Image_Entry *ie) +{ + RGBA_Image *im = (RGBA_Image *)ie; + int size = sizeof(struct _RGBA_Image); + + if (ie->cache_key) size += strlen(ie->cache_key); + if (ie->file) size += strlen(ie->file); + if (ie->key) size += strlen(ie->key); + + if (im->image.data) + { +#ifdef EVAS_CSERVE + if ((!im->image.no_free) || (ie->data1)) +#else + if ((!im->image.no_free)) +#endif + size += im->cache_entry.w * im->cache_entry.h * sizeof(DATA32); + } + size += evas_common_rgba_image_scalecache_usage_get(&im->cache_entry); + return size; +} + +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] = eina_inlist_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] = eina_inlist_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(unsigned int w, unsigned 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(unsigned int w, unsigned 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->cache_entry.flags.alpha = 1; + 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_new(unsigned int w, unsigned int h, unsigned int alpha) +{ + if (alpha) + return evas_common_image_alpha_create(w, h); + return evas_common_image_create(w, h); +} + +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) + { +#ifdef EVAS_CSERVE + if (((Image_Entry *)im)->data1) evas_cserve_image_free(&im->cache_entry); +#endif + 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; + case EVAS_COLORSPACE_YCBCR422601_PL: +#ifdef BUILD_CONVERT_YUV + if ((im->image.data) && (*((unsigned char **)im->cs.data))) + evas_common_convert_yuv_422_601_rgba(im->cs.data, (DATA8*) im->image.data, + im->cache_entry.w, im->cache_entry.h); +#endif + break; + case EVAS_COLORSPACE_YCBCR420NV12601_PL: +#ifdef BUILD_CONVERT_YUV + if ((im->image.data) && (*((unsigned char **)im->cs.data))) + evas_common_convert_yuv_420_601_rgba(im->cs.data, (DATA8*) im->image.data, + im->cache_entry.w, im->cache_entry.h); +#endif + break; + case EVAS_COLORSPACE_YCBCR420TM12601_PL: +#ifdef BUILD_CONVERT_YUV + if ((im->image.data) && (*((unsigned char **)im->cs.data))) + evas_common_convert_yuv_420T_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; + evas_common_rgba_image_scalecache_dirty(&im->cache_entry); +} + +EAPI void +evas_common_image_set_cache(unsigned int size) +{ + if (eci) + 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) + { + *error = EVAS_LOAD_ERROR_GENERIC; + 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 nas = 0; + + if (!ie) return ; + if (!evas_cache_image_pixels(ie)) return ; + if (!ie->flags.alpha) return; + + nas = evas_common_convert_argb_premul(evas_cache_image_pixels(ie), ie->w * ie->h); + 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/libraries/evas/src/lib/engines/common/evas_image_private.h b/libraries/evas/src/lib/engines/common/evas_image_private.h new file mode 100644 index 0000000..1bec6c8 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_image_private.h @@ -0,0 +1,17 @@ +#ifndef _EVAS_IMAGE_PRIVATE_H +#define _EVAS_IMAGE_PRIVATE_H + +int evas_common_rgba_image_size_set (Image_Entry* dst, const Image_Entry* im, unsigned int w, unsigned int h); +int evas_common_rgba_image_from_copied_data (Image_Entry* dst, unsigned int w, unsigned int h, DATA32 *image_data, int alpha, int cspace); +int evas_common_rgba_image_from_data (Image_Entry* dst, unsigned int w, unsigned int h, DATA32 *image_data, int alpha, int cspace); +int evas_common_rgba_image_colorspace_set (Image_Entry* dst, int cspace); + +void evas_common_scalecache_init(void); +void evas_common_scalecache_shutdown(void); +void evas_common_rgba_image_scalecache_init(Image_Entry *ie); +void evas_common_rgba_image_scalecache_shutdown(Image_Entry *ie); +void evas_common_rgba_image_scalecache_dirty(Image_Entry *ie); +void evas_common_rgba_image_scalecache_orig_use(Image_Entry *ie); +int evas_common_rgba_image_scalecache_usage_get(Image_Entry *ie); + +#endif /* _EVAS_IMAGE_PRIVATE_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_image_save.c b/libraries/evas/src/lib/engines/common/evas_image_save.c new file mode 100644 index 0000000..d7484c0 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_image_save.c @@ -0,0 +1,51 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "evas_options.h" + +#include "evas_common.h" +#include "evas_private.h" + + +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/libraries/evas/src/lib/engines/common/evas_image_scalecache.c b/libraries/evas/src/lib/engines/common/evas_image_scalecache.c new file mode 100644 index 0000000..24a4f2d --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_image_scalecache.c @@ -0,0 +1,846 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_EVIL +# include +#endif + +#include + +#include "evas_common.h" +#include "evas_private.h" +#include "evas_image_private.h" + +#define SCALECACHE 1 + +#define MAX_SCALEITEMS 32 +#define MIN_SCALE_USES 3 +//#define MIN_SCALE_AGE_GAP 5000 +#define MAX_SCALECACHE_DIM 3200 +#define FLOP_ADD 4 +#define MAX_FLOP_COUNT 16 +#define FLOP_DEL 1 +#define SCALE_CACHE_SIZE 4 * 1024 * 1024 +//#define SCALE_CACHE_SIZE 0 + +typedef struct _Scaleitem Scaleitem; + +struct _Scaleitem +{ + EINA_INLIST; + unsigned long long usage; + unsigned long long usage_count; + RGBA_Image *im, *parent_im; + int src_x, src_y; + unsigned int src_w, src_h; + unsigned int dst_w, dst_h; + unsigned int flop; + unsigned int size_adjust; +#ifdef EVAS_FRAME_QUEUING + RWLK(lock); +#endif + Eina_Bool forced_unload : 1; + Eina_Bool smooth : 1; + Eina_Bool populate_me : 1; +}; + +#ifdef SCALECACHE +static unsigned long long use_counter = 0; + +#ifdef BUILD_PTHREAD +static LK(cache_lock); +#endif +static Eina_Inlist *cache_list = NULL; +static unsigned int cache_size = 0; +static int init = 0; + +static unsigned int max_cache_size = SCALE_CACHE_SIZE; +static unsigned int max_dimension = MAX_SCALECACHE_DIM; +static unsigned int max_flop_count = MAX_FLOP_COUNT; +static unsigned int max_scale_items = MAX_SCALEITEMS; +static unsigned int min_scale_uses = MIN_SCALE_USES; +#endif + +void +evas_common_scalecache_init(void) +{ +#ifdef SCALECACHE + const char *s; + + init++; + if (init > 1) return; + use_counter = 0; + LKI(cache_lock); + s = getenv("EVAS_SCALECACHE_SIZE"); + if (s) max_cache_size = atoi(s) * 1024; + s = getenv("EVAS_SCALECACHE_MAX_DIMENSION"); + if (s) max_dimension = atoi(s); + s = getenv("EVAS_SCALECACHE_MAX_FLOP_COUNT"); + if (s) max_flop_count = atoi(s); + s = getenv("EVAS_SCALECACHE_MAX_ITEMS"); + if (s) max_scale_items = atoi(s); + s = getenv("EVAS_SCALECACHE_MIN_USES"); + if (s) min_scale_uses = atoi(s); +#endif +} + +void +evas_common_scalecache_shutdown(void) +{ +#ifdef SCALECACHE + init--; + if (init ==0) + LKD(cache_lock); +#endif +} + +void +evas_common_rgba_image_scalecache_init(Image_Entry *ie) +{ +#ifdef SCALECACHE + RGBA_Image *im = (RGBA_Image *)ie; + // NOTE: this conflicts with evas image cache init and del of lock + LKI(im->cache.lock); +#endif +} + +void +evas_common_rgba_image_scalecache_shutdown(Image_Entry *ie) +{ +#ifdef SCALECACHE + RGBA_Image *im = (RGBA_Image *)ie; + evas_common_rgba_image_scalecache_dirty(ie); + // NOTE: this conflicts with evas image cache init and del of lock + LKD(im->cache.lock); +#endif +} + +void +evas_common_rgba_image_scalecache_dirty(Image_Entry *ie) +{ +#ifdef SCALECACHE + RGBA_Image *im = (RGBA_Image *)ie; + LKL(im->cache.lock); + while (im->cache.list) + { + Scaleitem *sci; + sci = im->cache.list->data; +#ifdef EVAS_FRAME_QUEUING + WRLKL(sci->lock); +#endif + im->cache.list = eina_list_remove(im->cache.list, sci); + if (sci->im) + { +// INF(" 0- %i", sci->dst_w * sci->dst_h * 4); + LKL(cache_lock); + evas_common_rgba_image_free(&sci->im->cache_entry); + if (!sci->forced_unload) + cache_size -= sci->dst_w * sci->dst_h * 4; + else + cache_size -= sci->size_adjust; + cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci); + LKU(cache_lock); + } +#ifdef EVAS_FRAME_QUEUING + RWLKU(sci->lock); + RWLKD(sci->lock); +#endif + free(sci); + } + LKU(im->cache.lock); +#endif +} + +void +evas_common_rgba_image_scalecache_orig_use(Image_Entry *ie) +{ +#ifdef SCALECACHE + RGBA_Image *im = (RGBA_Image *)ie; + LKL(im->cache.lock); + use_counter++; + // FIXME: if orig not loaded, reload + // FIXME: mark orig with current used counter + im->cache.orig_usage++; + im->cache.usage_count = use_counter; + LKU(im->cache.lock); +#endif +} + +int +evas_common_rgba_image_scalecache_usage_get(Image_Entry *ie) +{ +#ifdef SCALECACHE + RGBA_Image *im = (RGBA_Image *)ie; + int size = 0; + Eina_List *l; + Scaleitem *sci; + LKL(im->cache.lock); + EINA_LIST_FOREACH(im->cache.list, l, sci) + { + if (sci->im) size += sci->dst_w * sci->dst_h * 4; + } + LKU(im->cache.lock); + return size; +#else + return 0; +#endif +} + +#ifdef SCALECACHE +static void +_sci_fix_newest(RGBA_Image *im) +{ + Eina_List *l; + Scaleitem *sci; + + im->cache.newest_usage = 0; + im->cache.newest_usage_count = 0; + EINA_LIST_FOREACH(im->cache.list, l, sci) + { + if (sci->usage > im->cache.newest_usage) + im->cache.newest_usage = sci->usage; + if (sci->usage_count > im->cache.newest_usage_count) + im->cache.newest_usage_count = sci->usage_count; + } +// INF("_sci_fix_newest! -> %i", im->cache.newest_usage); +} + +static Scaleitem * +_sci_find(RGBA_Image *im, + RGBA_Draw_Context *dc __UNUSED__, int smooth, + int src_region_x, int src_region_y, + unsigned int src_region_w, unsigned int src_region_h, + unsigned int dst_region_w, unsigned int dst_region_h) +{ + Eina_List *l; + Scaleitem *sci; + + EINA_LIST_FOREACH(im->cache.list, l, sci) + { + if ( + (sci->src_w == src_region_w) && + (sci->src_h == src_region_h) && + (sci->dst_w == dst_region_w) && + (sci->dst_h == dst_region_h) && + (sci->src_x == src_region_x) && + (sci->src_y == src_region_y) && + (sci->smooth == smooth) + ) + { + if (im->cache.list != l) + { + im->cache.list = eina_list_remove_list(im->cache.list, l); + im->cache.list = eina_list_prepend(im->cache.list, sci); + } + return sci; + } + } + if (eina_list_count(im->cache.list) > max_scale_items) + { + l = eina_list_last(im->cache.list); + sci = l->data; +#ifdef EVAS_FRAME_QUEUING + WRLKL(sci->lock); +#endif + im->cache.list = eina_list_remove_list(im->cache.list, l); + if ((sci->usage == im->cache.newest_usage) || + (sci->usage_count == im->cache.newest_usage_count)) + _sci_fix_newest(im); + if (sci->im) + { + evas_common_rgba_image_free(&sci->im->cache_entry); + if (!sci->forced_unload) + cache_size -= sci->dst_w * sci->dst_h * 4; + else + cache_size -= sci->size_adjust; +// INF(" 1- %i", sci->dst_w * sci->dst_h * 4); + cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci); + } +#ifdef EVAS_FRAME_QUEUING + RWLKU(sci->lock); +#endif + if (max_scale_items < 1) return NULL; + } + else + { + if (max_scale_items < 1) return NULL; + + if (eina_list_count(im->cache.list) > (max_scale_items - 1)) + return NULL; + sci = calloc(1, sizeof(Scaleitem)); + sci->parent_im = im; +#ifdef EVAS_FRAME_QUEUING + RWLKI(sci->lock); +#endif + } + sci->usage = 0; + sci->usage_count = 0; + sci->populate_me = 0; + sci->smooth = smooth; + sci->forced_unload = 0; + sci->flop = 0; + sci->im = NULL; + sci->src_x = src_region_x; + sci->src_y = src_region_y; + sci->src_w = src_region_w; + sci->src_h = src_region_h; + sci->dst_w = dst_region_w; + sci->dst_h = dst_region_h; + im->cache.list = eina_list_prepend(im->cache.list, sci); + return sci; +} + +static void +_cache_prune(Scaleitem *notsci, Eina_Bool copies_only) +{ + Scaleitem *sci; + while (cache_size > max_cache_size) + { + if (!cache_list) break; + sci = (Scaleitem *)(cache_list); + if (copies_only) + { + while ((sci) && (!sci->parent_im->image.data)) + sci = (Scaleitem *)(((Eina_Inlist *)sci)->next); + if (!sci) return; + } + if (sci == notsci) return; +#ifdef EVAS_FRAME_QUEUING + WRLKL(sci->lock); +#endif + if (sci->im) + { + evas_common_rgba_image_free(&sci->im->cache_entry); + sci->im = NULL; + sci->usage = 0; + sci->usage_count = 0; + sci->flop += FLOP_ADD; + if (!sci->forced_unload) + cache_size -= sci->dst_w * sci->dst_h * 4; + else + cache_size -= sci->size_adjust; +// INF(" 2- %i", sci->dst_w * sci->dst_h * 4); + cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci); + memset(sci, 0, sizeof(Eina_Inlist)); + } +#ifdef EVAS_FRAME_QUEUING + RWLKU(sci->lock); +#endif + +// INF("FLUSH %i > %i", cache_size, max_cache_size); + } +} +#endif + +EAPI void +evas_common_rgba_image_scalecache_size_set(unsigned int size) +{ +#ifdef SCALECACHE + LKL(cache_lock); + if (size != max_cache_size) + { + max_cache_size = size; + _cache_prune(NULL, 1); + } + LKU(cache_lock); +#endif +} + +EAPI unsigned int +evas_common_rgba_image_scalecache_size_get(void) +{ +#ifdef SCALECACHE + int t; + LKL(cache_lock); + t = max_cache_size; + LKU(cache_lock); + return t; +#else + return 0; +#endif +} + +EAPI void +evas_common_rgba_image_scalecache_dump(void) +{ +#ifdef SCALECACHE + int t; + LKL(cache_lock); + t = max_cache_size; + max_cache_size = 0; + _cache_prune(NULL, 0); + max_cache_size = t; + LKU(cache_lock); +#endif +} + +EAPI void +evas_common_rgba_image_scalecache_flush(void) +{ +#ifdef SCALECACHE + int t; + LKL(cache_lock); + t = max_cache_size; + max_cache_size = 0; + _cache_prune(NULL, 1); + max_cache_size = t; + LKU(cache_lock); +#endif +} + +EAPI void +evas_common_rgba_image_scalecache_prepare(Image_Entry *ie, RGBA_Image *dst __UNUSED__, + 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 __UNUSED__, int dst_region_y __UNUSED__, + int dst_region_w, int dst_region_h) +{ +#ifdef SCALECACHE + int locked = 0; + Eina_Lock_Result ret; + RGBA_Image *im = (RGBA_Image *)ie; + Scaleitem *sci; + if (!im->image.data) return; + if ((dst_region_w == 0) || (dst_region_h == 0) || + (src_region_w == 0) || (src_region_h == 0)) return; + // was having major lock issues here - LKL was deadlocking. what was + // going on? it may have been an eina treads badness but this will stay here + // for now for debug +#if 1 + ret = LKT(im->cache.lock); + if (ret == EINA_FALSE) /* can't get image lock */ + { + useconds_t slp = 1, slpt = 0; + + while (slpt < 500000) + { +#ifdef _WIN32 + Sleep(slp / 1000); +#else + usleep(slp); +#endif + slpt += slp; + slp++; + ret = LKT(im->cache.lock); + if (ret == EINA_LOCK_DEADLOCK) + { + printf("WARNING: DEADLOCK on image %p (%s)\n", im, ie->file); + } + else + { + locked = 1; + break; + } + } + if (ret == EINA_FALSE) + { + printf("WARNING: lock still there after %i usec\n", slpt); + printf("WARNING: stucklock on image %p (%s)\n", im, ie->file); + LKDBG(im->cache.lock); + } + } + else if (ret == EINA_LOCK_DEADLOCK) + { + printf("WARNING: DEADLOCK on image %p (%s)\n", im, ie->file); + } + else locked = 1; +#endif + if (!locked) { LKL(im->cache.lock); locked = 1; } + use_counter++; + if ((src_region_w == dst_region_w) && (src_region_h == dst_region_h)) + { + // 1:1 scale. + im->cache.orig_usage++; + im->cache.usage_count = use_counter; + if (locked) LKU(im->cache.lock); + return; + } + if ((!im->cache_entry.flags.alpha) && (!smooth)) + { + // solid nearest scaling - it's actually the same speed cached or not, + // or in some cases faster not cached + im->cache.orig_usage++; + im->cache.usage_count = use_counter; + if (locked) LKU(im->cache.lock); + return; + } + LKL(cache_lock); + sci = _sci_find(im, dc, smooth, + src_region_x, src_region_y, src_region_w, src_region_h, + dst_region_w, dst_region_h); + if (!sci) + { + LKU(cache_lock); + if (locked) LKU(im->cache.lock); + return; + } +// INF("%10i | %4i %4i %4ix%4i -> %4i %4i %4ix%4i | %i", +// (int)use_counter, +// src_region_x, src_region_y, src_region_w, src_region_h, +// dst_region_x, dst_region_y, dst_region_w, dst_region_h, +// smooth); + if ((sci->usage >= min_scale_uses) + && (ie->scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC) +// && (sci->usage_count > (use_counter - MIN_SCALE_AGE_GAP)) + ) + { + if (!sci->im) + { + if ((sci->dst_w < max_dimension) && + (sci->dst_h < max_dimension)) + { + if (sci->flop <= max_flop_count) + { + sci->populate_me = 1; + im->cache.populate_count++; + } + } + } + } + sci->usage++; + sci->usage_count = use_counter; + LKU(cache_lock); + if (sci->usage > im->cache.newest_usage) + im->cache.newest_usage = sci->usage; +// INF("newset? %p %i > %i", im, +// (int)sci->usage, +// (int)im->cache.newest_usage); + if (sci->usage_count > im->cache.newest_usage_count) + im->cache.newest_usage_count = sci->usage_count; +// INF(" -------------- used %8i#, %8i@", (int)sci->usage, (int)sci->usage_count); + if (locked) LKU(im->cache.lock); +#endif +} + +#ifdef SCALECACHE +//static int pops = 0; +//static int hits = 0; +//static int misses = 0; +//static int noscales = 0; +#endif + +EAPI void +evas_common_rgba_image_scalecache_do(Image_Entry *ie, 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) +{ +#ifdef SCALECACHE + RGBA_Image *im = (RGBA_Image *)ie; + Scaleitem *sci; + int didpop = 0; + int dounload = 0; +/* + static int i = 0; + + i++; + if (i > 2000) + { + INF("p: %6i, h: %6i, m: %6i, n: %6i", + pops, hits, misses, noscales); + i = 0; + } + */ + if ((dst_region_w == 0) || (dst_region_h == 0) || + (src_region_w == 0) || (src_region_h == 0)) return; + LKL(im->cache.lock); + if ((src_region_w == dst_region_w) && (src_region_h == dst_region_h)) + { +#ifdef EVAS_FRAME_QUEUING + if (!evas_common_frameq_enabled()) +#endif + { + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); + } +// noscales++; + LKU(im->cache.lock); + if (im->image.data) + { + evas_common_scale_rgba_in_to_out_clip_sample(im, 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; + } + LKL(cache_lock); + sci = _sci_find(im, dc, smooth, + src_region_x, src_region_y, src_region_w, src_region_h, + dst_region_w, dst_region_h); + LKU(cache_lock); + if (!sci) + { +#ifdef EVAS_FRAME_QUEUING + if (!evas_common_frameq_enabled()) +#endif + { + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); + } +// misses++; + LKU(im->cache.lock); + if (im->image.data) + { + if (smooth) + evas_common_scale_rgba_in_to_out_clip_smooth(im, 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 + evas_common_scale_rgba_in_to_out_clip_sample(im, 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; + } + if (sci->populate_me) + { + int size, osize, used; + + size = dst_region_w * dst_region_h; + if (((((dst_region_w > 640) || (dst_region_h > 640)) && + (size > (480 * 480))) || + (ie->scale_hint == EVAS_IMAGE_SCALE_HINT_STATIC)) && + (ie->scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC)) + { + Eina_List *l; + Scaleitem *sci2; + + dounload = 1; + osize = sci->parent_im->cache_entry.w * sci->parent_im->cache_entry.h; + used = 0; + EINA_LIST_FOREACH(im->cache.list, l, sci2) + { + if (sci2->im) used += sci2->dst_w * sci2->dst_h; + } + if ((size < osize) && (used == 0)) + sci->size_adjust = 0; + else + { + osize -= used; + if (osize < 0) osize = 0; + size -= osize; + sci->size_adjust = size * 4; + } + } + else + { + size *= sizeof(DATA32); + if ((cache_size + size) > max_cache_size) + { + sci->populate_me = 0; + im->cache.populate_count--; + } + } + } + if (sci->populate_me) + { +// INF("##! populate!"); + sci->im = evas_common_image_new + (dst_region_w, dst_region_h, im->cache_entry.flags.alpha); + if (sci->im) + { + static RGBA_Draw_Context *ct = NULL; + + LKL(cache_lock); + im->cache.orig_usage++; + im->cache.usage_count = use_counter; + im->cache.populate_count--; +// pops++; + if (!ct) + { + // FIXME: static ct - never can free on shutdown? not a leak + // or real harm - just annoying valgrind bitch + ct = evas_common_draw_context_new(); + evas_common_draw_context_set_render_op(ct, _EVAS_RENDER_COPY); + } + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); + if (im->image.data) + { + if (smooth) + evas_common_scale_rgba_in_to_out_clip_smooth + (im, sci->im, ct, + src_region_x, src_region_y, + src_region_w, src_region_h, + 0, 0, + dst_region_w, dst_region_h); + else + evas_common_scale_rgba_in_to_out_clip_sample + (im, sci->im, ct, + src_region_x, src_region_y, + src_region_w, src_region_h, + 0, 0, + dst_region_w, dst_region_h); + sci->populate_me = 0; +#if 0 // visual debug of cached images + { + int xx, yy; + DATA32 *pp; + + pp = sci->im->image.data; + for (yy = 0; yy < dst_region_h; yy++) + { + + for (xx = 0; xx < dst_region_w; xx++) + { + if (yy & 0x1) + { + if (xx & 0x1) *pp = 0x882288ff; + } + else + { + if (!(xx & 0x1)) *pp = 0x882288ff; + } + pp++; + } + } + } +#endif + } + if (dounload) + { + sci->forced_unload = 1; + cache_size += sci->size_adjust; + } + else + { + cache_size += sci->dst_w * sci->dst_h * 4; + } +// INF(" + %i @ flop: %i (%ix%i)", +// sci->dst_w * sci->dst_h * 4, sci->flop, +// sci->dst_w, sci->dst_h); + cache_list = eina_inlist_append(cache_list, (Eina_Inlist *)sci); + _cache_prune(sci, 0); + LKU(cache_lock); + didpop = 1; + } + } + if (sci->im && !ie->flags.animated) + { + if (!didpop) + { + LKL(cache_lock); + cache_list = eina_inlist_remove(cache_list, (Eina_Inlist *)sci); + cache_list = eina_inlist_append(cache_list, (Eina_Inlist *)sci); + LKU(cache_lock); + } + else + { + if (sci->flop >= FLOP_DEL) sci->flop -= FLOP_DEL; + } +// INF("use cached!"); +#ifdef EVAS_FRAME_QUEUING + RDLKL(sci->lock); +#endif + LKU(im->cache.lock); + evas_common_scale_rgba_in_to_out_clip_sample + (sci->im, dst, dc, + 0, 0, + dst_region_w, dst_region_h, + dst_region_x, dst_region_y, + dst_region_w, dst_region_h); +#ifdef EVAS_FRAME_QUEUING + RWLKU(sci->lock); +#endif +// hits++; +// INF("check %p %i < %i", +// im, +// (int)im->cache.orig_usage, +// (int)im->cache.newest_usage); +#ifndef EVAS_FRAME_QUEUING + /* while framequeuing is applied, + * original image data is loaded by the main thread + * just before enqueuing the rendering op into the pipe. + * so unloading the original image data here + * causes only speed-down side-effect and no memory usage gain; + * it will be loaded again for the very next rendering for this image. + */ + if (ie->scale_hint != EVAS_IMAGE_SCALE_HINT_DYNAMIC) + { + if ((dounload) || + ((im->cache_entry.flags.loaded) && + ((!im->cs.no_free) +#ifdef EVAS_CSERVE + || (ie->data1) +#endif + ) && + (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888))) + { + if ((dounload) || (im->cache.orig_usage < + (im->cache.newest_usage / 20))) + { + //FIXME: imagedataunload - inform owners + evas_common_rgba_image_unload(&im->cache_entry); + } + } + } +#endif + } + else + { +#ifdef EVAS_FRAME_QUEUING + if (!evas_common_frameq_enabled()) +#endif + { + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); + } +// misses++; + LKU(im->cache.lock); + if (im->image.data) + { + if (smooth) + evas_common_scale_rgba_in_to_out_clip_smooth(im, 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 + evas_common_scale_rgba_in_to_out_clip_sample(im, 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 + RGBA_Image *im = (RGBA_Image *)ie; +#ifdef EVAS_FRAME_QUEUING + if (!evas_common_frameq_enabled()) +#endif + { + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); + } + if (im->image.data) + { + if (smooth) + evas_common_scale_rgba_in_to_out_clip_smooth(im, 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 + evas_common_scale_rgba_in_to_out_clip_sample(im, 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 +} diff --git a/libraries/evas/src/lib/engines/common/evas_line.h b/libraries/evas/src/lib/engines/common/evas_line.h new file mode 100644 index 0000000..9d45e3d --- /dev/null +++ b/libraries/evas/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/libraries/evas/src/lib/engines/common/evas_line_main.c b/libraries/evas/src/lib/engines/common/evas_line_main.c new file mode 100644 index 0000000..04401cb --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_line_main.c @@ -0,0 +1,678 @@ +#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) \ + ( x > 0 && y > 0 &&((unsigned)(x) < (unsigned)(w)) && ((unsigned)(y) < (unsigned)(h)) ) + +#define IN_RECT(x, y, rx, ry, rw, rh) \ + ( ((unsigned)((x) - (rx)) < (unsigned)(rw)) && \ + ((unsigned)((y) - (ry)) < (unsigned)(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 (dy > 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 - (by - y0); + y0 = by; + if (x0 > rx) return; + if (x0 < lx) + { + y0 = y0 - (lx - x0); + x0 = lx; + if ((y0 < ty) || (y0 > by)) return; + } + } + if (!p1_in) + { + x1 = x0 - (ty - y0); + y1 = ty; + if (x1 < lx) return; + if (x1 > rx) + { + y1 = y0 - (rx - x0); + x1 = rx; + 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 < 0)) \ + 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; + } + if (!p0_in) + { + if (py < 0) goto next_x; + } +#ifdef EVAS_SLI + if (((py) % dc->sli.h) == dc->sli.y) +#endif + { + if (IN_RANGE(px, py, clw, clh)) + pfunc(0, 255, color, p); + } + next_x: + 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; + } + if (!p0_in) + { + if (px < 0) goto next_y; + } +#ifdef EVAS_SLI + if (((py) % dc->sli.h) == dc->sli.y) +#endif + { + if (IN_RANGE(px, py, clw, clh)) + pfunc(0, 255, color, p); + } + next_y: + 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 = evas_cache_image_pixels(&dst->cache_entry); + 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 < 0) && (dely < 0)) return; + if ((py > by) && (dely > 0)) return; + } + if (!p0_in) + { + if (py < 0) goto next_x; + } + if (px < clw) + { + aa = ((yy - (y << 16)) >> 8); + if ((py) < clh) + pfunc(0, 255 - aa, color, p); + if ((py + 1) < clh) + pfunc(0, aa, color, p + dstw); + } + + next_x: + 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 < 0) && (delx < 0)) return; + if ((px > rx) && (delx > 0)) return; + } + if (!p0_in) + { + if (px < 0) goto next_y; + } + if (py < clh) + { + aa = ((xx - (x << 16)) >> 8); + if ((px) < clw) + pfunc(0, 255 - aa, color, p); + if ((px + 1) < clw) + pfunc(0, aa, color, p + 1); + } + next_y: + xx += dxx; + py++; + p += dstw; + } +} diff --git a/libraries/evas/src/lib/engines/common/evas_map_image.c b/libraries/evas/src/lib/engines/common/evas_map_image.c new file mode 100644 index 0000000..502b2dc --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_map_image.c @@ -0,0 +1,432 @@ +#include "evas_common.h" +#include "evas_blend_private.h" + +#ifdef BUILD_SCALE_SMOOTH +# ifdef BUILD_MMX +# undef SCALE_USING_MMX +# define SCALE_USING_MMX +# endif +#endif + +#define FPI 8 +#define FPI1 (1 << (FPI)) +#define FPIH (1 << (FPI - 1)) + +#define FPFPI1 (1 << (FP + FPI)) + +typedef struct _Line Line; +typedef struct _Span Span; + +struct _Span +{ + int x1, x2; + FPc o1, o2, z1, z2; + FPc u[2], v[2]; + DATA32 col[2]; +}; + +struct _Line +{ + Span span[2]; +}; + +static FPc +_interp(int x1, int x2, int p, FPc u1, FPc u2) +{ + FPc u; + + x2 -= x1; + p -= x1; + u = u2 - u1; + u = (u * p) / (x2 + 1); + // FIXME: do z persp + return u1 + u; +} + +static DATA32 +_interp_col(int x1, int x2, int p, DATA32 col1, DATA32 col2) +{ + x2 -= x1; + p -= x1; + p = (p << 8) / (x2 + 1); + // FIXME: do z persp + return INTERP_256(p, col2, col1); +} + +static void +_limit(Span *s, int c1, int c2, int nocol) +{ + if (s->x1 < c1) + { + s->u[0] = _interp(s->x1, s->x2, c1, s->u[0], s->u[1]); + s->v[0] = _interp(s->x1, s->x2, c1, s->v[0], s->v[1]); + if (!nocol) + s->col[0] = _interp_col(s->x1, s->x2, c1, s->col[0], s->col[1]); + s->x1 = c1; + s->o1 = c1 << FP; + // FIXME: do s->z1 + } + if (s->x2 > c2) + { + s->u[1] = _interp(s->x1, s->x2, c2, s->u[0], s->u[1]); + s->v[1] = _interp(s->x1, s->x2, c2, s->v[0], s->v[1]); + if (!nocol) + s->col[1] = _interp_col(s->x1, s->x2, c2, s->col[0], s->col[1]); + s->x2 = c2; + s->o2 = c2 << FP; + // FIXME: do s->z2 + } +} + +// 12.63 % of time - this can improve +static void +_calc_spans(RGBA_Map_Point *p, Line *spans, int ystart, int yend, int cx, int cy __UNUSED__, int cw, int ch __UNUSED__) +{ + int i, y, yp, yy; + int py[4]; + int edge[4][4], edge_num, swapped, order[4]; + FPc uv[4][2], u, v, x, h, t, uu, vv; + DATA32 col[4]; + +#if 1 // maybe faster on x86? + for (i = 0; i < 4; i++) py[i] = p[i].y >> FP; +# define PY(x) (py[x]) +#else +# define PY(x) (p[x].y >> FP) +#endif + + if ((PY(0) == PY(1)) && (PY(0) == PY(2)) && (PY(0) == PY(3))) + { + int leftp, rightp; + int nocol = 1; + + leftp = rightp = 0; + for (i = 1; i < 4; i++) + { + if (p[i].x < p[leftp].x) leftp = i; + if (p[i].x > p[rightp].x) rightp = i; + if (p[i].col != 0xffffffff) nocol = 0; + } + for (y = ystart; y <= yend; y++) + { + yp = y - ystart; + if (y == PY(0)) + { + i = 0; + spans[yp].span[i].x1 = p[leftp].x >> FP; + spans[yp].span[i].o1 = p[leftp].x; + spans[yp].span[i].u[0] = p[leftp].u; + spans[yp].span[i].v[0] = p[leftp].v; + spans[yp].span[i].col[0] = p[leftp].col; + spans[yp].span[i].x2 = p[rightp].x >> FP; + spans[yp].span[i].o2 = p[rightp].x; + spans[yp].span[i].u[1] = p[rightp].u; + spans[yp].span[i].v[1] = p[rightp].v; + spans[yp].span[i].col[1] = p[rightp].col; + if ((spans[yp].span[i].x1 >= (cx + cw)) || + (spans[yp].span[i].x2 < cx)) + spans[yp].span[i].x1 = -1; + else + { + _limit(&(spans[yp].span[i]), cx, cx + cw, nocol); + i++; + spans[yp].span[i].x1 = -1; + } + } + else + spans[yp].span[0].x1 = -1; + } + return; + } + for (y = ystart; y <= yend; y++) + { + int nocol = 1; + + yp = y - ystart; + edge_num = 0; + for (i = 0; i < 4; i++) + { + if ((PY(i) <= y) && (PY((i + 1) % 4) > y)) + { + edge[edge_num][0] = i; + edge[edge_num][1] = (i + 1) % 4; + edge_num++; + } + else if ((PY((i + 1) % 4) <= y) && (PY(i) > y)) + { + edge[edge_num][0] = (i + 1) % 4; + edge[edge_num][1] = i; + edge_num++; + } + if (p[i].col != 0xffffffff) nocol = 0; + } + // calculate line x points for each edge + for (i = 0; i < edge_num; i++) + { + int e1 = edge[i][0]; + int e2 = edge[i][1]; + FPc t256; + + h = (p[e2].y - p[e1].y) >> FP; // height of edge + if (h < 1) h = 1; + t = (((y << FP) + (FP1 / 2) - 1) - p[e1].y) >> FP; + x = p[e2].x - p[e1].x; + x = p[e1].x + ((x * t) / h); + +/* + // FIXME: 3d accuracy here + // XXX t needs adjusting. above its a linear interp point + // only. + // + // // FIXME: do in fixed pt. reduce divides + evas_common_cpu_end_opt(); + // + int foc = 512, z0 = 0, px = 320, py = 240; // FIXME: need from map points + // + float focf, hf; + float z1, z2, y1, y2, dz, dy, zt, dydz, yt; + + focf = foc; + hf = h; + + // adjust for fixed point and focal length and z0 for map + z1 = (p[e1].z >> FP) - z0 + foc; + z2 = (p[e2].z >> FP) - z0 + foc; + // deltas + dz = z1 - z2; + + if (dz != 0) + { + int pt; + + // adjust for perspective point (being 0 0) + y1 = (p[e1].y >> FP) - py; + y2 = (p[e2].y >> FP) - py; + + // correct for x &y not being in world coords - screen coords + y1 = (y1 * z1) / focf; + y2 = (y2 * z2) / focf; + + // deltas + dy = y1 - y2; + + yt = y - py; + dydz = dy / dz; + + zt = (y2 - (dydz * z2)) / ((yt / focf) - dydz); + + pt = t; + t = ((z1 - zt) * hf) / dz; + } + */ + u = p[e2].u - p[e1].u; + uu = u >> FP; + if (uu < 0) uu = -uu; + if (uu == h) + { + yy = ((y << FP) - p[e1].y) >> FP; + if (u > 0) + u = p[e1].u + (yy << FP); + else + u = p[e1].u - (yy << FP) - (FP1 - 1); + } + else + { + if (u >= 0) + u = p[e1].u + ((u * t) / h); + else + u = p[e1].u + (((u * t) - (FP1 / 2)) / h); + } + + v = p[e2].v - p[e1].v; + vv = v >> FP; + if (vv < 0) vv = -vv; + if (vv == h) + { + yy = ((y << FP) - p[e1].y) >> FP; + if (v > 0) + v = p[e1].v + (yy << FP); + else + v = p[e1].v - (yy << FP) - (FP1 - 1); + } + else + { + if (v >= 0) + v = p[e1].v + ((v * t) / h); + else + v = p[e1].v + (((v * t) - (FP1 / 2)) / h); + } + + // FIXME: 3d accuracy for color too + t256 = (t << 8) / h; // maybe * 255? + col[i] = INTERP_256(t256, p[e2].col, p[e1].col); + + // FIXME: store z persp + uv[i][1] = v; + uv[i][0] = u; + edge[i][2] = x >> FP; + edge[i][3] = x; + // also fill in order + order[i] = i; + } + // sort edges from left to right - bubble. its a small list! + do + { + swapped = 0; + for (i = 0; i < (edge_num - 1); i++) + { + if (edge[order[i]][2] > edge[order[i + 1]][2]) + { + t = order[i]; + order[i] = order[i + 1]; + order[i + 1] = t; + swapped = 1; + } + } + } + while (swapped); + if (edge_num == 2) + { + i = 0; + spans[yp].span[i].x1 = edge[order[0]][2]; + spans[yp].span[i].o1 = edge[order[0]][3]; + spans[yp].span[i].u[0] = uv[order[0]][0]; + spans[yp].span[i].v[0] = uv[order[0]][1]; + spans[yp].span[i].col[0] = col[order[0]]; + + spans[yp].span[i].x2 = edge[order[1]][2]; + spans[yp].span[i].o2 = edge[order[1]][3]; + spans[yp].span[i].u[1] = uv[order[1]][0]; + spans[yp].span[i].v[1] = uv[order[1]][1]; + spans[yp].span[i].col[1] = col[order[1]]; + if ((spans[yp].span[i].x1 >= (cx + cw)) || + (spans[yp].span[i].x2 < cx)) + spans[yp].span[i].x1 = -1; + else + { + _limit(&(spans[yp].span[i]), cx, cx + cw, nocol); + i++; + spans[yp].span[i].x1 = -1; + } + } + else if (edge_num == 4) + { + i = 0; + spans[yp].span[i].x1 = edge[order[0]][2]; + spans[yp].span[i].u[0] = uv[order[0]][0]; + spans[yp].span[i].v[0] = uv[order[0]][1]; + spans[yp].span[i].col[0] = col[order[0]]; + + spans[yp].span[i].x2 = edge[order[1]][2]; + spans[yp].span[i].u[1] = uv[order[1]][0]; + spans[yp].span[i].v[1] = uv[order[1]][1]; + spans[yp].span[i].col[1] = col[order[1]]; + if ((spans[yp].span[i].x1 >= (cx + cw)) || + (spans[yp].span[i].x2 < cx)) + spans[yp].span[i].x1 = -1; + else + { + _limit(&(spans[yp].span[i]), cx, cx + cw, nocol); + i++; + } + spans[yp].span[i].x1 = edge[order[2]][2]; + spans[yp].span[i].u[0] = uv[order[2]][0]; + spans[yp].span[i].v[0] = uv[order[2]][1]; + spans[yp].span[i].col[0] = col[order[2]]; + + spans[yp].span[i].x2 = edge[order[3]][2]; + spans[yp].span[i].u[1] = uv[order[3]][0]; + spans[yp].span[i].v[1] = uv[order[3]][1]; + spans[yp].span[i].col[1] = col[order[3]]; + if ((spans[yp].span[i].x1 >= (cx + cw)) || + (spans[yp].span[i].x2 < cx)) + spans[yp].span[i].x1 = -1; + else + { + int l = cx; + + if (i > 0) l = spans[yp].span[i - 1].x2; + _limit(&(spans[yp].span[i]), l, cx + cw, nocol); + } + } + else + spans[yp].span[0].x1 = -1; + } +} + +#ifdef BUILD_SCALE_SMOOTH +# ifdef BUILD_MMX +# undef FUNC_NAME +# define FUNC_NAME evas_common_map_rgba_internal_mmx +# undef SCALE_USING_MMX +# define SCALE_USING_MMX +# include "evas_map_image_internal.c" +# endif +# ifdef BUILD_C +# undef FUNC_NAME +# define FUNC_NAME evas_common_map_rgba_internal +# undef SCALE_USING_MMX +# include "evas_map_image_internal.c" +# endif +#endif + +EAPI void +evas_common_map_rgba(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int npoints __UNUSED__, RGBA_Map_Point *p, + int smooth, int level) +{ +#ifdef BUILD_MMX + int mmx, sse, sse2; +#endif + Cutout_Rects *rects; + Cutout_Rect *r; + int c, cx, cy, cw, ch; + int i; + + if (src->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&src->cache_entry); + evas_common_image_colorspace_normalize(src); + if (!src->image.data) return; +#ifdef BUILD_MMX + evas_common_cpu_can_do(&mmx, &sse, &sse2); +#endif + if ((!dc->cutout.rects) && (!dc->clip.use)) + { +#ifdef BUILD_MMX + if (mmx) + evas_common_map_rgba_internal_mmx(src, dst, dc, p, smooth, level); + else +#endif +#ifdef BUILD_C + evas_common_map_rgba_internal(src, dst, dc, p, smooth, level); +#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); + /* 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_map_rgba_internal_mmx(src, dst, dc, p, smooth, level); + else +#endif +#ifdef BUILD_C + evas_common_map_rgba_internal(src, dst, dc, p, smooth, level); +#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; +} diff --git a/libraries/evas/src/lib/engines/common/evas_map_image.h b/libraries/evas/src/lib/engines/common/evas_map_image.h new file mode 100644 index 0000000..a7cb8cf --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_map_image.h @@ -0,0 +1,10 @@ +#ifndef _EVAS_MAP_H +#define _EVAS_MAP_H + +EAPI void +evas_common_map_rgba(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + int npoints, RGBA_Map_Point *points, + int smooth, int level); + +#endif /* _EVAS_MAP_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_map_image_core.c b/libraries/evas/src/lib/engines/common/evas_map_image_core.c new file mode 100644 index 0000000..b9bbeb5 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_map_image_core.c @@ -0,0 +1,226 @@ +//#undef SCALE_USING_MMX +{ + if (smooth) + { + for (y = ystart; y <= yend; y++) + { + int x, w, ww; + FPc u, v, ud, vd, dv, ue, ve; + DATA32 *d, *s; +#ifdef COLMUL + FPc cv, cd; // col +# ifdef SCALE_USING_MMX + FPc cc; +#endif + DATA32 c1, c2; // col +#endif + Line *line; + +#ifdef SCALE_USING_MMX + pxor_r2r(mm0, mm0); + MOV_A2R(ALPHA_255, mm5) +#endif + + line = &(spans[y - ystart]); + for (i = 0; i < 2; i++) + { + Span *span; + + span = &(line->span[i]); + if (span->x1 >= 0) + { + long long tl; + + x = span->x1; + w = (span->x2 - x); + if (w <= 0) continue; + dv = (span->o2 - span->o1); + if (dv <= 0) continue; + + ww = w; + u = span->u[0] << FPI; + if (u < 0) u = 0; + else if (u > swp) u = swp; + v = span->v[0] << FPI; + if (v < 0) v = 0; + else if (v > shp) v = shp; + ue = span->u[1] << FPI; + if (ue < 0) ue = 0; + else if (ue > swp) ue = swp; + ve = span->v[1] << FPI; + if (ve < 0) ve = 0; + else if (ve > shp) ve = shp; + ud = (ue - u) / w; + vd = (ve - v) / w; + tl = (long long)ud * (w << FP); + tl = tl / dv; + ud = tl; + u -= (ud * (span->o1 - (span->x1 << FP))) / FP1; + + tl = (long long)vd * (w << FP); + tl = tl / dv; + vd = tl; + v -= (vd * (span->o1 - (span->x1 << FP))) / FP1; + + if (ud < 0) u += ud; + if (vd < 0) v += vd; + if (u < 0) u = 0; + else if (u >= swp) u = swp - 1; + if (v < 0) v = 0; + else if (v >= shp) v = shp - 1; + + if (direct) + d = dst->image.data + (y * dst->cache_entry.w) + x; + else + d = buf; + +#define SMOOTH 1 +#ifdef COLMUL + c1 = span->col[0]; // col + c2 = span->col[1]; // col + cv = 0; // col + cd = (255 << 16) / w; // col + + if (c1 == c2) + { + if (c1 == 0xffffffff) + { +#endif +#include "evas_map_image_loop.c" +#ifdef COLMUL + } + else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha)) + { + // all black line +# define COLBLACK 1 +# include "evas_map_image_loop.c" +# undef COLBLACK + } + else if (c1 == 0x000000) + { + // skip span + } + else + { + // generic loop +# include "evas_map_image_loop.c" + } + } + else + { +# include "evas_map_image_loop.c" + } +#endif + if (!direct) + { + d = dst->image.data; + d += (y * dst->cache_entry.w) + x; + func(buf, NULL, dc->mul.col, d, w); + } + } + else break; + } + } + } + else + { + for (y = ystart; y <= yend; y++) + { + int x, w, ww; + FPc u, v, ud, vd, ue, ve; + DATA32 *d, *s; +#ifdef COLMUL + FPc cv, cd; // col + DATA32 c1, c2; // col +#endif + Line *line; + + line = &(spans[y - ystart]); + for (i = 0; i < 2; i++) + { + Span *span; + + span = &(line->span[i]); + if (span->x1 >= 0) + { + x = span->x1; + w = (span->x2 - x); + + if (w <= 0) continue; + ww = w; + u = span->u[0] << FPI; + if (u < 0) u = 0; + else if (u > swp) u = swp; + v = span->v[0] << FPI; + if (v < 0) v = 0; + else if (v > shp) v = shp; + ue = span->u[1] << FPI; + if (ue < 0) ue = 0; + else if (ue > swp) ue = swp; + ve = span->v[1] << FPI; + if (ve < 0) ve = 0; + else if (ve > shp) ve = shp; + ud = (ue - u) / w; + vd = (ve - v) / w; + if (direct) + d = dst->image.data + (y * dst->cache_entry.w) + x; + else + d = buf; + + if (ud < 0) u += ud; + if (vd < 0) v += vd; + if (u < 0) u = 0; + else if (u >= swp) u = swp - 1; + if (v < 0) v = 0; + else if (v >= shp) v = shp - 1; + +#undef SMOOTH +#ifdef COLMUL + c1 = span->col[0]; // col + c2 = span->col[1]; // col + cv = 0; // col + cd = (255 << 16) / w; // col + + if (c1 == c2) + { + if (c1 == 0xffffffff) + { +#endif +#include "evas_map_image_loop.c" +#ifdef COLMUL + } + else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha)) + { + // all black line +# define COLBLACK 1 +# include "evas_map_image_loop.c" +# undef COLBLACK + } + else if (c1 == 0x000000) + { + // skip span + } + else + { + // generic loop +# include "evas_map_image_loop.c" + } + } + else + { + // generic loop +# include "evas_map_image_loop.c" + } +#endif + if (!direct) + { + d = dst->image.data; + d += (y * dst->cache_entry.w) + x; + func(buf, NULL, dc->mul.col, d, w); + } + } + else break; + } + } + } +} diff --git a/libraries/evas/src/lib/engines/common/evas_map_image_internal.c b/libraries/evas/src/lib/engines/common/evas_map_image_internal.c new file mode 100644 index 0000000..d60117e --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_map_image_internal.c @@ -0,0 +1,117 @@ +// 66.74 % of time +static void +FUNC_NAME(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, + RGBA_Map_Point *p, + int smooth, int level __UNUSED__) // level unused for now - for future use +{ + int i; + int c, cx, cy, cw, ch; + int ytop, ybottom, ystart, yend, y, sw, shp, swp, direct; + Line *spans; + DATA32 *buf = NULL, *sp; + RGBA_Gfx_Func func = NULL; + int havea = 0; + int havecol = 4; + + // get the clip + c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; + if (!c) + { + cx = 0; + cy = 0; + cw = dst->cache_entry.w; + ch = dst->cache_entry.h; + } + + // find y yop line and y bottom line + ytop = p[0].y; + if ((p[0].col >> 24) < 0xff) havea = 1; + if (p[0].col == 0xffffffff) havecol--; + for (i = 1; i < 4; i++) + { + if (p[i].y < ytop) ytop = p[i].y; + if ((p[i].col >> 24) < 0xff) havea = 1; + if (p[i].col == 0xffffffff) havecol--; + } + + ybottom = p[0].y; + for (i = 1; i < 4; i++) + { + if (p[i].y > ybottom) ybottom = p[i].y; + } + + // convert to screen space from fixed point + ytop = ytop >> FP; + ybottom = ybottom >> FP; + + // if its outside the clip vertical bounds - don't bother + if ((ytop >= (cy + ch)) || (ybottom < cy)) return; + + // limit to the clip vertical bounds + if (ytop < cy) ystart = cy; + else ystart = ytop; + if (ybottom >= (cy + ch)) yend = (cy + ch) - 1; + else yend = ybottom; + + // get some source image information + sp = src->image.data; + sw = src->cache_entry.w; + swp = sw << (FP + FPI); + shp = src->cache_entry.h << (FP + FPI); + + // limit u,v coords of points to be within the source image + for (i = 0; i < 4; i++) + { + if (p[i].u < 0) p[i].u = 0; + else if (p[i].u > (int)(src->cache_entry.w << FP)) + p[i].u = src->cache_entry.w << FP; + + if (p[i].v < 0) p[i].v = 0; + else if (p[i].v > (int)(src->cache_entry.h << FP)) + p[i].v = src->cache_entry.h << FP; + } + + // allocate some spans to hold out span list + spans = alloca((yend - ystart + 1) * sizeof(Line)); + if (!spans) return; + memset(spans, 0, (yend - ystart + 1) * sizeof(Line)); + + // calculate the spans list + _calc_spans(p, spans, ystart, yend, cx, cy, cw, ch); + + // walk through spans and render + + // if operation is solid, bypass buf and draw func and draw direct to dst + direct = 0; + if ((!src->cache_entry.flags.alpha) && (!dst->cache_entry.flags.alpha) && + (!dc->mul.use) && (!havea)) + { + direct = 1; + } + else + { + int pa; + + buf = alloca(cw * sizeof(DATA32)); + if (!buf) return; + pa = src->cache_entry.flags.alpha; + if (havea) src->cache_entry.flags.alpha = 1; + if (dc->mul.use) + func = evas_common_gfx_func_composite_pixel_color_span_get(src, dc->mul.col, dst, cw, dc->render_op); + else + func = evas_common_gfx_func_composite_pixel_span_get(src, dst, cw, dc->render_op); + src->cache_entry.flags.alpha = pa; + } + + if (!havecol) + { +#undef COLMUL +#include "evas_map_image_core.c" + } + else + { +#define COLMUL 1 +#include "evas_map_image_core.c" + } +} diff --git a/libraries/evas/src/lib/engines/common/evas_map_image_loop.c b/libraries/evas/src/lib/engines/common/evas_map_image_loop.c new file mode 100644 index 0000000..c434386 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_map_image_loop.c @@ -0,0 +1,116 @@ +#ifdef SMOOTH +{ + while (ww > 0) + { +# ifdef COLBLACK + *d = 0xff000000; // col +# else + FPc u1, v1, u2, v2; + FPc rv, ru; + DATA32 val1, val2, val3, val4; + + u1 = u; + if (u1 < 0) u1 = 0; + else if (u1 >= swp) u1 = swp - 1; + + v1 = v; + if (v1 < 0) v1 = 0; + else if (v1 >= shp) v1 = shp - 1; + + u2 = u1 + FPFPI1; + if (u2 >= swp) u2 = swp - 1; + + v2 = v1 + FPFPI1; + if (v2 >= shp) v2 = shp - 1; + + ru = (u >> (FP + FPI - 8)) & 0xff; + rv = (v >> (FP + FPI - 8)) & 0xff; + + s = sp + ((v1 >> (FP + FPI)) * sw) + + (u1 >> (FP + FPI)); + val1 = *s; + s = sp + ((v1 >> (FP + FPI)) * sw) + + (u2 >> (FP + FPI)); + val2 = *s; + + s = sp + ((v2 >> (FP + FPI)) * sw) + + (u1 >> (FP + FPI)); + val3 = *s; + s = sp + ((v2 >> (FP + FPI)) * sw) + + (u2 >> (FP + FPI)); + val4 = *s; +# ifdef SCALE_USING_MMX + MOV_A2R(rv, mm4); + MOV_A2R(ru, mm6); + MOV_P2R(val1, mm1, mm0); + if (val1 | val2) + { + MOV_P2R(val2, mm2, mm0); + INTERP_256_R2R(mm6, mm2, mm1, mm5); + } + MOV_P2R(val3, mm2, mm0); + if (val3 | val4) + { + MOV_P2R(val4, mm3, mm0); + INTERP_256_R2R(mm6, mm3, mm2, mm5); + } + INTERP_256_R2R(mm4, mm2, mm1, mm5); +# ifdef COLMUL + cc = cv >> 16; // col + cv += cd; // col + MOV_A2R(cc, mm2); // col + MOV_P2R(c1, mm3, mm0); // col + MOV_P2R(c2, mm4, mm0); // col + INTERP_256_R2R(mm2, mm4, mm3, mm5); // col + MUL4_SYM_R2R(mm3, mm1, mm5); // col +# endif + MOV_R2P(mm1, *d, mm0); +# else + val1 = INTERP_256(ru, val2, val1); + val3 = INTERP_256(ru, val4, val3); + val1 = INTERP_256(rv, val3, val1); // col +# ifdef COLMUL + val2 = INTERP_256((cv >> 16), c2, c1); // col + *d = MUL4_SYM(val2, val1); // col + cv += cd; // col +# else + *d = INTERP_256(rv, val3, val1); +# endif +# endif + u += ud; + v += vd; +# endif + d++; + ww--; + } +} +#else +{ + while (ww > 0) + { +# ifdef COLMUL +# ifndef COLBLACK + DATA32 val1, cval; // col +# endif +# endif +# ifdef COLBLACK + *d = 0xff000000; // col +# else + s = sp + ((v >> (FP + FPI)) * sw) + + (u >> (FP + FPI)); +# ifdef COLMUL + val1 = *s; // col + cval = INTERP_256((cv >> 16), c2, c1); // col + *d = MUL4_SYM(cval, val1); + cv += cd; // col +# else + *d = *s; +# endif + u += ud; + v += vd; +# endif + d++; + ww--; + } +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_add/Makefile.am b/libraries/evas/src/lib/engines/common/evas_op_add/Makefile.am new file mode 100644 index 0000000..78ce9fa --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/Makefile.am @@ -0,0 +1,13 @@ +MAINTAINERCLEANFILES = Makefile.in + +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/libraries/evas/src/lib/engines/common/evas_op_add/Makefile.in b/libraries/evas/src/lib/engines/common/evas_op_add/Makefile.in new file mode 100644 index 0000000..4c721f9 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/Makefile.in @@ -0,0 +1,543 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/engines/common/evas_op_add +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +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 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_add/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_add/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_.c new file mode 100644 index 0000000..ace781b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_i386.c new file mode 100644 index 0000000..f4f83a4 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_color_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_.c new file mode 100644 index 0000000..b20053c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c new file mode 100644 index 0000000..6a86f86 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_mask_color_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_.c new file mode 100644 index 0000000..4fe5a76 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c new file mode 100644 index 0000000..aa0dba1 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c new file mode 100644 index 0000000..fa382d9 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_color_i386.c @@ -0,0 +1,29 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c new file mode 100644 index 0000000..eb2b5a3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c new file mode 100644 index 0000000..8414bce --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_.c @@ -0,0 +1,37 @@ +/* add pixel x mask --> dst */ + +#ifdef BUILD_C +/* XXX: not used +static void +init_add_pixel_mask_span_funcs_c(void) +{ +} +*/ +#endif + +#ifdef BUILD_C +/* XXX: not used +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/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c new file mode 100644 index 0000000..a6309c3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add/op_add_pixel_mask_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_add_main_.c b/libraries/evas/src/lib/engines/common/evas_op_add_main_.c new file mode 100644 index 0000000..ef8b728 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_add_main_.c @@ -0,0 +1,541 @@ +#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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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/libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.am b/libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.am new file mode 100644 index 0000000..84add38 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.am @@ -0,0 +1,50 @@ +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ +op_blend_color_.c \ +op_blend_color_i386.c \ +op_blend_color_neon.c \ +op_blend_color_sse3.c \ +op_blend_mask_color_.c \ +op_blend_mask_color_i386.c \ +op_blend_mask_color_neon.c \ +op_blend_mask_color_sse3.c \ +op_blend_pixel_.c \ +op_blend_pixel_color_.c \ +op_blend_pixel_color_i386.c \ +op_blend_pixel_color_neon.c \ +op_blend_pixel_color_sse3.c \ +op_blend_pixel_i386.c \ +op_blend_pixel_mask_.c \ +op_blend_pixel_mask_i386.c \ +op_blend_pixel_mask_neon.c \ +op_blend_pixel_mask_sse3.c \ +op_blend_pixel_neon.c \ +op_blend_pixel_sse3.c + +noinst_LTLIBRARIES = libevas_engine_common_op_blend_master_sse3.la + +libevas_engine_common_op_blend_master_sse3_la_SOURCES = \ +op_blend_master_sse3.c + +libevas_engine_common_op_blend_master_sse3_la_CFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/engines/common \ +-I$(top_srcdir)/src/lib/engines/common/evas_op_blend \ +-I$(top_srcdir)/src/lib/cserve \ +-I$(top_srcdir)/src/lib/include \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@FREETYPE_CFLAGS@ @VALGRIND_CFLAGS@ \ +@PIXMAN_CFLAGS@ \ +@EET_CFLAGS@ @pthread_cflags@ \ +@WIN32_CFLAGS@ @EINA_CFLAGS@ \ +@FRIBIDI_CFLAGS@ @HARFBUZZ_CFLAGS@ \ +@PIXMAN_CFLAGS@ \ +@EVAS_SSE3_CFLAGS@ + +libevas_engine_common_op_blend_master_sse3_la_DEPENENCIES = \ +$(top_builddir)/config.h + diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.in b/libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.in new file mode 100644 index 0000000..e796ef2 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/Makefile.in @@ -0,0 +1,720 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/engines/common/evas_op_blend +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +LTLIBRARIES = $(noinst_LTLIBRARIES) +libevas_engine_common_op_blend_master_sse3_la_LIBADD = +am_libevas_engine_common_op_blend_master_sse3_la_OBJECTS = libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.lo +libevas_engine_common_op_blend_master_sse3_la_OBJECTS = \ + $(am_libevas_engine_common_op_blend_master_sse3_la_OBJECTS) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +libevas_engine_common_op_blend_master_sse3_la_LINK = $(LIBTOOL) \ + $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) \ + $(libevas_engine_common_op_blend_master_sse3_la_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(libevas_engine_common_op_blend_master_sse3_la_SOURCES) +DIST_SOURCES = \ + $(libevas_engine_common_op_blend_master_sse3_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +EXTRA_DIST = \ +op_blend_color_.c \ +op_blend_color_i386.c \ +op_blend_color_neon.c \ +op_blend_color_sse3.c \ +op_blend_mask_color_.c \ +op_blend_mask_color_i386.c \ +op_blend_mask_color_neon.c \ +op_blend_mask_color_sse3.c \ +op_blend_pixel_.c \ +op_blend_pixel_color_.c \ +op_blend_pixel_color_i386.c \ +op_blend_pixel_color_neon.c \ +op_blend_pixel_color_sse3.c \ +op_blend_pixel_i386.c \ +op_blend_pixel_mask_.c \ +op_blend_pixel_mask_i386.c \ +op_blend_pixel_mask_neon.c \ +op_blend_pixel_mask_sse3.c \ +op_blend_pixel_neon.c \ +op_blend_pixel_sse3.c + +noinst_LTLIBRARIES = libevas_engine_common_op_blend_master_sse3.la +libevas_engine_common_op_blend_master_sse3_la_SOURCES = \ +op_blend_master_sse3.c + +libevas_engine_common_op_blend_master_sse3_la_CFLAGS = \ +-I. \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/lib/engines/common \ +-I$(top_srcdir)/src/lib/engines/common/evas_op_blend \ +-I$(top_srcdir)/src/lib/cserve \ +-I$(top_srcdir)/src/lib/include \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@FREETYPE_CFLAGS@ @VALGRIND_CFLAGS@ \ +@PIXMAN_CFLAGS@ \ +@EET_CFLAGS@ @pthread_cflags@ \ +@WIN32_CFLAGS@ @EINA_CFLAGS@ \ +@FRIBIDI_CFLAGS@ @HARFBUZZ_CFLAGS@ \ +@PIXMAN_CFLAGS@ \ +@EVAS_SSE3_CFLAGS@ + +libevas_engine_common_op_blend_master_sse3_la_DEPENENCIES = \ +$(top_builddir)/config.h + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_blend/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_blend/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libevas_engine_common_op_blend_master_sse3.la: $(libevas_engine_common_op_blend_master_sse3_la_OBJECTS) $(libevas_engine_common_op_blend_master_sse3_la_DEPENDENCIES) + $(AM_V_CCLD)$(libevas_engine_common_op_blend_master_sse3_la_LINK) $(libevas_engine_common_op_blend_master_sse3_la_OBJECTS) $(libevas_engine_common_op_blend_master_sse3_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.lo: op_blend_master_sse3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevas_engine_common_op_blend_master_sse3_la_CFLAGS) $(CFLAGS) -MT libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.lo -MD -MP -MF $(DEPDIR)/libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.Tpo -c -o libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.lo `test -f 'op_blend_master_sse3.c' || echo '$(srcdir)/'`op_blend_master_sse3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.Tpo $(DEPDIR)/libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='op_blend_master_sse3.c' object='libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libevas_engine_common_op_blend_master_sse3_la_CFLAGS) $(CFLAGS) -c -o libevas_engine_common_op_blend_master_sse3_la-op_blend_master_sse3.lo `test -f 'op_blend_master_sse3.c' || echo '$(srcdir)/'`op_blend_master_sse3.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_.c new file mode 100644 index 0000000..be70065 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_.c @@ -0,0 +1,109 @@ +/* blend color -> dst */ + +#ifdef BUILD_C +static void +_op_blend_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e, a = 256 - (c >> 24); + UNROLL8_PLD_WHILE(d, l, 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 __UNUSED__, 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 __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha = 256 - (c >> 24); + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c new file mode 100644 index 0000000..a05af7d --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_i386.c @@ -0,0 +1,138 @@ +/* blend color --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 m __UNUSED__, 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 __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 m __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_neon.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_neon.c new file mode 100644 index 0000000..53b9991 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_neon.c @@ -0,0 +1,223 @@ +/* blend color --> dst */ + +#ifdef BUILD_NEON +static void +_op_blend_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e, *tmp = 0; +#define AP "B_C_DP" + asm volatile ( + ".fpu neon \n\t" + "vdup.u32 q6, %[c] \n\t" + "vmov.i8 q5, #1 \n\t" + "vmvn.u8 q7,q6 \n\t" + "vshr.u32 q7, q7, $0x18 \n\t" + "vmul.u32 q7,q5, q7 \n\t" + "bic %[e], #3 \n\t" + "bic %[d], #3 \n\t" + + AP "loopchoose: \n\t" + // If aligned already - straight to quads + "andS %[tmp], %[d],$0x1f \n\t" + "beq "AP"quadloops \n\t" + + "andS %[tmp], %[d],$0x4 \n\t" + "beq "AP"dualloop \n\t" + + // Only ever executes once, fall through to dual + AP "singleloop: \n\t" + // Use 'tmp' not 'd' + "vld1.32 d0[0], [%[d]] \n\t" + // Only touch d1 + "vmull.u8 q0, d0, d14 \n\t" + "vqrshrn.u16 d0, q0, #8 \n\t" + "vadd.u8 d0, d12, d0 \n\t" + "vst1.32 d0[0], [%[d]] \n\t" + + "add %[d], #4 \n\t" + + // Can we go the fast path? + "andS %[tmp], %[d],$0x1f \n\t" + "beq "AP"quadloops \n\t" + + AP "dualloop: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + + AP "dualloopint: \n\t" + "vldr.32 d0, [%[d]] \n\t" + "vmull.u8 q1, d0, d14 \n\t" + "vqrshrn.u16 d0, q1, #8 \n\t" + "vqadd.u8 d0, d0, d12 \n\t" + + "vstm %[d]!, {d0} \n\t" + + "ands %[tmp], %[d], $0x1f \n\t" + "bne "AP"dualloopint \n\t" + + AP "quadloops: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + "sub %[tmp],%[e],#31 \n\t" + + AP "quadloopint:\n\t" + "vldm %[d], {d0,d1,d2,d3} \n\t" + + "vmull.u8 q2, d0, d14 \n\t" + "vmull.u8 q3, d1, d15 \n\t" + "vmull.u8 q4, d2, d14 \n\t" + "vmull.u8 q5, d3, d15 \n\t" + + "vqrshrn.u16 d0, q2, #8 \n\t" + "vqrshrn.u16 d1, q3, #8 \n\t" + "vqrshrn.u16 d2, q4, #8 \n\t" + "vqrshrn.u16 d3, q5, #8 \n\t" + + "vqadd.u8 q0, q6, q0 \n\t" + "vqadd.u8 q1, q6, q1 \n\t" + + "vstm %[d]!, {d0,d1,d2,d3} \n\t" + + "cmp %[tmp], %[d]\n\t" + "bhi "AP"quadloopint\n\t" + + AP "loopout: \n\t" + "cmp %[d], %[e]\n\t" + "beq "AP"done\n\t" + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],#8 \n\t" + "blt "AP"singleloop2 \n\t" + + AP "dualloop2: \n\t" + "sub %[tmp],%[e],$0x7 \n\t" + AP "dualloop2int: \n\t" + "vldr.64 d0, [%[d]] \n\t" + "vmull.u8 q1, d0, d14 \n\t" + "vqrshrn.u16 d0, q1, #8 \n\t" + "vqadd.u8 d0, d0, d12 \n\t" + + "vstr.64 d0, [%[d]] \n\t" + + "add %[d], #8 \n\t" + "cmp %[tmp], %[d] \n\t" + "bhi "AP"dualloop2int \n\t" + + // Single ?? + "cmp %[e], %[d] \n\t" + "beq "AP"done \n\t" + + AP "singleloop2: \n\t" + "vld1.32 d0[0], [%[d]] \n\t" + "vmull.u8 q1, d0, d14 \n\t" + "vqrshrn.u16 d0, q1, #8 \n\t" + "vqadd.u8 d0, d0, d12 \n\t" + + "vst1.32 d0[0], [%[d]] \n\t" + + AP "done:\n\t" + + : // output regs + // Input + : [e] "r" (e = d + l), [d] "r" (d), [c] "r" (c), [tmp] "r" (tmp) + : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","memory" // clobbered + + ); +#undef AP + +} + +#define _op_blend_caa_dp_neon _op_blend_c_dp_neon + +#define _op_blend_c_dpan_neon _op_blend_c_dp_neon +#define _op_blend_caa_dpan_neon _op_blend_c_dpan_neon + +static void +init_blend_color_span_funcs_neon(void) +{ + op_blend_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_c_dp_neon; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_caa_dp_neon; + + op_blend_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_c_dpan_neon; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_pt_c_dp_neon(DATA32 s __UNUSED__, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) { + s = 256 - (c >> 24); + *d = c + MUL_256(s, *d); +} + +#define _op_blend_pt_caa_dp_neon _op_blend_pt_c_dp_neon + +#define _op_blend_pt_c_dpan_neon _op_blend_pt_c_dp_neon +#define _op_blend_pt_caa_dpan_neon _op_blend_pt_c_dpan_neon + +static void +init_blend_color_pt_funcs_neon(void) +{ + op_blend_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_c_dp_neon; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_caa_dp_neon; + + op_blend_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_c_dpan_neon; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_caa_dpan_neon; +} +#endif +/*-----*/ + +/* blend_rel color -> dst */ + +#ifdef BUILD_NEON +static void +_op_blend_rel_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha = 256 - (c >> 24); + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *d); + d++; + }); +} + +#define _op_blend_rel_caa_dp_neon _op_blend_rel_c_dp_neon + +#define _op_blend_rel_c_dpan_neon _op_blend_c_dpan_neon +#define _op_blend_rel_caa_dpan_neon _op_blend_caa_dpan_neon + +static void +init_blend_rel_color_span_funcs_neon(void) +{ + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_rel_c_dp_neon; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_rel_caa_dp_neon; + + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_c_dpan_neon; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_rel_pt_c_dp_neon(DATA32 s __UNUSED__, DATA8 m __UNUSED__, 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_neon _op_blend_rel_pt_c_dp_neon + +#define _op_blend_rel_pt_c_dpan_neon _op_blend_pt_c_dpan_neon +#define _op_blend_rel_pt_caa_dpan_neon _op_blend_pt_caa_dpan_neon + +static void +init_blend_rel_color_pt_funcs_neon(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_blend_rel_pt_c_dp_neon; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_rel_pt_caa_dp_neon; + + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_c_dpan_neon; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_caa_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_sse3.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_sse3.c new file mode 100644 index 0000000..64d5a86 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_color_sse3.c @@ -0,0 +1,166 @@ +/* blend color -> dst */ + +#ifdef BUILD_SSE3 + +static void +_op_blend_c_dp_sse3(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + DATA32 a = 256 - (c >> 24); + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + const __m128i a_packed = _mm_set_epi32(a, a, a, a); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + *d = c + MUL_256(a, *d); + d++; l--; + }, + { /* A4OP */ + + __m128i d0 = _mm_load_si128((__m128i *)d); + + d0 = mul_256_sse3(a_packed, d0); + d0 = _mm_add_epi32(d0, c_packed); + + _mm_store_si128((__m128i *)d, d0); + + d += 4; l -= 4; + }, + { /* A8OP */ + + __m128i d0 = _mm_load_si128((__m128i *)d); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + d0 = mul_256_sse3(a_packed, d0); + d1 = mul_256_sse3(a_packed, d1); + + d0 = _mm_add_epi32(d0, c_packed); + d1 = _mm_add_epi32(d1, c_packed); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + d += 8; l -= 8; + }) +} + +#define _op_blend_caa_dp_sse3 _op_blend_c_dp_sse3 + +#define _op_blend_c_dpan_sse3 _op_blend_c_dp_sse3 +#define _op_blend_caa_dpan_sse3 _op_blend_c_dpan_sse3 + +static void +init_blend_color_span_funcs_sse3(void) +{ + op_blend_span_funcs[SP_N][SM_N][SC][DP][CPU_SSE3] = _op_blend_c_dp_sse3; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_caa_dp_sse3; + +// FIXME: BUGGY BUGGY Core i5 750 (32bit), 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4), ello (text and rectangle) +// op_blend_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_c_dpan_sse3; + op_blend_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_caa_dpan_sse3; +} + +#define _op_blend_pt_c_dp_sse3 NULL +#define _op_blend_pt_caa_dp_sse3 _op_blend_pt_c_dp_sse3 + +#define _op_blend_pt_c_dpan_sse3 _op_blend_pt_c_dp_sse3 +#define _op_blend_pt_caa_dpan_sse3 _op_blend_pt_c_dpan_sse3 + +#define _op_blend_pt_c_dpas_sse3 _op_blend_pt_c_dp_sse3 +#define _op_blend_pt_caa_dpas_sse3 _op_blend_pt_c_dp_sse3 + +static void +init_blend_color_pt_funcs_sse3(void) +{ + op_blend_pt_funcs[SP_N][SM_N][SC][DP][CPU_SSE3] = _op_blend_pt_c_dp_sse3; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_pt_caa_dp_sse3; + + op_blend_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_pt_c_dpan_sse3; + op_blend_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_pt_caa_dpan_sse3; +} + + +/*-----*/ + +/* blend_rel color -> dst */ + +static void +_op_blend_rel_c_dp_sse3(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + int alpha = 256 - (c >> 24); + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + const __m128i alpha_packed = _mm_set_epi32(alpha, alpha, alpha, alpha); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *d); + d++; l--; + }, + { /* A4OP */ + + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i mul0 = mul_256_sse3(alpha_packed, d0); + __m128i sym0 = mul_sym_sse3(_mm_srli_epi32(d0, 24), c_packed); + + d0 = _mm_add_epi32(mul0, sym0); + + _mm_store_si128((__m128i *)d, d0); + + d += 4; l -= 4; + }, + { /* A8OP */ + + __m128i d0 = _mm_load_si128((__m128i *)d); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i mul0 = mul_256_sse3(alpha_packed, d0); + __m128i mul1 = mul_256_sse3(alpha_packed, d1); + + __m128i sym0 = mul_sym_sse3(_mm_srli_epi32(d0, 24), c_packed); + __m128i sym1 = mul_sym_sse3(_mm_srli_epi32(d1, 24), c_packed); + + d0 = _mm_add_epi32(mul0, sym0); + d1 = _mm_add_epi32(mul1, sym1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + d += 8; l -= 8; + }) +} + +#define _op_blend_rel_caa_dp_sse3 _op_blend_rel_c_dp_sse3 +#define _op_blend_rel_c_dpan_sse3 _op_blend_c_dpan_sse3 +#define _op_blend_rel_caa_dpan_sse3 _op_blend_caa_dpan_sse3 + +static void +init_blend_rel_color_span_funcs_sse3(void) +{ + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_c_dp_sse3; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_caa_dp_sse3; + + op_blend_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_c_dpan_sse3; + op_blend_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_caa_dpan_sse3; +} + +#define _op_blend_rel_pt_c_dp_sse3 NULL +#define _op_blend_rel_pt_caa_dp_sse3 _op_blend_rel_pt_c_dp_sse3 + +#define _op_blend_rel_pt_c_dpan_sse3 _op_blend_pt_c_dpan_sse3 +#define _op_blend_rel_pt_caa_dpan_sse3 _op_blend_pt_caa_dpan_sse3 + +static void +init_blend_rel_color_pt_funcs_sse3(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_pt_c_dp_sse3; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_pt_caa_dp_sse3; + + op_blend_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_pt_c_dpan_sse3; + op_blend_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_pt_caa_dpan_sse3; +} + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c new file mode 100644 index 0000000..12a0a75 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_.c @@ -0,0 +1,185 @@ +/* blend mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_blend_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha = 256 - (c >> 24); + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 a = *m; + switch(a) + { + case 0: + break; + case 255: + *d = c + MUL_256(alpha, *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 __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + *d = c; + break; + default: + alpha++; + *d = INTERP_256(alpha, 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 __UNUSED__, 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 __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 mc = MUL_SYM(*m, c); + alpha = 256 - (mc >> 24); + *d = MUL_SYM(*d >> 24, mc) + MUL_256(alpha, *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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c new file mode 100644 index 0000000..f8fe02e --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_i386.c @@ -0,0 +1,251 @@ +/* blend mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_mas_c_dp_mmx(DATA32 *s __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_neon.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_neon.c new file mode 100644 index 0000000..f5eb480 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_neon.c @@ -0,0 +1,562 @@ +#define NEONDEBUG 0 + + +#if NEONDEBUG +#define DEBUG_FNCOUNT(x) \ + do { \ + static int _foo = 0; \ + if (_foo++%10000 ==0) \ + printf("%s %+d %s: %d (%s)\n",__FILE__,__LINE__,__FUNCTION__,\ + _foo, x " optimised");\ + } while (0) +#else +#define DEBUG_FNCOUNT(x) ((void)x) +#endif + + +/* blend mask x color -> dst */ + +#ifdef BUILD_NEON +static void +_op_blend_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + + DEBUG_FNCOUNT(""); + +#define AP "blend_mas_c_dp_" + asm volatile ( + ".fpu neon \n\t" + " vdup.i32 q15, %[c] \n\t" + " vmov.i8 q14, #1 \n\t" + + // If aligned already - straight to quads + " andS %[tmp], %[d],$0xf \n\t" + " beq "AP"quadloops \n\t" + + " andS %[tmp], %[d],$0x4 \n\t" + " beq "AP"dualloop \n\t" + + AP"singleloop: \n\t" + " vld1.8 d0[0], [%[m]]! \n\t" + " vld1.32 d4[0], [%[d]] \n\t" + " vdup.u8 d0, d0[0] \n\t" + " vmull.u8 q4, d0, d30 \n\t" + " vqrshrn.u16 d12, q4, #8 \n\t" + " vmvn.u16 d14, d12 \n\t" + " vshr.u32 d16, d14, #24 \n\t" + " vmul.u32 d16, d16, d28 \n\t" + " vmull.u8 q7, d16, d4 \n\t" + " vqrshrn.u16 d0, q7, #8 \n\t" + " vqadd.u8 d0, d0, d12 \n\t" + " vst1.32 d0[0], [%[d]]! \n\t" + + // Can we go the fast path? + " andS %[tmp], %[d],$0xf \n\t" + " beq "AP"quadloops \n\t" + + AP"dualloop: \n\t" + " sub %[tmp], %[e], %[d] \n\t" + " cmp %[tmp], #16 \n\t" + " blt "AP"loopout \n\t" + + " vld1.16 d0[0], [%[m]]! \n\t" + " vldm %[d], {d4} \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmul.u32 q0, q14 \n\t" + " vmull.u8 q4, d0, d30 \n\t" + " vqrshrn.u16 d12, q4, #8 \n\t" + " vmvn.u16 d14, d12 \n\t" + " vshr.u32 d16, d14, #24 \n\t" + " vmul.u32 d16, d16, d28 \n\t" + " vmull.u8 q7, d16, d4 \n\t" + " vqrshrn.u16 d0, q7, #8 \n\t" + " vqadd.u8 q0, q0, q6 \n\t" + " vstm %[d]!, {d0} \n\t" + + AP"quadloops: \n\t" + " sub %[tmp], %[e], %[d] \n\t" + " cmp %[tmp], #16 \n\t" + " blt "AP"loopout \n\t" + + + " sub %[tmp], %[e], #15 \n\t" + + " sub %[d], #16 \n\t" + AP"fastloop:" + " add %[d], #16 \n\t" + " cmp %[tmp], %[d] \n\t" + " ble "AP"loopout \n\t" + AP"quadloopint: \n\t" + " ldr %[x], [%[m]] \n\t" + " add %[m], #4 \n\t" + " cmp %[x], #0 \n\t" + " beq "AP"fastloop \n\t" + " vmov.32 d0[0], %[x] \n\t" + " vldm %[d], {d4,d5} \n\t" + + // Expand M: Fixme: Can we do this quicker? + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmul.u32 q0, q14 \n\t" + + // Multiply a * c + " vmull.u8 q4, d0, d30 \n\t" + " vmull.u8 q5, d1, d31 \n\t" + + // Shorten + " vqrshrn.u16 d12, q4, #8 \n\t" + " vqrshrn.u16 d13, q5, #8 \n\t" + + // extract negated alpha + " vmvn.u16 q7, q6 \n\t" + " vshr.u32 q8, q7, #24 \n\t" + " vmul.u32 q8, q8, q14 \n\t" + + // Multiply + " vmull.u8 q7, d16, d4 \n\t" + " vmull.u8 q8, d17, d5 \n\t" + + " vqrshrn.u16 d0, q7, #8 \n\t" + " vqrshrn.u16 d1, q8, #8 \n\t" + + // Add + " vqadd.u8 q0, q0, q6 \n\t" + + " vstm %[d]!, {d0,d1} \n\t" + + " cmp %[tmp], %[d] \n\t" + " bhi "AP"quadloopint \n\t" + + AP"loopout: \n\t" +#if NEONDEBUG + "cmp %[d], %[e] \n\t" + "ble "AP"foo \n\t" + "cmp %[tmp], %[m] \n\t" + "sub %[x], %[x] \n\t" + "vst1.32 d0[0], [%[x]] \n\t" + AP"foo: \n\t" +#endif + + " cmp %[d], %[e] \n\t" + " beq "AP"done \n\t" + " sub %[tmp],%[e], %[d] \n\t" + " cmp %[tmp],#4 \n\t" + " beq "AP"singleout \n\t" + + AP "dualloop2: \n\t" + "sub %[tmp],%[e],$0x8 \n\t" + " vld1.16 d0[0], [%[m]]! \n\t" + " vldm %[d], {d4} \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmul.u32 q0, q14 \n\t" + " vmull.u8 q4, d0, d30 \n\t" + " vqrshrn.u16 d12, q4, #8 \n\t" + " vmvn.u16 d14, d12 \n\t" + " vshr.u32 d16, d14, #24 \n\t" + " vmul.u32 d16, d16, d28 \n\t" + " vmull.u8 q7, d16, d4 \n\t" + " vqrshrn.u16 d0, q7, #8 \n\t" + " vqadd.u8 q0, q0, q6 \n\t" + " vstm %[d]!, {d0} \n\t" + + " cmp %[e], %[d] \n\t" + " beq "AP"done \n\t" + + AP"singleout: \n\t" + " vld1.8 d0[0], [%[m]]! \n\t" + " vld1.32 d4[0], [%[d]] \n\t" + " vdup.u8 d0, d0[0] \n\t" + " vmull.u8 q4, d0, d30 \n\t" + " vqrshrn.u16 d12, q4, #8 \n\t" + " vmvn.u16 d14, d12 \n\t" + " vshr.u32 d16, d14, #24 \n\t" + " vmul.u32 d16, d16, d28 \n\t" + " vmull.u8 q7, d16, d4 \n\t" + " vqrshrn.u16 d0, q7, #8 \n\t" + " vqadd.u8 q0, q0, q6 \n\t" + " vst1.32 d0[0], [%[d]]! \n\t" + + AP"done: \n\t" +#if NEONDEBUG + "cmp %[d], %[e] \n\t" + "beq "AP"reallydone \n\t" + "sub %[tmp], %[tmp] \n\t" + "vst1.32 d0[0], [%[tmp]] \n\t" + AP"reallydone:" +#endif + : // Out + : [e] "r" (d + l), [d] "r" (d), [c] "r" (c), + [tmp] "r" (7), [m] "r" (m), [x] "r" (0) + : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","q8","q14","q15", + "memory" // clobbered + ); +#undef AP +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_mas_can_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e,*tmp; + int alpha; + + DEBUG_FNCOUNT(""); + +#define AP "_blend_mas_can_dp_neon_" + asm volatile ( + ".fpu neon \n\t" + "vdup.u32 q9, %[c] \n\t" + "vmov.i8 q15, #1 \n\t" + "vmov.i8 q14, #0 \n\t" + + // Make C 16 bit (C in q3/q2) + "vmovl.u8 q3, d19 \n\t" + "vmovl.u8 q2, d18 \n\t" + + // Which loop to start + " andS %[tmp], %[d],$0xf \n\t" + " beq "AP"quadloop \n\t" + + " andS %[tmp], %[d], #4 \n\t" + " beq "AP"dualstart \n\t" + + + AP"singleloop: \n\t" + " vld1.8 d0[0], [%[m]]! \n\t" + " vld1.32 d8[0], [%[d]] \n\t" + " vdup.u8 d0, d0[0] \n\t" + " vshr.u8 d0, d0, #1 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q4, d8 \n\t" + " vsub.s16 q6, q2, q4 \n\t" + " vmul.s16 q6, q0 \n\t" + " vshr.s16 q6, #7 \n\t" + " vadd.s16 q6, q4 \n\t" + " vqmovun.s16 d2, q6 \n\t" + " vst1.32 d2[0], [%[d]]! \n\t" + + " andS %[tmp], %[d], $0xf \n\t" + " beq "AP"quadloop \n\t" + + AP"dualstart: \n\t" + " sub %[tmp], %[e], %[d] \n\t" + " cmp %[tmp], #16 \n\t" + " blt "AP"loopout \n\t" + + AP"dualloop: \n\t" + " vld1.16 d0[0], [%[m]]! \n\t" + " vldm %[d], {d8} \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmul.u32 d0, d0, d30 \n\t" + " vshr.u8 d0, d0, #1 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q4, d8 \n\t" + " vsub.s16 q6, q2, q4 \n\t" + " vmul.s16 q6, q0 \n\t" + " vshr.s16 q6, #7 \n\t" + " vadd.s16 q6, q4 \n\t" + " vqmovun.s16 d2, q6 \n\t" + " vstm %[d]!, {d2} \n\t" + + AP"quadloop: \n\t" + " sub %[tmp], %[e], %[d] \n\t" + " cmp %[tmp], #16 \n\t" + " blt "AP"loopout \n\t" + " sub %[tmp], %[e], #15 \n\t" + + " sub %[d], #16 \n\t" + AP"fastloop: \n\t" + " add %[d], #16 \n\t" + " cmp %[tmp], %[d] \n\t" + " blt "AP"loopout \n\t" + + AP"quadloopint: \n\t" + // Load the mask: 4 bytes: It has d0/d1 + " ldr %[x], [%[m]] \n\t" + " add %[m], #4 \n\t" + + // Check for shortcuts + " cmp %[x], #0 \n\t" + " beq "AP"fastloop \n\t" + + " cmp %[x], $0xffffffff \n\t" + " beq "AP"quadstore \n\t" + + " vmov.32 d0[0], %[x] \n\t" + // Load d into d8/d9 q4 + " vldm %[d], {d8,d9} \n\t" + + // Get the alpha channel ready (m) + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmul.u32 q0, q0,q15 \n\t" + // Lop a bit off to prevent overflow + " vshr.u8 q0, q0, #1 \n\t" + + // Now make it 16 bit + " vmovl.u8 q1, d1 \n\t" + " vmovl.u8 q0, d0 \n\t" + + // 16 bit 'd' + " vmovl.u8 q5, d9 \n\t" + " vmovl.u8 q4, d8 \n\t" + + // Diff 'd' & 'c' + " vsub.s16 q7, q3, q5 \n\t" + " vsub.s16 q6, q2, q4 \n\t" + + " vmul.s16 q7, q1 \n\t" + " vmul.s16 q6, q0 \n\t" + + // Shift results a bit + " vshr.s16 q7, #7 \n\t" + " vshr.s16 q6, #7 \n\t" + + // Add 'd' + " vadd.s16 q7, q5 \n\t" + " vadd.s16 q6, q4 \n\t" + + // Make sure none are negative + " vqmovun.s16 d9, q7 \n\t" + " vqmovun.s16 d8, q6 \n\t" + + " vstm %[d]!, {d8,d9} \n\t" + + " cmp %[tmp], %[d] \n\t" + " bhi "AP"quadloopint \n\t" + " b "AP"loopout \n\t" + + AP"quadstore: \n\t" + " vstm %[d]!, {d18,d19} \n\t" + " cmp %[tmp], %[d] \n\t" + " bhi "AP"quadloopint \n\t" + + AP"loopout: \n\t" +#if NEONDEBUG + "cmp %[d], %[e] \n\t" + "ble "AP"foo \n\t" + "sub %[tmp], %[tmp] \n\t" + "vst1.32 d0[0], [%[tmp]] \n\t" + AP"foo: \n\t" +#endif + + " cmp %[e], %[d] \n\t" + " beq "AP"done \n\t" + + " sub %[tmp],%[e], %[d] \n\t" + " cmp %[tmp],#8 \n\t" + + " blt "AP"onebyte \n\t" + + // Load the mask: 2 bytes: It has d0 + " vld1.16 d0[0], [%[m]]! \n\t" + + // Load d into d8/d9 q4 + " vldm %[d], {d8} \n\t" + + // Get the alpha channel ready (m) + " vmovl.u8 q0, d0 \n\t" + " vmovl.u8 q0, d0 \n\t" + " vmul.u32 d0, d0, d30 \n\t" + // Lop a bit off to prevent overflow + " vshr.u8 d0, d0, #1 \n\t" + + // Now make it 16 bit + " vmovl.u8 q0, d0 \n\t" + + // 16 bit 'd' + " vmovl.u8 q4, d8 \n\t" + + // Diff 'd' & 'c' + " vsub.s16 q6, q2, q4 \n\t" + + " vmul.s16 q6, q0 \n\t" + + // Shift results a bit + " vshr.s16 q6, #7 \n\t" + + // Add 'd' + "vadd.s16 q6, q4 \n\t" + + // Make sure none are negative + "vqmovun.s16 d2, q6 \n\t" + + "vstm %[d]!, {d2} \n\t" + + "cmp %[e], %[d] \n\t" + "beq "AP"done \n\t" + + AP"onebyte: \n\t" + "vld1.8 d0[0], [%[m]]! \n\t" + "vld1.32 d8[0], [%[d]] \n\t" + "vdup.u8 d0, d0[0] \n\t" + "vshr.u8 d0, d0, #1 \n\t" + "vmovl.u8 q0, d0 \n\t" + "vmovl.u8 q4, d8 \n\t" + "vsub.s16 q6, q2, q4 \n\t" + "vmul.s16 q6, q0 \n\t" + "vshr.s16 q6, #7 \n\t" + "vadd.s16 q6, q4 \n\t" + "vqmovun.s16 d2, q6 \n\t" + "vst1.32 d2[0], [%[d]]! \n\t" + + + AP"done: \n\t" +#if NEONDEBUG + "cmp %[d], %[e] \n\t" + "beq "AP"reallydone \n\t" + "sub %[m], %[m] \n\t" + "vst1.32 d0[0], [%[m]] \n\t" + AP"reallydone:" +#endif + + + : // output regs + // Input + : [e] "r" (e = d + l), [d] "r" (d), [c] "r" (c), + [m] "r" (m), [tmp] "r" (7), [x] "r" (33) + : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","q9","q14","q15", + "memory" // clobbered + + ); +#undef AP +} +#endif + +#ifdef BUILD_NEON +#define _op_blend_mas_cn_dp_neon _op_blend_mas_can_dp_neon +#define _op_blend_mas_caa_dp_neon _op_blend_mas_c_dp_neon + +#define _op_blend_mas_c_dpan_neon _op_blend_mas_c_dp_neon +#define _op_blend_mas_cn_dpan_neon _op_blend_mas_cn_dp_neon +#define _op_blend_mas_can_dpan_neon _op_blend_mas_can_dp_neon +#define _op_blend_mas_caa_dpan_neon _op_blend_mas_caa_dp_neon + +static void +init_blend_mask_color_span_funcs_neon(void) +{ + op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_mas_c_dp_neon; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_mas_cn_dp_neon; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_mas_can_dp_neon; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_mas_caa_dp_neon; + + op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_mas_c_dpan_neon; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_mas_cn_dpan_neon; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_mas_can_dpan_neon; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_mas_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_pt_mas_c_dp_neon(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_pt_mas_cn_dp_neon _op_blend_pt_mas_c_dp_neon +#define _op_blend_pt_mas_can_dp_neon _op_blend_pt_mas_c_dp_neon +#define _op_blend_pt_mas_caa_dp_neon _op_blend_pt_mas_c_dp_neon + +#define _op_blend_pt_mas_c_dpan_neon _op_blend_pt_mas_c_dp_neon +#define _op_blend_pt_mas_cn_dpan_neon _op_blend_pt_mas_cn_dp_neon +#define _op_blend_pt_mas_can_dpan_neon _op_blend_pt_mas_can_dp_neon +#define _op_blend_pt_mas_caa_dpan_neon _op_blend_pt_mas_caa_dp_neon + +static void +init_blend_mask_color_pt_funcs_neon(void) +{ + op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_pt_mas_c_dp_neon; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_mas_cn_dp_neon; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_pt_mas_can_dp_neon; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_pt_mas_caa_dp_neon; + + op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_pt_mas_c_dpan_neon; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_mas_cn_dpan_neon; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_mas_can_dpan_neon; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_mas_caa_dpan_neon; +} +#endif + +/*-----*/ + +/* blend_rel mask x color -> dst */ + +#ifdef BUILD_NEON +static void +_op_blend_rel_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + + DEBUG_FNCOUNT("not"); + + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 mc = MUL_SYM(*m, c); + alpha = 256 - (mc >> 24); + *d = MUL_SYM(*d >> 24, mc) + MUL_256(alpha, *d); + d++; + m++; + }); +} + +#define _op_blend_rel_mas_cn_dp_neon _op_blend_rel_mas_c_dp_neon +#define _op_blend_rel_mas_can_dp_neon _op_blend_rel_mas_c_dp_neon +#define _op_blend_rel_mas_caa_dp_neon _op_blend_rel_mas_c_dp_neon + +#define _op_blend_rel_mas_c_dpan_neon _op_blend_mas_c_dpan_neon +#define _op_blend_rel_mas_cn_dpan_neon _op_blend_mas_cn_dpan_neon +#define _op_blend_rel_mas_can_dpan_neon _op_blend_mas_can_dpan_neon +#define _op_blend_rel_mas_caa_dpan_neon _op_blend_mas_caa_dpan_neon + +static void +init_blend_rel_mask_color_span_funcs_neon(void) +{ + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_rel_mas_c_dp_neon; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_rel_mas_cn_dp_neon; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_rel_mas_can_dp_neon; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_rel_mas_caa_dp_neon; + + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_rel_mas_c_dpan_neon; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_mas_cn_dpan_neon; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_mas_can_dpan_neon; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_mas_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_rel_pt_mas_c_dp_neon(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_neon _op_blend_rel_pt_mas_c_dp_neon +#define _op_blend_rel_pt_mas_can_dp_neon _op_blend_rel_pt_mas_c_dp_neon +#define _op_blend_rel_pt_mas_caa_dp_neon _op_blend_rel_pt_mas_c_dp_neon + +#define _op_blend_rel_pt_mas_c_dpan_neon _op_blend_pt_mas_c_dpan_neon +#define _op_blend_rel_pt_mas_cn_dpan_neon _op_blend_pt_mas_cn_dpan_neon +#define _op_blend_rel_pt_mas_can_dpan_neon _op_blend_pt_mas_can_dpan_neon +#define _op_blend_rel_pt_mas_caa_dpan_neon _op_blend_pt_mas_caa_dpan_neon + +static void +init_blend_rel_mask_color_pt_funcs_neon(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_blend_rel_pt_mas_c_dp_neon; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_mas_cn_dp_neon; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_blend_rel_pt_mas_can_dp_neon; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_blend_rel_pt_mas_caa_dp_neon; + + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_c_dpan_neon; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_cn_dpan_neon; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_can_dpan_neon; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_mas_caa_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_sse3.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_sse3.c new file mode 100644 index 0000000..83230e5 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_mask_color_sse3.c @@ -0,0 +1,320 @@ +/* blend mask x color -> dst */ + +#ifdef BUILD_SSE3 + +static void +_op_blend_mas_c_dp_sse3(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + DATA32 a = *m; + DATA32 mc = MUL_SYM(a, c); + a = 256 - (mc >> 24); + *d = mc + MUL_256(a, *d); + m++; d++; l--; + }, + { /* A4OP */ + + if ((m[3] | m[2] | m[1] | m[0]) == 0) { + m += 4; d += 4; l -= 4; + continue; + } + + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i mc0 = mul_sym_sse3(m0, c_packed); + __m128i a0 = sub4_alpha_sse3(mc0); + __m128i mul0 = mul_256_sse3(a0, d0); + + mul0 = _mm_add_epi32(mul0, mc0); + + _mm_store_si128((__m128i *)d, mul0); + + m += 4; d += 4; l -= 4; + }, + { /* A8OP */ + + if((m[7] | m[6] | m[5] | m[4] | m[3] | m[2] | m[1] | m[0]) == 0) { + m += 8; d += 8; l -= 8; + continue; + } + + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i m1 = _mm_set_epi32(m[7], m[6], m[5], m[4]); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i mc0 = mul_sym_sse3(m0, c_packed); + __m128i a0 = sub4_alpha_sse3(mc0); + __m128i mul0 = mul_256_sse3(a0, d0); + + mul0 = _mm_add_epi32(mc0, mul0); + + __m128i mc1 = mul_sym_sse3(m1, c_packed); + __m128i a1 = sub4_alpha_sse3(mc1); + __m128i mul1 = mul_256_sse3(a1, d1); + + mul1 = _mm_add_epi32(mc1, mul1); + + _mm_store_si128((__m128i *)d, mul0); + _mm_store_si128((__m128i *)(d+4), mul1); + + m += 8; d += 8; l -= 8; + }) +} + +static void +_op_blend_mas_can_dp_sse3(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + + DATA32 alpha; + + const __m128i one = _mm_set_epi32(1, 1, 1, 1); + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + *d = c; + break; + default: + alpha++; + *d = INTERP_256(alpha, c, *d); + break; + } + m++; d++; l--; + }, + { /* A4OP */ + + if ((m[3] | m[2] | m[1] | m[0]) == 0) { + m += 4; d += 4; l -= 4; + continue; + } + + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i zm0 = _mm_cmpeq_epi32(m0, _mm_setzero_si128()); + + m0 = _mm_add_epi32(one, m0); + + __m128i r0 = interp4_256_sse3(m0, c_packed, d0); + + r0 = _mm_and_si128(~zm0, r0); + d0 = _mm_and_si128(zm0, d0); + + d0 = _mm_add_epi32(r0, d0); + + _mm_store_si128((__m128i *)d, d0); + + m += 4; d += 4; l -= 4; + }, + { /* A8OP */ + + if ((m[7] | m[6] | m[5] | m[4] | m[3] | m[2] | m[1] | m[0]) == 0) { + m += 8; d += 8; l -= 8; + continue; + } + + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i m1 = _mm_set_epi32(m[7], m[6], m[5], m[4]); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i zm0 = _mm_cmpeq_epi32(m0, _mm_setzero_si128()); + __m128i zm1 = _mm_cmpeq_epi32(m1, _mm_setzero_si128()); + + m0 = _mm_add_epi32(one, m0); + m1 = _mm_add_epi32(one, m1); + + __m128i r0 = interp4_256_sse3(m0, c_packed, d0); + __m128i r1 = interp4_256_sse3(m1, c_packed, d1); + + r0 = _mm_and_si128(~zm0, r0); + d0 = _mm_and_si128(zm0, d0); + + r1 = _mm_and_si128(~zm1, r1); + d1 = _mm_and_si128(zm1, d1); + + d0 = _mm_add_epi32(d0, r0); + d1 = _mm_add_epi32(d1, r1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + m += 8; d += 8; l -= 8; + }) +} + +#define _op_blend_mas_cn_dp_sse3 _op_blend_mas_can_dp_sse3 +#define _op_blend_mas_caa_dp_sse3 _op_blend_mas_c_dp_sse3 + +#define _op_blend_mas_c_dpan_sse3 _op_blend_mas_c_dp_sse3 +#define _op_blend_mas_cn_dpan_sse3 _op_blend_mas_cn_dp_sse3 +#define _op_blend_mas_can_dpan_sse3 _op_blend_mas_can_dp_sse3 +#define _op_blend_mas_caa_dpan_sse3 _op_blend_mas_caa_dp_sse3 + +static void +init_blend_mask_color_span_funcs_sse3(void) +{ + op_blend_span_funcs[SP_N][SM_AS][SC][DP][CPU_SSE3] = _op_blend_mas_c_dp_sse3; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_mas_cn_dp_sse3; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_SSE3] = _op_blend_mas_can_dp_sse3; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_SSE3] = _op_blend_mas_caa_dp_sse3; + +// FIXME: BUGGY BUGGY Core i5 2500 (64bit), gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4), ello (text) +// op_blend_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_SSE3] = _op_blend_mas_c_dpan_sse3; + op_blend_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_mas_cn_dpan_sse3; + op_blend_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_SSE3] = _op_blend_mas_can_dpan_sse3; + op_blend_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_SSE3] = _op_blend_mas_caa_dpan_sse3; +} + +#define _op_blend_pt_mas_c_dp_sse3 NULL +#define _op_blend_pt_mas_can_dp_sse3 NULL + +#define _op_blend_pt_mas_cn_dp_sse3 _op_blend_pt_mas_can_dp_sse3 +#define _op_blend_pt_mas_caa_dp_sse3 _op_blend_pt_mas_c_dp_sse3 + +#define _op_blend_pt_mas_c_dpan_sse3 _op_blend_pt_mas_c_dp_sse3 +#define _op_blend_pt_mas_cn_dpan_sse3 _op_blend_pt_mas_cn_dp_sse3 +#define _op_blend_pt_mas_can_dpan_sse3 _op_blend_pt_mas_can_dp_sse3 +#define _op_blend_pt_mas_caa_dpan_sse3 _op_blend_pt_mas_caa_dp_sse3 + +static void +init_blend_mask_color_pt_funcs_sse3(void) +{ + op_blend_pt_funcs[SP_N][SM_AS][SC][DP][CPU_SSE3] = _op_blend_pt_mas_c_dp_sse3; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_pt_mas_cn_dp_sse3; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_SSE3] = _op_blend_pt_mas_can_dp_sse3; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_SSE3] = _op_blend_pt_mas_caa_dp_sse3; + + op_blend_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_SSE3] = _op_blend_pt_mas_c_dpan_sse3; + op_blend_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_pt_mas_cn_dpan_sse3; + op_blend_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_SSE3] = _op_blend_pt_mas_can_dpan_sse3; + op_blend_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_SSE3] = _op_blend_pt_mas_caa_dpan_sse3; +} + +/*-----*/ + +/* blend_rel mask x color --> dst */ + +static void +_op_blend_rel_mas_c_dp_sse3(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + DATA32 mc = MUL_SYM(*m, c); + int alpha = 256 - (mc >> 24); + *d = MUL_SYM(*d >> 24, mc) + MUL_256(alpha, *d); + d++; m++; l--; + }, + { /* A4OP */ + + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *) d); + + __m128i mc0 = mul_sym_sse3(m0, c_packed); + __m128i a0 = sub4_alpha_sse3(mc0); + + __m128i d0_sym = mul_sym_sse3(_mm_srli_epi32(d0, 24), mc0); + d0 = mul_256_sse3(a0, d0); + + d0 = _mm_add_epi32(d0, d0_sym); + + _mm_store_si128((__m128i *)d, d0); + + d += 4; m += 4; l -= 4; + }, + { /* A8OP */ + + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i m1 = _mm_set_epi32(m[7], m[6], m[5], m[4]); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i mc0 = mul_sym_sse3(m0, c_packed); + __m128i mc1 = mul_sym_sse3(m1, c_packed); + + __m128i a0 = sub4_alpha_sse3(mc0); + __m128i a1 = sub4_alpha_sse3(mc1); + + __m128i d0_sym = mul_sym_sse3(_mm_srli_epi32(d0, 24), mc0); + __m128i d1_sym = mul_sym_sse3(_mm_srli_epi32(d1, 24), mc1); + + d0 = mul_256_sse3(a0, d0); + d1 = mul_256_sse3(a1, d1); + + d0 = _mm_add_epi32(d0, d0_sym); + d1 = _mm_add_epi32(d1, d1_sym); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + d += 8; m += 8; l -= 8; + }) +} + +#define _op_blend_rel_mas_cn_dp_sse3 _op_blend_rel_mas_c_dp_sse3 +#define _op_blend_rel_mas_can_dp_sse3 _op_blend_rel_mas_c_dp_sse3 +#define _op_blend_rel_mas_caa_dp_sse3 _op_blend_rel_mas_c_dp_sse3 + +#define _op_blend_rel_mas_c_dpan_sse3 _op_blend_mas_c_dpan_sse3 +#define _op_blend_rel_mas_cn_dpan_sse3 _op_blend_mas_cn_dpan_sse3 +#define _op_blend_rel_mas_can_dpan_sse3 _op_blend_mas_can_dpan_sse3 +#define _op_blend_rel_mas_caa_dpan_sse3 _op_blend_mas_caa_dpan_sse3 + +static void +init_blend_rel_mask_color_span_funcs_sse3(void) +{ + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_SSE3] = _op_blend_rel_mas_c_dp_sse3; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_mas_can_dp_sse3; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_SSE3] = _op_blend_rel_mas_can_dp_sse3; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_SSE3] = _op_blend_rel_mas_caa_dp_sse3; + + op_blend_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_SSE3] = _op_blend_rel_mas_c_dpan_sse3; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_mas_cn_dpan_sse3; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_mas_can_dpan_sse3; + op_blend_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_mas_caa_dpan_sse3; +} + +#define _op_blend_rel_pt_mas_c_dp_sse3 NULL + +#define _op_blend_rel_pt_mas_cn_dp_sse3 _op_blend_rel_pt_mas_c_dp_sse3 +#define _op_blend_rel_pt_mas_can_dp_sse3 _op_blend_rel_pt_mas_c_dp_sse3 +#define _op_blend_rel_pt_mas_caa_dp_sse3 _op_blend_rel_pt_mas_c_dp_sse3 + +#define _op_blend_rel_pt_mas_c_dpan_sse3 _op_blend_pt_mas_c_dpan_sse3 +#define _op_blend_rel_pt_mas_cn_dpan_sse3 _op_blend_pt_mas_cn_dpan_sse3 +#define _op_blend_rel_pt_mas_can_dpan_sse3 _op_blend_pt_mas_can_dpan_sse3 +#define _op_blend_rel_pt_mas_caa_dpan_sse3 _op_blend_pt_mas_caa_dpan_sse3 + +static void +init_blend_rel_mask_color_pt_funcs_sse3(void) +{ + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_SSE3] = _op_blend_rel_pt_mas_c_dp_sse3; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_pt_mas_cn_dp_sse3; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_SSE3] = _op_blend_rel_pt_mas_can_dp_sse3; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_SSE3] = _op_blend_rel_pt_mas_caa_dp_sse3; + + op_blend_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_SSE3] = _op_blend_rel_pt_mas_c_dpan_sse3; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pt_mas_cn_dpan_sse3; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_pt_mas_can_dpan_sse3; + op_blend_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_pt_mas_caa_dpan_sse3; +} + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_master_sse3.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_master_sse3.c new file mode 100644 index 0000000..eac6755 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_master_sse3.c @@ -0,0 +1,77 @@ +#define NEED_SSE3 1 + +#include "evas_common.h" + +#ifdef BUILD_SSE3 +static __m128i A_MASK_SSE3; +#endif + +extern RGBA_Gfx_Func op_blend_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +extern RGBA_Gfx_Pt_Func op_blend_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +extern RGBA_Gfx_Func op_blend_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +extern RGBA_Gfx_Pt_Func op_blend_rel_pt_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; + +# include "op_blend_pixel_sse3.c" +# include "op_blend_color_sse3.c" +# include "op_blend_pixel_color_sse3.c" +# include "op_blend_pixel_mask_sse3.c" +# include "op_blend_mask_color_sse3.c" + +void +evas_common_op_blend_init_sse3(void) +{ +#ifdef BUILD_SSE3 + GA_MASK_SSE3 = _mm_set_epi32(0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF); + RB_MASK_SSE3 = _mm_set_epi32(0xFF00FF00, 0xFF00FF00, 0xFF00FF00, 0xFF00FF00); + SYM4_MASK_SSE3 = _mm_set_epi32(0x00FF00FF, 0x000000FF, 0x00FF00FF, 0x000000FF); + RGB_MASK_SSE3 = _mm_set_epi32(0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF); + A_MASK_SSE3 = _mm_set_epi32(0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000); + ALPHA_SSE3 = _mm_set_epi32(256, 256, 256, 256); + + init_blend_pixel_span_funcs_sse3(); + init_blend_pixel_color_span_funcs_sse3(); + init_blend_pixel_mask_span_funcs_sse3(); + init_blend_color_span_funcs_sse3(); + init_blend_mask_color_span_funcs_sse3(); + + init_blend_pixel_pt_funcs_sse3(); + init_blend_pixel_color_pt_funcs_sse3(); + init_blend_pixel_mask_pt_funcs_sse3(); + init_blend_color_pt_funcs_sse3(); + init_blend_mask_color_pt_funcs_sse3(); +#endif +} + +void +evas_common_op_blend_rel_init_sse3(void) +{ +#ifdef BUILD_SSE3 + init_blend_rel_pixel_span_funcs_sse3(); + init_blend_rel_pixel_color_span_funcs_sse3(); + init_blend_rel_pixel_mask_span_funcs_sse3(); + init_blend_rel_color_span_funcs_sse3(); + init_blend_rel_mask_color_span_funcs_sse3(); + + init_blend_rel_pixel_pt_funcs_sse3(); + init_blend_rel_pixel_color_pt_funcs_sse3(); + init_blend_rel_pixel_mask_pt_funcs_sse3(); + init_blend_rel_color_pt_funcs_sse3(); + init_blend_rel_mask_color_pt_funcs_sse3(); +#endif +} + +//#pragma GCC push_options +//#pragma GCC optimize ("O0") +void +evas_common_op_sse3_test(void) +{ +#ifdef BUILD_SSE3 + DATA32 s[64] = {0x11883399}, d[64] = {0xff88cc33}; + + s[0] = rand(); d[1] = rand(); + _op_blend_pas_dp_sse3(s, NULL, 0, d, 64); + evas_common_cpu_end_opt(); +#endif +} +//#pragma GCC pop_options diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c new file mode 100644 index 0000000..0ce78d8 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_.c @@ -0,0 +1,162 @@ +/* blend pixel --> dst */ + +#ifdef BUILD_C +static void +_op_blend_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = 256 - (*s >> 24); + *d = *s++ + MUL_256(alpha, *d); + d++; + }); +} + +static void +_op_blend_pas_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + switch (*s & 0xff000000) + { + case 0: + break; + case 0xff000000: + *d = *s; + break; + default: + alpha = 256 - (*s >> 24); + *d = *s + MUL_256(alpha, *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 __UNUSED__, 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 __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = 256 - (*s >> 24); + c = 1 + (*d >> 24); + *d = MUL_256(c, *s) + MUL_256(alpha, *d); + d++; + s++; + }); +} + +static void +_op_blend_rel_pan_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, 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 __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c new file mode 100644 index 0000000..c5e40a0 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_.c @@ -0,0 +1,284 @@ +/* blend pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_blend_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 sc = MUL4_SYM(c, *s); + alpha = 256 - (sc >> 24); + *d = sc + MUL_256(alpha, *d); + d++; + s++; + }); +} + +static void +_op_blend_pan_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha = 256 - (c >> 24); + UNROLL8_PLD_WHILE(d, l, e, + { + *d = ((c & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(alpha, *d); + d++; + s++; + }); +} + +static void +_op_blend_p_can_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = 256 - (*s >> 24); + *d = ((*s & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(alpha, *d); + d++; + s++; + }); +} + +static void +_op_blend_pan_can_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d++ = 0xff000000 + MUL3_SYM(c, *s); + s++; + }); +} + +static void +_op_blend_p_caa_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + c = 1 + (c & 0xff); + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 sc = MUL_256(c, *s); + alpha = 256 - (sc >> 24); + *d = sc + MUL_256(alpha, *d); + d++; + s++; + }); +} + +static void +_op_blend_pan_caa_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + c = 1 + (c & 0xff); + UNROLL8_PLD_WHILE(d, l, 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 __UNUSED__, 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 __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 sc = MUL4_SYM(c, *s); + alpha = 256 - (sc >> 24); + *d = MUL_SYM(*d >> 24, sc) + MUL_256(alpha, *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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c new file mode 100644 index 0000000..52751f4 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_i386.c @@ -0,0 +1,221 @@ +/* blend pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_p_c_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_neon.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_neon.c new file mode 100644 index 0000000..6e35970 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_neon.c @@ -0,0 +1,570 @@ +/* blend pixel x color --> dst */ +#ifdef BUILD_NEON +/* Note: Optimisation is based on keeping _dest_ aligned: else it's a pair of + * reads, then two writes, a miss on read is 'just' two reads */ +static void +_op_blend_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { +#define AP "blend_p_c_dp_" + asm volatile ( + ".fpu neon \n\t" + // Load 'c' + "vdup.u32 q7, %[c] \n\t" + "vmov.i8 q6, #1 \n\t" + + // Choose a loop + "andS %[tmp], %[d], $0xf \n\t" + "beq "AP"quadstart \n\t" + + "andS %[tmp],%[d], $0x4 \n\t" + "beq "AP"dualloop \n\t" + + AP"singleloop:" + "vld1.32 d0[0], [%[s]]! \n\t" + "vld1.32 d2[0], [%[d]] \n\t" + // Mulitply s * c (= sc) + "vmull.u8 q4, d0,d14 \n\t" + // sc in d8 + "vqrshrn.u16 d4, q4, #8 \n\t" + + // sca in d9 + "vmvn.u32 d6, d4 \n\t" + "vshr.u32 d6, d6, #24 \n\t" + + "vmul.u32 d6, d12, d6 \n\t" + + /* d * alpha */ + "vmull.u8 q4, d6, d2 \n\t" + "vqrshrn.u16 d0, q4, #8 \n\t" + + "vqadd.u8 d2, d0, d4 \n\t" + + // Save dsc + sc + "vst1.32 d2[0], [%[d]]! \n\t" + + // Now where? + // Can we go the fast path? + "andS %[tmp], %[d],$0xf \n\t" + "beq "AP"quadstart \n\t" + + AP"dualloop: \n\t" + // Check we have enough to bother with! + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #16 \n\t" + "blt "AP"loopout \n\t" + + // load 's' -> q0, 'd' -> q1 + "vldm %[s]!, {d0} \n\t" + "vldm %[d], {d2} \n\t" + // Mulitply s * c (= sc) + "vmull.u8 q4, d0,d14 \n\t" + // sc in d8 + "vqrshrn.u16 d4, q4, #8 \n\t" + + // sca in d9 + "vmvn.u32 d6, d4 \n\t" + "vshr.u32 d6, d6, #24 \n\t" + + "vmul.u32 d6, d12, d6 \n\t" + + /* d * alpha */ + "vmull.u8 q4, d6, d2 \n\t" + "vqrshrn.u16 d0, q4, #8 \n\t" + + "vqadd.u8 d2, d0, d4 \n\t" + + // Save dsc + sc + "vst1.32 d2, [%[d]]! \n\t" + + AP"quadstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #16 \n\t" + "blt "AP"loopout \n\t" + + "sub %[tmp], %[e], #15 \n\t" + + AP"quadloop:\n\t" + // load 's' -> q0, 'd' -> q1 + "vldm %[s]!, {d0,d1} \n\t" + "vldm %[d], {d2,d3} \n\t" + // Mulitply s * c (= sc) + "vmull.u8 q4, d0,d14 \n\t" + "vmull.u8 q5, d1,d14 \n\t" + + // Get sc & sc alpha + "vqrshrn.u16 d4, q4, #8 \n\t" + "vqrshrn.u16 d5, q5, #8 \n\t" + // sc is now in q2, 8bpp + // Shift out, then spread alpha for q2 + "vmvn.u32 q3, q2 \n\t" + "vshr.u32 q3, q3, $0x18 \n\t" + "vmul.u32 q3, q6,q3 \n\t" + + // Multiply 'd' by sc.alpha (dsca) + "vmull.u8 q4, d6,d2 \n\t" + "vmull.u8 q5, d7,d3 \n\t" + + "vqrshrn.u16 d0, q4, #8 \n\t" + "vqrshrn.u16 d1, q5, #8 \n\t" + + "vqadd.u8 q1, q0, q2 \n\t" + + // Save dsc + sc + "vstm %[d]!, {d2,d3} \n\t" + + "cmp %[tmp], %[d] \n\t" + + "bhi "AP"quadloop \n\t" + + /* Trailing stuff */ + AP"loopout: \n\t" + + "cmp %[d], %[e] \n\t" + "beq "AP"done\n\t" + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],$0x04 \n\t" + "beq "AP"singleloop2 \n\t" + + "sub %[tmp], %[e], #7 \n\t" + /* Dual loop */ + AP"dualloop2: \n\t" + "vldm %[s]!, {d0} \n\t" + "vldm %[d], {d2} \n\t" + // Mulitply s * c (= sc) + "vmull.u8 q4, d0,d14 \n\t" + // sc in d8 + "vqrshrn.u16 d4, q4, #8 \n\t" + + // sca in d9 + // XXX: I can probably squash one of these 3 + "vmvn.u32 d6, d4 \n\t" + "vshr.u32 d6, d6, #24 \n\t" + "vmul.u32 d6, d6, d12 \n\t" + + /* d * alpha */ + "vmull.u8 q4, d6, d2 \n\t" + "vqrshrn.u16 d0, q4, #8 \n\t" + + "vqadd.u8 d2, d0, d4 \n\t" + + // Save dsc + sc + "vstm %[d]!, {d2} \n\t" + + "cmp %[tmp], %[d] \n\t" + "bhi "AP"dualloop2 \n\t" + + "cmp %[d], %[e] \n\t" + "beq "AP"done \n\t" + + AP"singleloop2: \n\t" + "vld1.32 d0[0], [%[s]]! \n\t" + "vld1.32 d2[0], [%[d]] \n\t" + // Mulitply s * c (= sc) + "vmull.u8 q4, d0,d14 \n\t" + // sc in d8 + "vqrshrn.u16 d4, q4, #8 \n\t" + + // sca in d6 + "vmvn.u32 d6, d4 \n\t" + "vshr.u32 d6, d6, #24 \n\t" + "vmul.u32 d6, d12,d6 \n\t" + + /* d * alpha */ + "vmull.u8 q4, d6, d2 \n\t" + "vqrshrn.u16 d0, q4, #8 \n\t" + + "vqadd.u8 d2, d0, d4 \n\t" + + // Save dsc + sc + "vst1.32 d2[0], [%[d]]! \n\t" + + + AP"done:" + : // No output + // + : [s] "r" (s), [e] "r" (d + l), [d] "r" (d), [c] "r" (c), + [tmp] "r" (12) + : "q0","q1","q2","q3","q4","q5","q6","q7","memory" + ); +#undef AP +} + +static void +_op_blend_pan_can_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d++ = 0xff000000 + MUL3_SYM(c, *s); + s++; + }); +} + +static void +_op_blend_pan_caa_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { +#if 1 + DATA32 *e; + int alpha; + c = 1 + (c & 0xff); + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 sc = MUL_256(c, *s); + alpha = 256 - (sc >> 24); + *d = sc + MUL_256(alpha, *d); + d++; + s++; + }); +#else // the below neon is buggy!! misses rendering of spans, i think with alignment. quick - just disable this. +#define AP "_op_blend_pan_caa_dp_" + DATA32 *e = d + l, *tmp = (void*)73; + asm volatile ( + ".fpu neon \n\t" + /* Set up 'c' */ + "vdup.u8 d14, %[c] \n\t" + "vmov.i8 d15, #1 \n\t" + "vaddl.u8 q15, d14, d15 \n\t" + "vshr.u8 q15,#1 \n\t" + + // Pick a loop + "andS %[tmp], %[d], $0xf \n\t" + "beq "AP"quadstart \n\t" + + "andS %[tmp], %[d], $0x4 \n\t" + "beq "AP"dualstart \n\t" + + AP"singleloop: \n\t" + "vld1.32 d4[0], [%[d]] \n\t" + "vld1.32 d0[0], [%[s]]! \n\t" + + // Long version of 'd' + "vmovl.u8 q8, d4 \n\t" + + // Long version of 's' + "vmovl.u8 q6, d0 \n\t" + + // d8 = s -d + "vsub.s16 d8, d12, d16 \n\t" + + // Multiply + "vmul.s16 d8, d8, d30 \n\t" + + // Shift down + "vshr.s16 d8, #7 \n\t" + + // Add 'd' + "vqadd.s16 d8, d8, d16 \n\t" + + // Shrink to save + "vqmovun.s16 d0, q4 \n\t" + "vst1.32 d0[0], [%[d]]! \n\t" + + // Now where? + "andS %[tmp], %[d], $0xf \n\t" + "beq "AP"quadstart \n\t" + + AP"dualstart: \n\t" + // Check we have enough + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #16 \n\t" + "blt "AP"loopout \n\t" + + AP"dualloop:" + "vldm %[d], {d4} \n\t" + "vldm %[s]!, {d0} \n\t" + + // Long version of d + "vmovl.u8 q8, d4 \n\t" + + // Long version of s + "vmovl.u8 q6, d0 \n\t" + + // q4/q5 = s-d + "vsub.s16 q4, q6, q8 \n\t" + + // Multiply + "vmul.s16 q4, q4,q15 \n\t" + + // Shift down + "vshr.s16 q4, #7 \n\t" + + // Add d + "vqadd.s16 q4, q4, q8 \n\t" + + // Shrink to save + "vqmovun.s16 d0, q4 \n\t" + + "vstm %[d]!, {d0} \n\t" + AP"quadstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #16 \n\t" + "blt "AP"loopout \n\t" + + "sub %[tmp], %[e], #15 \n\t" + + AP"quadloop: \n\t" + // load 's' -> q0, 'd' -> q2 + "vldm %[d], {d4,d5} \n\t" + "vldm %[s]!, {d0,d1} \n\t" + + // Long version of d + "vmovl.u8 q8, d4 \n\t" + "vmovl.u8 q9, d5 \n\t" + + // Long version of s + "vmovl.u8 q6, d0 \n\t" + "vmovl.u8 q7, d1 \n\t" + + // q4/q5 = s-d + "vsub.s16 q4, q6, q8 \n\t" + "vsub.s16 q5, q7, q9 \n\t" + + // Multiply + "vmul.s16 q4, q4,q15 \n\t" + "vmul.s16 q5, q5,q15 \n\t" + + // Shift down + "vshr.s16 q4, #7 \n\t" + "vshr.s16 q5, #7 \n\t" + + // Add d + "vqadd.s16 q4, q4, q8 \n\t" + "vqadd.s16 q5, q5, q9 \n\t" + + // Shrink to save + "vqmovun.s16 d0, q4 \n\t" + "vqmovun.s16 d1, q5 \n\t" + "vstm %[d]!, {d0,d1} \n\t" + "cmp %[tmp], %[d] \n\t" + + "bhi "AP"quadloop\n\t" + + + "b "AP"done\n\t" + AP"loopout: \n\t" + "cmp %[d], %[e] \n\t" + "beq "AP"done\n\t" + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],$0x04 \n\t" + "beq "AP"singleloop2 \n\t" + + AP"dualloop2: \n\t" + "vldm %[d], {d4} \n\t" + "vldm %[s]!, {d0} \n\t" + + // Long version of d + "vmovl.u8 q8, d4 \n\t" + + // Long version of s + "vmovl.u8 q6, d0 \n\t" + + // q4/q5 = s-d + "vsub.s16 q4, q6, q8 \n\t" + + // Multiply + "vmul.s16 q4, q4,q15 \n\t" + + // Shift down + "vshr.s16 q4, #7 \n\t" + + // Add d + "vqadd.s16 q4, q4, q8 \n\t" + + // Shrink to save + "vqmovun.s16 d0, q4 \n\t" + + "vstm %[d]!, {d0} \n\t" + + "cmp %[d], %[e] \n\t" + "beq "AP"done \n\t" + + AP"singleloop2: \n\t" + "vld1.32 d4[0], [%[d]] \n\t" + "vld1.32 d0[0], [%[s]]! \n\t" + + // Long version of 'd' + "vmovl.u8 q8, d4 \n\t" + + // Long version of 's' + "vmovl.u8 q6, d0 \n\t" + + // d8 = s -d + "vsub.s16 d8, d12, d16 \n\t" + + // Multiply + "vmul.s16 d8, d8, d30 \n\t" + + // Shift down + "vshr.s16 d8, #7 \n\t" + + // Add 'd' + "vqadd.s16 d8, d8, d16 \n\t" + + // Shrink to save + "vqmovun.s16 d0, q4 \n\t" + + "vst1.32 d0[0], [%[d]] \n\t" + + + AP"done: \n\t" + + // No output + : + // Input + : [s] "r" (s), [d] "r" (d), [e] "r" (e), [c] "r" (c), [tmp] "r" (tmp) + // Clobbered + : "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "memory" + ); +#undef AP +#endif +} + +#define _op_blend_pas_c_dp_neon _op_blend_p_c_dp_neon +#define _op_blend_pan_c_dp_neon _op_blend_p_c_dp_neon +#define _op_blend_p_can_dp_neon _op_blend_p_c_dp_neon +#define _op_blend_pas_can_dp_neon _op_blend_p_c_dp_neon +#define _op_blend_p_caa_dp_neon _op_blend_p_c_dp_neon +#define _op_blend_pas_caa_dp_neon _op_blend_p_c_dp_neon + +#define _op_blend_p_c_dpan_neon _op_blend_p_c_dp_neon +#define _op_blend_pas_c_dpan_neon _op_blend_pas_c_dp_neon +#define _op_blend_pan_c_dpan_neon _op_blend_pan_c_dp_neon +#define _op_blend_p_can_dpan_neon _op_blend_p_can_dp_neon +#define _op_blend_pas_can_dpan_neon _op_blend_pas_can_dp_neon +#define _op_blend_pan_can_dpan_neon _op_blend_pan_can_dp_neon +#define _op_blend_p_caa_dpan_neon _op_blend_p_caa_dp_neon +#define _op_blend_pas_caa_dpan_neon _op_blend_pas_caa_dp_neon +#define _op_blend_pan_caa_dpan_neon _op_blend_pan_caa_dp_neon + + +static void +init_blend_pixel_color_span_funcs_neon(void) +{ + op_blend_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_blend_p_c_dp_neon; + op_blend_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_blend_pas_c_dp_neon; + op_blend_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_blend_pan_c_dp_neon; + op_blend_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_p_can_dp_neon; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pas_can_dp_neon; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pan_can_dp_neon; + op_blend_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_p_caa_dp_neon; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pas_caa_dp_neon; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pan_caa_dp_neon; + + op_blend_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_p_c_dpan_neon; + op_blend_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pas_c_dpan_neon; + op_blend_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pan_c_dpan_neon; + op_blend_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_p_can_dpan_neon; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pas_can_dpan_neon; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pan_can_dpan_neon; + op_blend_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_p_caa_dpan_neon; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pas_caa_dpan_neon; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pan_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, 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_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pan_c_dp_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_p_can_dp_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pas_can_dp_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pan_can_dp_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_p_caa_dp_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pas_caa_dp_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pan_caa_dp_neon _op_blend_pt_p_c_dp_neon + +#define _op_blend_pt_p_c_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pas_c_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pan_c_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_p_can_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pas_can_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pan_can_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_p_caa_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pas_caa_dpan_neon _op_blend_pt_p_c_dp_neon +#define _op_blend_pt_pan_caa_dpan_neon _op_blend_pt_p_c_dp_neon + +static void +init_blend_pixel_color_pt_funcs_neon(void) +{ + op_blend_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_p_c_dp_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_pas_c_dp_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_blend_pt_pan_c_dp_neon; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pt_p_can_dp_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pt_pas_can_dp_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_blend_pt_pan_can_dp_neon; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_p_caa_dp_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_pas_caa_dp_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_blend_pt_pan_caa_dp_neon; + + op_blend_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_p_c_dpan_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_pas_c_dpan_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_pt_pan_c_dpan_neon; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_p_can_dpan_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_pas_can_dpan_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_pt_pan_can_dpan_neon; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_p_caa_dpan_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_pas_caa_dpan_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_pt_pan_caa_dpan_neon; +} +#endif + +/*-----*/ + +/* blend_rel pixel x color -> dst */ + +#ifdef BUILD_NEON + +#define _op_blend_rel_p_c_dpan_neon _op_blend_p_c_dpan_neon +#define _op_blend_rel_pas_c_dpan_neon _op_blend_pas_c_dpan_neon +#define _op_blend_rel_pan_c_dpan_neon _op_blend_pan_c_dpan_neon +#define _op_blend_rel_p_can_dpan_neon _op_blend_p_can_dpan_neon +#define _op_blend_rel_pas_can_dpan_neon _op_blend_pas_can_dpan_neon +#define _op_blend_rel_pan_can_dpan_neon _op_blend_pan_can_dpan_neon +#define _op_blend_rel_p_caa_dpan_neon _op_blend_p_caa_dpan_neon +#define _op_blend_rel_pas_caa_dpan_neon _op_blend_pas_caa_dpan_neon +#define _op_blend_rel_pan_caa_dpan_neon _op_blend_pan_caa_dpan_neon + +static void +init_blend_rel_pixel_color_span_funcs_neon(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_p_c_dpan_neon; + op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pas_c_dpan_neon; + op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pan_c_dpan_neon; + op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_p_can_dpan_neon; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pas_can_dpan_neon; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pan_can_dpan_neon; + op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_p_caa_dpan_neon; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pas_caa_dpan_neon; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pan_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON + +#define _op_blend_rel_pt_p_c_dpan_neon _op_blend_pt_p_c_dpan_neon +#define _op_blend_rel_pt_pas_c_dpan_neon _op_blend_pt_pas_c_dpan_neon +#define _op_blend_rel_pt_pan_c_dpan_neon _op_blend_pt_pan_c_dpan_neon +#define _op_blend_rel_pt_p_can_dpan_neon _op_blend_pt_p_can_dpan_neon +#define _op_blend_rel_pt_pas_can_dpan_neon _op_blend_pt_pas_can_dpan_neon +#define _op_blend_rel_pt_pan_can_dpan_neon _op_blend_pt_pan_can_dpan_neon +#define _op_blend_rel_pt_p_caa_dpan_neon _op_blend_pt_p_caa_dpan_neon +#define _op_blend_rel_pt_pas_caa_dpan_neon _op_blend_pt_pas_caa_dpan_neon +#define _op_blend_rel_pt_pan_caa_dpan_neon _op_blend_pt_pan_caa_dpan_neon + +static void +init_blend_rel_pixel_color_pt_funcs_neon(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_c_dpan_neon; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_c_dpan_neon; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_c_dpan_neon; + op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_can_dpan_neon; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_can_dpan_neon; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_can_dpan_neon; + op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_caa_dpan_neon; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_caa_dpan_neon; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_caa_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_sse3.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_sse3.c new file mode 100644 index 0000000..4ee31f5 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_color_sse3.c @@ -0,0 +1,543 @@ +/* blend pixel x color --> dst */ + +#ifdef BUILD_SSE3 + +static void +_op_blend_p_c_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + DATA32 alpha; + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + DATA32 sc = MUL4_SYM(c, *s); + alpha = 256 - (sc >> 24); + *d = sc + MUL_256(alpha, *d); + d++; s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i sc0 = mul4_sym_sse3(c_packed, s0); + __m128i a0 = sub4_alpha_sse3(sc0); + __m128i mul0 = mul_256_sse3(a0, d0); + + d0 = _mm_add_epi32(sc0, mul0); + + _mm_store_si128((__m128i *)d, d0); + + d += 4; s += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i sc0 = mul4_sym_sse3(c_packed, s0); + __m128i sc1 = mul4_sym_sse3(c_packed, s1); + + __m128i a0 = sub4_alpha_sse3(sc0); + __m128i a1 = sub4_alpha_sse3(sc1); + + __m128i mul0 = mul_256_sse3(a0, d0); + __m128i mul1 = mul_256_sse3(a1, d1); + + d0 = _mm_add_epi32(sc0, mul0); + d1 = _mm_add_epi32(sc1, mul1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + d += 8; s += 8; l -= 8; + }) +} + +static void +_op_blend_pan_c_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + DATA32 c_a = c & 0xFF000000; + DATA32 alpha = 256 - (c >> 24); + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + const __m128i c_alpha = _mm_set_epi32(c_a, c_a, c_a, c_a); + const __m128i a0 = _mm_set_epi32(alpha, alpha, alpha, alpha); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + *d = ((c & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(alpha, *d); + d++; s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i r0 = _mm_add_epi32(mul3_sym_sse3(c_packed, s0), + mul_256_sse3(a0, d0)); + + r0 = _mm_add_epi32(r0, c_alpha); + + _mm_store_si128((__m128i *)d, r0); + + d += 4; s += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i r0 = _mm_add_epi32(mul3_sym_sse3(c_packed, s0), + mul_256_sse3(a0, d0)); + + __m128i r1 = _mm_add_epi32(mul3_sym_sse3(c_packed, s1), + mul_256_sse3(a0, d1)); + + r0 = _mm_add_epi32(r0, c_alpha); + r1 = _mm_add_epi32(r1, c_alpha); + + _mm_store_si128((__m128i *)d, r0); + _mm_store_si128((__m128i *)(d+4), r1); + + d += 8; s += 8; l -= 8; + }) +} + +static void +_op_blend_p_can_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + int alpha; + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + alpha = 256 - (*s >> 24); + *d = ((*s & 0xff000000) + MUL3_SYM(c, *s)) + MUL_256(alpha, *d); + d++; s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i a0 = sub4_alpha_sse3(s0); + + __m128i r0 = _mm_add_epi32(mul3_sym_sse3(c_packed, s0), + mul_256_sse3(a0, d0)); + + r0 = _mm_add_epi32(r0, _mm_and_si128(s0, A_MASK_SSE3)); + + _mm_store_si128((__m128i *)d, r0); + + d += 4; s += 4; l -= 4; + }, + { + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i a0 = sub4_alpha_sse3(s0); + __m128i a1 = sub4_alpha_sse3(s1); + + __m128i r0 = _mm_add_epi32(mul3_sym_sse3(c_packed, s0), + mul_256_sse3(a0, d0)); + + __m128i r1 = _mm_add_epi32(mul3_sym_sse3(c_packed, s1), + mul_256_sse3(a1, d1)); + + r0 = _mm_add_epi32(r0, _mm_and_si128(s0, A_MASK_SSE3)); + r1 = _mm_add_epi32(r1, _mm_and_si128(s1, A_MASK_SSE3)); + + _mm_store_si128((__m128i *)d, r0); + _mm_store_si128((__m128i *)(d+4), r1); + + d += 8; s += 8; l -= 8; + }) +} + +static void +_op_blend_pan_can_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + *d++ = 0xff000000 + MUL3_SYM(c, *s); + s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + + __m128i r0 = mul3_sym_sse3(c_packed, s0); + r0 = _mm_add_epi32(r0, A_MASK_SSE3); + + _mm_store_si128((__m128i *)d, r0); + + d += 4; s += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + + __m128i r0 = mul3_sym_sse3(c_packed, s0); + __m128i r1 = mul3_sym_sse3(c_packed, s1); + + r0 = _mm_add_epi32(r0, A_MASK_SSE3); + r1 = _mm_add_epi32(r1, A_MASK_SSE3); + + _mm_store_si128((__m128i *)d, r0); + _mm_store_si128((__m128i *)(d+4), r1); + + d += 8; s += 8; l -= 8; + }) +} + +static void +_op_blend_p_caa_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + int alpha; + c = 1 + (c & 0xff); + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + DATA32 sc = MUL_256(c, *s); + alpha = 256 - (sc >> 24); + *d = sc + MUL_256(alpha, *d); + d++; + s++; + l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128 ((__m128i *)d); + + __m128i sc0 = mul_256_sse3(c_packed, s0); + __m128i a0 = sub4_alpha_sse3(sc0); + + __m128i r0 = _mm_add_epi32(mul_256_sse3(a0, d0), sc0); + + _mm_store_si128((__m128i *)d, r0); + + d += 4; s += 4; l -= 4; + }, + { + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i sc0 = mul_256_sse3(c_packed, s0); + __m128i sc1 = mul_256_sse3(c_packed, s1); + + __m128i a0 = sub4_alpha_sse3(sc0); + __m128i a1 = sub4_alpha_sse3(sc1); + + __m128i r0 = _mm_add_epi32(mul_256_sse3(a0, d0), sc0); + __m128i r1 = _mm_add_epi32(mul_256_sse3(a1, d1), sc1); + + _mm_store_si128((__m128i *)d, r0); + _mm_store_si128((__m128i *)(d+4), r1); + + d += 8; s += 8; l -= 8; + }) +} + +static void +_op_blend_pan_caa_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + c = 1 + (c & 0xff); + const __m128i c_packed = _mm_set_epi32(c, c, c,c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + *d = INTERP_256(c, *s, *d); + d++; s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i r0 = interp4_256_sse3(c_packed, s0, d0); + + _mm_store_si128((__m128i *)d, r0); + + d += 4; s += 4; l -= 4; + }, + { + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i r0 = interp4_256_sse3(c_packed, s0, d0); + __m128i r1 = interp4_256_sse3(c_packed, s1, d1); + + _mm_store_si128((__m128i *)d, r0); + _mm_store_si128((__m128i *)(d+4), r1); + + d += 8; s += 8; l -= 8; + }) +} + +#define _op_blend_pas_c_dp_sse3 _op_blend_p_c_dp_sse3 +#define _op_blend_pas_can_dp_sse3 _op_blend_p_can_dp_sse3 +#define _op_blend_pas_caa_dp_sse3 _op_blend_p_caa_dp_sse3 + +#define _op_blend_p_c_dpan_sse3 _op_blend_p_c_dp_sse3 +#define _op_blend_pas_c_dpan_sse3 _op_blend_pas_c_dp_sse3 +#define _op_blend_pan_c_dpan_sse3 _op_blend_pan_c_dp_sse3 +#define _op_blend_p_can_dpan_sse3 _op_blend_p_can_dp_sse3 +#define _op_blend_pas_can_dpan_sse3 _op_blend_pas_can_dp_sse3 +#define _op_blend_pan_can_dpan_sse3 _op_blend_pan_can_dp_sse3 +#define _op_blend_p_caa_dpan_sse3 _op_blend_p_caa_dp_sse3 +#define _op_blend_pas_caa_dpan_sse3 _op_blend_pas_caa_dp_sse3 +#define _op_blend_pan_caa_dpan_sse3 _op_blend_pan_caa_dp_sse3 + +static void +init_blend_pixel_color_span_funcs_sse3(void) +{ + op_blend_span_funcs[SP][SM_N][SC][DP][CPU_SSE3] = _op_blend_p_c_dp_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC][DP][CPU_SSE3] = _op_blend_pas_c_dp_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC][DP][CPU_SSE3] = _op_blend_pan_c_dp_sse3; + op_blend_span_funcs[SP][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_p_can_dp_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_pas_can_dp_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_pan_can_dp_sse3; + op_blend_span_funcs[SP][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_p_caa_dp_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_pas_caa_dp_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_pan_caa_dp_sse3; + + op_blend_span_funcs[SP][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_p_c_dpan_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_pas_c_dpan_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_pan_c_dpan_sse3; + op_blend_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_p_can_dpan_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_pas_can_dpan_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_pan_can_dpan_sse3; + op_blend_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_p_caa_dpan_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_pas_caa_dpan_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_pan_caa_dpan_sse3; +} + +#define _op_blend_pt_p_c_dp_sse3 NULL + +#define _op_blend_pt_pas_c_dp_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_pan_c_dp_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_p_can_dp_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_pas_can_dp_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_pan_can_dp_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_p_caa_dp_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_pas_caa_dp_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_pan_caa_dp_sse3 _op_blend_pt_p_c_dp_sse3 + +#define _op_blend_pt_p_c_dpan_sse3 _op_blend_pt_p_c_dp_sse3 +#define _op_blend_pt_pas_c_dpan_sse3 _op_blend_pt_pas_c_dp_sse3 +#define _op_blend_pt_pan_c_dpan_sse3 _op_blend_pt_pan_c_dp_sse3 +#define _op_blend_pt_p_can_dpan_sse3 _op_blend_pt_p_can_dp_sse3 +#define _op_blend_pt_pas_can_dpan_sse3 _op_blend_pt_pas_can_dp_sse3 +#define _op_blend_pt_pan_can_dpan_sse3 _op_blend_pt_pan_can_dp_sse3 +#define _op_blend_pt_p_caa_dpan_sse3 _op_blend_pt_p_caa_dp_sse3 +#define _op_blend_pt_pas_caa_dpan_sse3 _op_blend_pt_pas_caa_dp_sse3 +#define _op_blend_pt_pan_caa_dpan_sse3 _op_blend_pt_pan_caa_dp_sse3 + +static void +init_blend_pixel_color_pt_funcs_sse3(void) +{ + op_blend_pt_funcs[SP][SM_N][SC][DP][CPU_SSE3] = _op_blend_pt_p_c_dp_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP][CPU_SSE3] = _op_blend_pt_pas_c_dp_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP][CPU_SSE3] = _op_blend_pt_pan_c_dp_sse3; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_pt_p_can_dp_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_pt_pas_can_dp_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_pt_pan_can_dp_sse3; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_pt_p_caa_dp_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_pt_pas_caa_dp_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_pt_pan_caa_dp_sse3; + + op_blend_pt_funcs[SP][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_pt_p_c_dpan_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_pt_pas_c_dpan_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_pt_pan_c_dpan_sse3; + op_blend_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_pt_p_can_dpan_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_pt_pas_can_dpan_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_pt_pan_can_dpan_sse3; + op_blend_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_pt_p_caa_dpan_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_pt_pas_caa_dpan_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_pt_pan_caa_dpan_sse3; +} + +/*-----*/ + +/* blend_rel pixel x color -> dst */ + +static void +_op_blend_rel_p_c_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + int alpha; + + const __m128i c_packed = _mm_set_epi32(c, c, c, c); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + DATA32 sc = MUL4_SYM(c, *s); + alpha = 256 - (sc >> 24); + *d = MUL_SYM(*d >> 24, sc) + MUL_256(alpha, *d); + d++; s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i sc0 = mul4_sym_sse3(c_packed, s0); + __m128i a0 = sub4_alpha_sse3(sc0); + + __m128i l0 = mul_sym_sse3(_mm_srli_epi32(d0, 24), sc0); + __m128i r0 = mul_256_sse3(a0, d0); + + r0 = _mm_add_epi32(l0, r0); + + _mm_store_si128((__m128i *)d, r0); + + d += 4; s += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i sc0 = mul4_sym_sse3(c_packed, s0); + __m128i sc1 = mul4_sym_sse3(c_packed, s1); + + __m128i a0 = sub4_alpha_sse3(sc0); + __m128i a1 = sub4_alpha_sse3(sc1); + + __m128i l0 = mul_sym_sse3(_mm_srli_epi32(d0, 24), sc0); + __m128i r0 = mul_256_sse3(a0, d0); + + __m128i l1 = mul_sym_sse3(_mm_srli_epi32(d1, 24), sc1); + __m128i r1 = mul_256_sse3(a1, d1); + + r0 = _mm_add_epi32(l0, r0); + r1 = _mm_add_epi32(l1, r1); + + _mm_store_si128((__m128i *)d, r0); + _mm_store_si128((__m128i *)(d+4), r1); + + d += 8; s += 8; l -= 8; + }) +} + +#define _op_blend_rel_pas_c_dp_sse3 _op_blend_rel_p_c_dp_sse3 +#define _op_blend_rel_pan_c_dp_sse3 _op_blend_rel_p_c_dp_sse3 +#define _op_blend_rel_p_can_dp_sse3 _op_blend_rel_p_c_dp_sse3 +#define _op_blend_rel_pas_can_dp_sse3 _op_blend_rel_p_c_dp_sse3 +#define _op_blend_rel_pan_can_dp_sse3 _op_blend_rel_p_c_dp_sse3 +#define _op_blend_rel_p_caa_dp_sse3 _op_blend_rel_p_c_dp_sse3 +#define _op_blend_rel_pas_caa_dp_sse3 _op_blend_rel_p_c_dp_sse3 +#define _op_blend_rel_pan_caa_dp_sse3 _op_blend_rel_p_c_dp_sse3 + +#define _op_blend_rel_p_c_dpan_sse3 _op_blend_p_c_dpan_sse3 +#define _op_blend_rel_pas_c_dpan_sse3 _op_blend_pas_c_dpan_sse3 +#define _op_blend_rel_pan_c_dpan_sse3 _op_blend_pan_c_dpan_sse3 +#define _op_blend_rel_p_can_dpan_sse3 _op_blend_p_can_dpan_sse3 +#define _op_blend_rel_pas_can_dpan_sse3 _op_blend_pas_can_dpan_sse3 +#define _op_blend_rel_pan_can_dpan_sse3 _op_blend_pan_can_dpan_sse3 +#define _op_blend_rel_p_caa_dpan_sse3 _op_blend_p_caa_dpan_sse3 +#define _op_blend_rel_pas_caa_dpan_sse3 _op_blend_pas_caa_dpan_sse3 +#define _op_blend_rel_pan_caa_dpan_sse3 _op_blend_pan_caa_dpan_sse3 + +static void +init_blend_rel_pixel_color_span_funcs_sse3(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_p_c_dp_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_pas_c_dp_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_pan_c_dp_sse3; + op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_rel_p_can_dp_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_rel_pas_can_dp_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_rel_pan_can_dp_sse3; + op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_p_caa_dp_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_pas_caa_dp_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_pan_caa_dp_sse3; + + op_blend_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_p_c_dpan_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_pas_c_dpan_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_pan_c_dpan_sse3; + op_blend_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_p_can_dpan_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_pas_can_dpan_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_pan_can_dpan_sse3; + op_blend_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_p_caa_dpan_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_pas_caa_dpan_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_pan_caa_dpan_sse3; +} + +#define _op_blend_rel_pt_p_c_dp_sse3 NULL + +#define _op_blend_rel_pt_pas_c_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 +#define _op_blend_rel_pt_pan_c_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 +#define _op_blend_rel_pt_p_can_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 +#define _op_blend_rel_pt_pas_can_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 +#define _op_blend_rel_pt_pan_can_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 +#define _op_blend_rel_pt_p_caa_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 +#define _op_blend_rel_pt_pas_caa_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 +#define _op_blend_rel_pt_pan_caa_dp_sse3 _op_blend_rel_pt_p_c_dp_sse3 + +#define _op_blend_rel_pt_p_c_dpan_sse3 _op_blend_pt_p_c_dpan_sse3 +#define _op_blend_rel_pt_pas_c_dpan_sse3 _op_blend_pt_pas_c_dpan_sse3 +#define _op_blend_rel_pt_pan_c_dpan_sse3 _op_blend_pt_pan_c_dpan_sse3 +#define _op_blend_rel_pt_p_can_dpan_sse3 _op_blend_pt_p_can_dpan_sse3 +#define _op_blend_rel_pt_pas_can_dpan_sse3 _op_blend_pt_pas_can_dpan_sse3 +#define _op_blend_rel_pt_pan_can_dpan_sse3 _op_blend_pt_pan_can_dpan_sse3 +#define _op_blend_rel_pt_p_caa_dpan_sse3 _op_blend_pt_p_caa_dpan_sse3 +#define _op_blend_rel_pt_pas_caa_dpan_sse3 _op_blend_pt_pas_caa_dpan_sse3 +#define _op_blend_rel_pt_pan_caa_dpan_sse3 _op_blend_pt_pan_caa_dpan_sse3 + +static void +init_blend_rel_pixel_color_pt_funcs_sse3(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_pt_p_c_dp_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_pt_pas_c_dp_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_SSE3] = _op_blend_rel_pt_pan_c_dp_sse3; + op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_rel_pt_p_can_dp_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_rel_pt_pas_can_dp_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_SSE3] = _op_blend_rel_pt_pan_can_dp_sse3; + op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_pt_p_caa_dp_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_pt_pas_caa_dp_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_SSE3] = _op_blend_rel_pt_pan_caa_dp_sse3; + + op_blend_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_pt_p_c_dpan_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pas_c_dpan_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pan_c_dpan_sse3; + op_blend_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_pt_p_can_dpan_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pas_can_dpan_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pan_can_dpan_sse3; + op_blend_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_pt_p_caa_dpan_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pas_caa_dpan_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pan_caa_dpan_sse3; +} + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c new file mode 100644 index 0000000..9b5abe6 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_i386.c @@ -0,0 +1,217 @@ +/* blend pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + _op_blend_p_dp_mmx(s, m, c, d, l); + return; + 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 __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c new file mode 100644 index 0000000..a9d0f4b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_.c @@ -0,0 +1,189 @@ +/* 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; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + alpha = 256 - (*s >> 24); + *d = *s + MUL_256(alpha, *d); + break; + default: + c = MUL_SYM(alpha, *s); + alpha = 256 - (c >> 24); + *d = c + MUL_256(alpha, *d); + break; + } + m++; s++; d++; + }); +} + +static void +_op_blend_pas_mas_dp(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + alpha++; + *d = INTERP_256(alpha, *s, *d); + break; + } + m++; s++; d++; + }); +} + +static void +_op_blend_pan_mas_dp(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + alpha++; + *d = INTERP_256(alpha, *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 __UNUSED__, 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; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + c = MUL_SYM(*m, *s); + alpha = 256 - (c >> 24); + *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c new file mode 100644 index 0000000..4fa50a9 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_i386.c @@ -0,0 +1,157 @@ +/* blend pixel x mask --> dst */ + +#ifdef BUILD_MMX +static void +_op_blend_pas_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_neon.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_neon.c new file mode 100644 index 0000000..b252a67 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_neon.c @@ -0,0 +1,129 @@ +/* blend pixel x mask --> dst */ + +#ifdef BUILD_NEON +static void +_op_blend_pas_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + alpha++; + *d = INTERP_256(alpha, *s, *d); + break; + } + m++; s++; d++; + }); +} + +static void +_op_blend_pan_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + int alpha; + UNROLL8_PLD_WHILE(d, l, e, + { + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + alpha++; + *d = INTERP_256(alpha, *s, *d); + break; + } + m++; s++; d++; + }); +} + +#define _op_blend_p_mas_dp_neon _op_blend_pas_mas_dp_neon + +#define _op_blend_p_mas_dpan_neon _op_blend_p_mas_dp_neon +#define _op_blend_pan_mas_dpan_neon _op_blend_pan_mas_dp_neon +#define _op_blend_pas_mas_dpan_neon _op_blend_pas_mas_dp_neon + +static void +init_blend_pixel_mask_span_funcs_neon(void) +{ + op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_p_mas_dp_neon; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pas_mas_dp_neon; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pan_mas_dp_neon; + + op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_p_mas_dpan_neon; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pas_mas_dpan_neon; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pan_mas_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_pt_p_mas_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = MUL_SYM(m, s); + c = 256 - (s >> 24); + *d = s + MUL_256(c, *d); +} + +#define _op_blend_pt_pan_mas_dp_neon _op_blend_pt_p_mas_dp_neon +#define _op_blend_pt_pas_mas_dp_neon _op_blend_pt_p_mas_dp_neon + +#define _op_blend_pt_p_mas_dpan_neon _op_blend_pt_p_mas_dp_neon +#define _op_blend_pt_pas_mas_dpan_neon _op_blend_pt_pas_mas_dp_neon +#define _op_blend_pt_pan_mas_dpan_neon _op_blend_pt_pan_mas_dp_neon + +static void +init_blend_pixel_mask_pt_funcs_neon(void) +{ + op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_p_mas_dp_neon; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_pas_mas_dp_neon; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_blend_pt_pan_mas_dp_neon; + + op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_p_mas_dpan_neon; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pas_mas_dpan_neon; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pan_mas_dpan_neon; +} +#endif + +/*-----*/ + +/* blend_rel pixel x mask -> dst */ + +#ifdef BUILD_NEON + +#define _op_blend_rel_p_mas_dpan_neon _op_blend_p_mas_dpan_neon +#define _op_blend_rel_pas_mas_dpan_neon _op_blend_pas_mas_dpan_neon +#define _op_blend_rel_pan_mas_dpan_neon _op_blend_pan_mas_dpan_neon + +static void +init_blend_rel_pixel_mask_span_funcs_neon(void) +{ + op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_p_mas_dpan_neon; + op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pas_mas_dpan_neon; + op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pan_mas_dpan_neon; +} +#endif + +#ifdef BUILD_NEON + +#define _op_blend_rel_pt_p_mas_dpan_neon _op_blend_pt_p_mas_dpan_neon +#define _op_blend_rel_pt_pas_mas_dpan_neon _op_blend_pt_pas_mas_dpan_neon +#define _op_blend_rel_pt_pan_mas_dpan_neon _op_blend_pt_pan_mas_dpan_neon + +static void +init_blend_rel_pixel_mask_pt_funcs_neon(void) +{ + op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_mas_dpan_neon; + op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_mas_dpan_neon; + op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_mas_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_sse3.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_sse3.c new file mode 100644 index 0000000..617b9e2 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_mask_sse3.c @@ -0,0 +1,300 @@ +/* blend pixel x mask --> dst */ + +#ifdef BUILD_SSE3 + +static void +_op_blend_p_mas_dp_sse3(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + + int alpha; + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + alpha = *m; + c = MUL_SYM(alpha, *s); + alpha = 256 - (c >> 24); + *d = c + MUL_256(alpha, *d); + m++; s++; d++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + + __m128i c0 = mul_sym_sse3(m0, s0); + __m128i a0 = sub4_alpha_sse3(c0); + __m128i r0 = mul_256_sse3(a0, d0); + + r0 = _mm_add_epi32(r0, c0); + + _mm_store_si128((__m128i *)d, r0); + + m += 4; s += 4; d += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + __m128i m1 = _mm_set_epi32(m[7], m[6], m[5], m[4]); + + __m128i c0 = mul_sym_sse3(m0, s0); + __m128i c1 = mul_sym_sse3(m1, s1); + + __m128i a0 = sub4_alpha_sse3(c0); + __m128i a1 = sub4_alpha_sse3(c1); + + __m128i r0 = mul_256_sse3(a0, d0); + __m128i r1 = mul_256_sse3(a1, d1); + + r0 = _mm_add_epi32(r0, c0); + r1 = _mm_add_epi32(r1, c1); + + _mm_store_si128((__m128i *)d, r0); + _mm_store_si128((__m128i *)(d+4), r1); + + m += 8; s += 8; d += 8; l -= 8; + }) +} + +static void +_op_blend_pas_mas_dp_sse3(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + + const __m128i ones = _mm_set_epi32(1, 1, 1, 1); + int alpha; + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + alpha = *m; + switch(alpha) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + alpha++; + *d = INTERP_256(alpha, *s, *d); + break; + } + m++; s++; d++; l--; + }, + { /*A4OP */ + + if ((m[3] | m[2] | m[1] | m[0]) == 0) { + m += 4; s += 4; d += 4; l -= 4; + continue; + } + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + + __m128i zm0 = _mm_cmpeq_epi32(m0, _mm_setzero_si128()); + + m0 = _mm_add_epi32(m0, ones); + + __m128i r0 = interp4_256_sse3(m0, s0, d0); + + r0 = _mm_and_si128(~zm0, r0); + d0 = _mm_and_si128(zm0, d0); + + d0 = _mm_add_epi32(r0, d0); + + _mm_store_si128((__m128i *)d, d0); + + m += 4; s += 4; d += 4; l -= 4; + }, + { /* A8OP */ + + if ((m[7] | m[6] | m[5] | m[4] | m[3] | m[2] | m[1] | m[0]) == 0) { + m += 8; s += 8; d += 8; l -= 8; + continue; + } + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + __m128i m1 = _mm_set_epi32(m[7], m[6], m[5], m[4]); + + __m128i zm0 = _mm_cmpeq_epi32(m0, _mm_setzero_si128()); + __m128i zm1 = _mm_cmpeq_epi32(m1, _mm_setzero_si128()); + + m0 = _mm_add_epi32(m0, ones); + m1 = _mm_add_epi32(m1, ones); + + __m128i r0 = interp4_256_sse3(m0, s0, d0); + __m128i r1 = interp4_256_sse3(m1, s1, d1); + + r0 = _mm_and_si128(~zm0, r0); + d0 = _mm_and_si128(zm0, d0); + + r1 = _mm_and_si128(~zm1, r1); + d1 = _mm_and_si128(zm1, d1); + + d0 = _mm_add_epi32(d0, r0); + d1 = _mm_add_epi32(d1, r1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + m += 8; s += 8; d += 8; l -= 8; + }) +} + +#define _op_blend_pan_mas_dp_sse3 _op_blend_pas_mas_dp_sse3 + +#define _op_blend_p_mas_dpan_sse3 _op_blend_p_mas_dp_sse3 +#define _op_blend_pas_mas_dpan_sse3 _op_blend_pas_mas_dp_sse3 +#define _op_blend_pan_mas_dpan_sse3 _op_blend_pan_mas_dp_sse3 + +static void +init_blend_pixel_mask_span_funcs_sse3(void) +{ + op_blend_span_funcs[SP][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_p_mas_dp_sse3; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_pas_mas_dp_sse3; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_pan_mas_dp_sse3; + + op_blend_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_p_mas_dpan_sse3; + op_blend_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_pas_mas_dpan_sse3; + op_blend_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_pan_mas_dpan_sse3; +} + +#define _op_blend_pt_p_mas_dp_sse3 NULL +#define _op_blend_pt_pan_mas_dp_sse3 NULL + +#define _op_blend_pt_pas_mas_dp_sse3 _op_blend_pt_p_mas_dp_sse3 + +#define _op_blend_pt_p_mas_dpan_sse3 _op_blend_pt_p_mas_dp_sse3 +#define _op_blend_pt_pas_mas_dpan_sse3 _op_blend_pt_pas_mas_dp_sse3 +#define _op_blend_pt_pan_mas_dpan_sse3 _op_blend_pt_pan_mas_dp_sse3 + +static void +init_blend_pixel_mask_pt_funcs_sse3(void) +{ + op_blend_pt_funcs[SP][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_pt_p_mas_dp_sse3; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_pt_pas_mas_dp_sse3; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_pt_pan_mas_dp_sse3; + + op_blend_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_pt_p_mas_dpan_sse3; + op_blend_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_pt_pas_mas_dpan_sse3; + op_blend_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_pt_pan_mas_dpan_sse3; +} + +/*-----*/ + +/* blend_rel pixel x mask -> dst */ + +static void +_op_blend_rel_p_mas_dp_sse3(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + + int alpha; + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + c = MUL_SYM(*m, *s); + alpha = 256 - (c >> 24); + *d = MUL_SYM(*d >> 24, c) + MUL_256(alpha, *d); + d++; m++; s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i c0 = mul_sym_sse3(m0, s0); + __m128i a0 = sub4_alpha_sse3(c0); + + __m128i l0 = mul_sym_sse3(_mm_srli_epi32(d0, 24), c0); + __m128i r0 = mul_256_sse3(a0, d0); + + d0 = _mm_add_epi32(l0, r0); + + _mm_store_si128((__m128i *)d, d0); + + d += 4; m += 4; s += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i m0 = _mm_set_epi32(m[3], m[2], m[1], m[0]); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i m1 = _mm_set_epi32(m[7], m[6], m[5], m[4]); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i c0 = mul_sym_sse3(m0, s0); + __m128i c1 = mul_sym_sse3(m1, s1); + + __m128i a0 = sub4_alpha_sse3(c0); + __m128i a1 = sub4_alpha_sse3(c1); + + __m128i l0 = mul_sym_sse3(_mm_srli_epi32(d0, 24), c0); + __m128i r0 = mul_256_sse3(a0, d0); + + __m128i l1 = mul_sym_sse3(_mm_srli_epi32(d1, 24), c1); + __m128i r1 = mul_256_sse3(a1, d1); + + d0 = _mm_add_epi32(l0, r0); + d1 = _mm_add_epi32(l1, r1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + d += 8; m += 8; s += 8; l -= 8; + }) +} + +#define _op_blend_rel_pas_mas_dp_sse3 _op_blend_rel_p_mas_dp_sse3 +#define _op_blend_rel_pan_mas_dp_sse3 _op_blend_rel_p_mas_dp_sse3 + +#define _op_blend_rel_p_mas_dpan_sse3 _op_blend_p_mas_dpan_sse3 +#define _op_blend_rel_pas_mas_dpan_sse3 _op_blend_pas_mas_dpan_sse3 +#define _op_blend_rel_pan_mas_dpan_sse3 _op_blend_pan_mas_dpan_sse3 + +static void +init_blend_rel_pixel_mask_span_funcs_sse3(void) +{ + op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_p_mas_dp_sse3; + op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_pas_mas_dp_sse3; + op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_pan_mas_dp_sse3; + + op_blend_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_p_mas_dpan_sse3; + op_blend_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pas_mas_dpan_sse3; + op_blend_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pan_mas_dpan_sse3; +} + +#define _op_blend_rel_pt_p_mas_dp_sse3 NULL + +#define _op_blend_rel_pt_pas_mas_dp_sse3 _op_blend_rel_pt_p_mas_dp_sse3 +#define _op_blend_rel_pt_pan_mas_dp_sse3 _op_blend_rel_pt_p_mas_dp_sse3 + +#define _op_blend_rel_pt_p_mas_dpan_sse3 _op_blend_pt_p_mas_dpan_sse3 +#define _op_blend_rel_pt_pas_mas_dpan_sse3 _op_blend_pt_pas_mas_dpan_sse3 +#define _op_blend_rel_pt_pan_mas_dpan_sse3 _op_blend_pt_pan_mas_dpan_sse3 + +static void +init_blend_rel_pixel_mask_pt_funcs_sse3(void) +{ + op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_pt_p_mas_dp_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_pt_pas_mas_dp_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_SSE3] = _op_blend_rel_pt_pan_mas_dp_sse3; + + op_blend_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pt_p_mas_dpan_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pas_mas_dpan_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pan_mas_dpan_sse3; +} + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_neon.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_neon.c new file mode 100644 index 0000000..1cb50b6 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_neon.c @@ -0,0 +1,530 @@ +/* blend pixel --> dst */ + +#ifdef BUILD_NEON +static void +_op_blend_p_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { +#define AP "blend_p_dp_" + asm volatile ( + ".fpu neon \n\t" + //** init + "vmov.i8 q8, $0x1 \n\t" + + AP "loopchoose: \n\t" + // If aligned already - straight to octs + "andS %[tmp], %[d],$0x1f \n\t" + "beq "AP"octloops \n\t" + + "andS %[tmp], %[d],$0xf \n\t" + "beq "AP"quadloops \n\t" + + "andS %[tmp], %[d],$0x4 \n\t" + "beq "AP"dualloop \n\t" + + // Only ever executes once, fall through to dual + AP "singleloop: \n\t" + "vld1.32 d0[0], [%[s]]! \n\t" + "vld1.32 d4[0], [%[d]] \n\t" + + "vmvn.u8 d8, d0 \n\t" + "vshr.u32 d8, d8, #24 \n\t" + + "vmul.u32 d8, d16, d8 \n\t" + + "vmull.u8 q6, d4,d8 \n\t" + "vqrshrn.u16 d8, q6, #8 \n\t" + // Add to 's' + "vqadd.u8 q2, q4,q0 \n\t" + + "vst1.32 d4[0], [%[d]] \n\t" + "add %[d], #4 \n\t" + + // Can we go the fast path? + "andS %[tmp], %[d],$0x1f \n\t" + "beq "AP"octloops \n\t" + + "andS %[tmp], %[d],$0x0f \n\t" + "beq "AP"quadloops \n\t" + + + AP "dualloop: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + AP "dualloopint: \n\t" + //** Dual Loop + "vldm %[s]!, {d0} \n\t" + "vldr d4, [%[d]] \n\t" + + "vmvn.u8 d8, d0 \n\t" + "vshr.u32 d8, d8, #24 \n\t" + + "vmul.u32 d8, d16, d8 \n\t" + + "vmull.u8 q6, d4,d8 \n\t" + "vqrshrn.u16 d8, q6, #8 \n\t" + // Add to 's' + "vqadd.u8 d4, d8,d0 \n\t" + "vstr d4, [%[d]] \n\t" + "add %[d], #8 \n\t" + + "ands %[tmp], %[d], $0x1f \n\t" + "beq "AP"octloops \n\t" + + AP"quadloops: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + "vldm %[s]!, {d0,d1) \n\t" + "vldm %[d], {d4,d5} \n\t" + + + // Copy s.a into q2 (>> 24) & subtract from 255 + "vmvn.u8 q4, q0 \n\t" + "vshr.u32 q4, q4,$0x18 \n\t" + + // Multiply into all fields + "vmul.u32 q4, q8,q4 \n\t" + + // a * d (clobbering 'd'/q7) + "vmull.u8 q6, d4,d8 \n\t" + "vmull.u8 q2, d5,d9 \n\t" + + // Shift & narrow it + "vqrshrn.u16 d8, q6, #8 \n\t" + "vqrshrn.u16 d9, q2, #8 \n\t" + + // Add to s + "vqadd.u8 q2, q4,q0 \n\t" + + // Write it + "vstm %[d]!, {d4,d5} \n\t" + + AP "octloops: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "ble "AP"loopout \n\t" + + "sub %[tmp],%[e],#64 \n\t" + + + AP "octloopint:\n\t" + //** Oct loop + "vldm %[s]!, {d0,d1,d2,d3) \n\t" + "vldm %[d], {d4,d5,d6,d7} \n\t" + "pld [%[s], #64] \n\t" + + + // Copy s.a into q2 (>> 24) & subtract from 255 + "vmvn.u8 q4, q0 \n\t" + "vmvn.u8 q5, q1 \n\t" + "vshr.u32 q4, q4,$0x18 \n\t" + "vshr.u32 q5, q5,$0x18\n\t" + + // Multiply into all fields + "vmul.u32 q4, q8,q4 \n\t" + "vmul.u32 q5, q8,q5 \n\t" + + + // a * d (clobbering 'd'/q7) + "vmull.u8 q6, d4,d8 \n\t" + "vmull.u8 q2, d5,d9 \n\t" + "vmull.u8 q7, d6,d10 \n\t" + "vmull.u8 q3, d7,d11 \n\t" + + "cmp %[tmp], %[d]\n\t" + + // Shift & narrow it + "vqrshrn.u16 d8, q6, #8 \n\t" + "vqrshrn.u16 d9, q2, #8 \n\t" + "vqrshrn.u16 d10, q7, #8 \n\t" + "vqrshrn.u16 d11, q3, #8 \n\t" + + + // Add to s + "vqadd.u8 q2, q4,q0 \n\t" + "vqadd.u8 q3, q5,q1 \n\t" + + // Write it + "vstm %[d]!, {d4,d5,d6,d7} \n\t" + + "bhi "AP"octloopint\n\t" + + AP "loopout: \n\t" + "cmp %[d], %[e] \n\t" + "beq "AP"done \n\t" + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],$0x04 \n\t" + "ble "AP"singleloop2 \n\t" + + AP "dualloop2: \n\t" + "sub %[tmp],%[e],$0x7 \n\t" + AP "dualloop2int: \n\t" + //** Trailing double + + "vldm %[s]!, {d0} \n\t" + "vldm %[d], {d4} \n\t" + + "vmvn.u8 d8, d0 \n\t" + "vshr.u32 d8, d8, #24 \n\t" + + "vmul.u32 d8, d16, d8 \n\t" + + "vmull.u8 q6, d4,d8 \n\t" + "vqrshrn.u16 d8, q6, #8 \n\t" + // Add to 's' + "vqadd.u8 d4, d8,d0 \n\t" + + "vstr.32 d4, [%[d]] \n\t" + "add %[d], #8 \n\t" + + "cmp %[tmp], %[d] \n\t" + "bhi "AP"dualloop2int \n\t" + + // Single ?? + "cmp %[e], %[d] \n\t" + "beq "AP"done \n\t" + + AP"singleloop2: \n\t" + "vld1.32 d0[0], [%[s]] \n\t" + "vld1.32 d4[0], [%[d]] \n\t" + + "vmvn.u8 d8, d0 \n\t" + "vshr.u32 d8, d8, #24 \n\t" + + "vmul.u32 d8, d8, d16 \n\t" + + "vmull.u8 q6, d8,d4 \n\t" + "vqrshrn.u16 d8, q6, #8 \n\t" + // Add to 's' + "vqadd.u8 d0, d0,d8 \n\t" + "vst1.32 d0[0], [%[d]] \n\t" + + //** Trailing single + + AP"done:\n\t" +//"sub %[tmp], %[e], #4 \n\t" +//"vmov.i32 d0, $0xffff0000 \n\t" +//"vst1.32 d0[0], [%[tmp]] \n\t" + + + : // output regs + // Input + : [e] "r" (d + l), [d] "r" (d), [s] "r" (s), [c] "r" (c), + [tmp] "r" (7) + : "q0", "q1", "q2","q3", "q4","q5","q6", "q7","q8","memory" // clobbered + ); +#undef AP + +} + +static void +_op_blend_pas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { +#define AP "blend_pas_dp_" + DATA32 *e = d + l,*tmp = e + 32,*pl=(void*)912; + asm volatile ( + ".fpu neon \n\t" + "vmov.i8 q8, #1 \n\t" + AP"loopchoose: \n\t" + // If aliged - go as fast we can + "andS %[tmp], %[d], #31 \n\t" + "beq "AP"quadstart \n\t" + + // See if we can at least do our double loop + "andS %[tmp], %[d], $0x7 \n\t" + "beq "AP"dualstart \n\t" + + // Ugly single word version + AP "singleloop: \n\t" + "vld1.32 d0[0], [%[s]]! \n\t" + "vld1.32 d4[0], [%[d]] \n\t" + + "vmvn.u8 d8, d0 \n\t" + + "vshr.u32 d8, d8,$0x18 \n\t" + + // Mulitply into all fields + "vmul.u32 d8, d8, d16 \n\t" + + // Multiply out + "vmull.u8 q6, d8, d4 \n\t" + + "vqrshrn.u16 d8, q6, #8 \n\t" + + // Add to s + "vqadd.u8 d0, d0,d8 \n\t" + "vst1.32 d0[0], [%[d]]! \n\t" + + AP"dualstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + // If aligned - go as fast we can + "andS %[tmp], %[d], #31 \n\t" + "beq "AP"quadstart \n\t" + + + AP"dualloop: \n\t" + + "vldm %[s]!, {d0) \n\t" + "vldm %[d], {d4} \n\t" + + // Subtract from 255 (ie negate) and extract alpha channel + "vmvn.u8 d8, d0 \n\t" + "vshr.u32 d8, d8,$0x18 \n\t" + + // Mulitply into all fields + "vmul.u32 d8, d8, d16 \n\t" + + // Multiply out + "vmull.u8 q6, d8, d4 \n\t" + + "vqrshrn.u16 d8, q6, #8 \n\t" + + // Add to s + "vqadd.u8 d0, d0,d8 \n\t" + "vstm %[d]!, {d0} \n\t" + + "andS %[tmp], %[d], $0x1f \n\t" + "bne "AP"dualloop \n\t" + + + AP"quadstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + "sub %[tmp], %[e], #31 \n\t" + + AP"quadloop:\n\t" + "vldm %[s]!, {d0,d1,d2,d3) \n\t" + "vldm %[d], {d4,d5,d6,d7} \n\t" + + // Subtract from 255 (ie negate) and extract alpha channel + "vmvn.u8 q4, q0 \n\t" + "vmvn.u8 q5, q1 \n\t" + "vshr.u32 q4, q4,$0x18 \n\t" + "vshr.u32 q5, q5,$0x18 \n\t" + + // Prepare to preload + "add %[pl], %[s], #32 \n\t" + + // Mulitply into all fields + "vmul.u32 q4, q4, q8 \n\t" + "vmul.u32 q5, q5, q8 \n\t" + "pld [%[pl]] \n\t" + + // Multiply out + "vmull.u8 q6, d8, d4 \n\t" + "vmull.u8 q7, d10, d6 \n\t" + "vmull.u8 q2, d9, d5 \n\t" + "vmull.u8 q3, d11, d7 \n\t" + + "add %[pl], %[d], #32 \n\t" + + "vqrshrn.u16 d8, q6, #8 \n\t" + "vqrshrn.u16 d10, q7, #8 \n\t" + "vqrshrn.u16 d9, q2, #8 \n\t" + "vqrshrn.u16 d11, q3, #8 \n\t" + "pld [%[pl]] \n\t" + + "cmp %[tmp], %[pl] \n\t" + // Add to s + "vqadd.u8 q0, q0,q4 \n\t" + "vqadd.u8 q1, q1,q5 \n\t" + + "vstm %[d]!, {d0,d1,d2,d3} \n\t" + + "bhi "AP"quadloop \n\t" + + AP "loopout: \n\t" + "cmp %[d], %[e] \n\t" + "beq "AP"done \n\t" + + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],$0x04 \n\t" + "beq "AP"singleloop2 \n\t" + + "sub %[tmp],%[e],$0x7 \n\t" + + AP"dualloop2: \n\t" + "vldm %[s]!, {d0) \n\t" + "vldm %[d], {d4} \n\t" + + // Subtract from 255 (ie negate) and extract alpha channel + "vmvn.u8 d8, d0 \n\t" + "vshr.u32 d8, d8,$0x18 \n\t" + + // Mulitply into all fields + "vmul.u32 d8, d8, d16 \n\t" + + // Multiply out + "vmull.u8 q6, d8, d4 \n\t" + + "vqrshrn.u16 d8, q6, #8 \n\t" + + // Add to s + "vqadd.u8 d0, d0,d8 \n\t" + + "vstm %[d]!, {d0} \n\t" + "cmp %[tmp], %[d] \n\t" + + "bhi "AP"dualloop2 \n\t" + + // Single ?? + "cmp %[e], %[d] \n\t" + "beq "AP"done \n\t" + + AP "singleloop2: \n\t" + "vld1.32 d0[0], [%[s]] \n\t" + "vld1.32 d4[0], [%[d]] \n\t" + + "vmvn.u8 d8, d0 \n\t" + + "vshr.u32 d8, d8,$0x18 \n\t" + + // Mulitply into all fields + "vmul.u32 d8, d8, d16 \n\t" + + // Multiply out + "vmull.u8 q6, d8, d4 \n\t" + + "vqrshrn.u16 d8, q6, #8 \n\t" + + // Add to s + "vqadd.u8 d0, d0,d8 \n\t" + + "vst1.32 d0[0], [%[d]] \n\t" + AP "done:\n\t" + + + : /* Out */ + : /* In */ [s] "r" (s), [e] "r" (e), [d] "r" (d), [tmp] "r" (tmp), + [pl] "r" (pl) + : /* Clobbered */ + "q0","q1","q2","q3","q4","q5","q6","q7","q8","memory" + ); +#undef AP +} + +#define _op_blend_pan_dp_neon NULL + +#define _op_blend_p_dpan_neon _op_blend_p_dp_neon +#define _op_blend_pas_dpan_neon _op_blend_pas_dp_neon +#define _op_blend_pan_dpan_neon _op_blend_pan_dp_neon + +static void +init_blend_pixel_span_funcs_neon(void) +{ + op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_p_dp_neon; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pas_dp_neon; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pan_dp_neon; + + op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_p_dpan_neon; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pas_dpan_neon; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pan_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_pt_p_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 256 - (s >> 24); + *d = s + MUL_256(c, *d); +} + + +#define _op_blend_pt_pan_dp_neon NULL +#define _op_blend_pt_pas_dp_neon _op_blend_pt_p_dp_neon + +#define _op_blend_pt_p_dpan_neon _op_blend_pt_p_dp_neon +#define _op_blend_pt_pan_dpan_neon _op_blend_pt_pan_dp_neon +#define _op_blend_pt_pas_dpan_neon _op_blend_pt_pas_dp_neon + +static void +init_blend_pixel_pt_funcs_neon(void) +{ + op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_p_dp_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_pas_dp_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_pt_pan_dp_neon; + + op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_p_dpan_neon; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pas_dpan_neon; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_pt_pan_dpan_neon; +} +#endif + +/*-----*/ + +/* blend_rel pixel -> dst */ + +#ifdef BUILD_NEON +static void +_op_blend_rel_p_dp_neon(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_neon(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_neon _op_blend_rel_p_dp_neon + +#define _op_blend_rel_p_dpan_neon _op_blend_p_dpan_neon +#define _op_blend_rel_pan_dpan_neon _op_blend_pan_dpan_neon +#define _op_blend_rel_pas_dpan_neon _op_blend_pas_dpan_neon + +static void +init_blend_rel_pixel_span_funcs_neon(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_p_dp_neon; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pas_dp_neon; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pan_dp_neon; + + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_p_dpan_neon; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pas_dpan_neon; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pan_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_blend_rel_pt_p_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + c = 256 - (s >> 24); + *d = MUL_SYM(*d >> 24, s) + MUL_256(c, *d); +} + +#define _op_blend_rel_pt_pas_dp_neon _op_blend_rel_pt_p_dp_neon +#define _op_blend_rel_pt_pan_dp_neon _op_blend_rel_pt_p_dp_neon + +#define _op_blend_rel_pt_p_dpan_neon _op_blend_pt_p_dpan_neon +#define _op_blend_rel_pt_pas_dpan_neon _op_blend_pt_pas_dpan_neon +#define _op_blend_rel_pt_pan_dpan_neon _op_blend_pt_pan_dpan_neon + +static void +init_blend_rel_pixel_pt_funcs_neon(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_p_dp_neon; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_pas_dp_neon; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_blend_rel_pt_pan_dp_neon; + + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_p_dpan_neon; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pas_dpan_neon; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_blend_rel_pt_pan_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_sse3.c b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_sse3.c new file mode 100644 index 0000000..2e72fec --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend/op_blend_pixel_sse3.c @@ -0,0 +1,316 @@ +/* blend pixel --> dst */ + +#ifdef BUILD_SSE3 + +static void +_op_blend_p_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + int alpha = 256 - (*s >> 24); + *d = *s + MUL_256(alpha, *d); + s++; d++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i a0 = sub4_alpha_sse3(s0); + __m128i mul0 = mul_256_sse3(a0, d0); + d0 = _mm_add_epi32(mul0, s0); + + _mm_store_si128((__m128i *)d, d0); + + s += 4; d += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i a0 = sub4_alpha_sse3(s0); + __m128i a1 = sub4_alpha_sse3(s1); + + __m128i mul0 = mul_256_sse3(a0, d0); + __m128i mul1 = mul_256_sse3(a1, d1); + + d0 = _mm_add_epi32(mul0, s0); + d1 = _mm_add_epi32(mul1, s1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + s += 8; d += 8; l -= 8; + }) +} + +static void +_op_blend_pas_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + + int alpha; + + const __m128i zero = _mm_setzero_si128(); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + switch (*s & 0xff000000) + { + case 0: + break; + case 0xff000000: + *d = *s; + break; + default: + alpha = 256 - (*s >> 24); + *d = *s + MUL_256(alpha, *d); + break; + } + s++; d++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i a0 = sub4_alpha_sse3(s0); + __m128i mul0 = mul_256_sse3(a0, d0); + + mul0 = _mm_add_epi32(s0, mul0); + + __m128i zmask0 = _mm_cmpeq_epi32(_mm_srli_epi32(s0, 24), zero); + __m128i imask0 = ~zmask0; + + mul0 = _mm_and_si128(imask0, mul0); + d0 = _mm_and_si128(zmask0, d0); + + d0 = _mm_add_epi32(mul0, d0); + + _mm_store_si128((__m128i *)d, d0); + + s += 4; d += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128((__m128i *)(d+4)); + + __m128i a0 = sub4_alpha_sse3(s0); + __m128i a1 = sub4_alpha_sse3(s1); + + __m128i mul0 = mul_256_sse3(a0, d0); + __m128i mul1 = mul_256_sse3(a1, d1); + + mul0 = _mm_add_epi32(s0, mul0); + mul1 = _mm_add_epi32(s1, mul1); + + __m128i zmask0 = _mm_cmpeq_epi32(_mm_srli_epi32(s0, 24), zero); + __m128i zmask1 = _mm_cmpeq_epi32(_mm_srli_epi32(s1, 24), zero); + + __m128i imask0 = ~zmask0; + __m128i imask1 = ~zmask1; + + mul0 = _mm_and_si128(imask0, mul0); + d0 = _mm_and_si128(zmask0, d0); + + mul1 = _mm_and_si128(imask1, mul1); + d1 = _mm_and_si128(zmask1, d1); + + d0 = _mm_add_epi32(mul0, d0); + d1 = _mm_add_epi32(mul1, d1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + s += 8; d += 8; l -= 8; + }) +} + +#define _op_blend_pan_dp_sse3 NULL + +#define _op_blend_p_dpan_sse3 _op_blend_p_dp_sse3 +#define _op_blend_pas_dpan_sse3 _op_blend_pas_dp_sse3 +#define _op_blend_pan_dpan_sse3 _op_blend_pan_dp_sse3 + +static void +init_blend_pixel_span_funcs_sse3(void) +{ + op_blend_span_funcs[SP][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_p_dp_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_pas_dp_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_pan_dp_sse3; + + +// FIXME: BUGGY BUGGY Core i5 750 (32bit), 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4), ello (text and rectangle) +// op_blend_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_p_dpan_sse3; + op_blend_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_pas_dpan_sse3; + op_blend_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_pan_dpan_sse3; +} + +#define _op_blend_pt_p_dp_sse3 NULL + +#define _op_blend_pt_pas_dp_sse3 _op_blend_pt_p_dp_sse3 +#define _op_blend_pt_pan_dp_sse3 NULL + +#define _op_blend_pt_p_dpan_sse3 _op_blend_pt_p_dp_sse3 +#define _op_blend_pt_pan_dpan_sse3 _op_blend_pt_pan_dp_sse3 +#define _op_blend_pt_pas_dpan_sse3 _op_blend_pt_pas_dp_sse3 + +static void +init_blend_pixel_pt_funcs_sse3(void) +{ + op_blend_pt_funcs[SP][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_pt_p_dp_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_pt_pas_dp_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_pt_pan_dp_sse3; + + op_blend_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_pt_p_dpan_sse3; + op_blend_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_pt_pas_dpan_sse3; + op_blend_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_pt_pan_dpan_sse3; +} + +/*-----*/ + +/* blend_rel pixel -> dst */ + +static void +_op_blend_rel_p_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + const __m128i ones = _mm_set_epi32(1, 1, 1, 1); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + int alpha = 256 - (*s >> 24); + c = 1 + (*d >> 24); + *d = MUL_256(c, *s) + MUL_256(alpha, *d); + d++; s++; l--; + }, + { /*A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i c0 = _mm_add_epi32(_mm_srli_epi32(d0, 24), ones); + __m128i a0 = sub4_alpha_sse3(s0); + + d0 = _mm_add_epi32(mul_256_sse3(c0, s0), mul_256_sse3(a0, d0)); + + _mm_store_si128((__m128i *)d, d0); + + d += 4; s += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128 ((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128 ((__m128i *)(d+4)); + + __m128i c0 = _mm_add_epi32(_mm_srli_epi32(d0, 24), ones); + __m128i c1 = _mm_add_epi32(_mm_srli_epi32(d1, 24), ones); + + __m128i a0 = sub4_alpha_sse3(s0); + __m128i a1 = sub4_alpha_sse3(s1); + + d0 = _mm_add_epi32(mul_256_sse3(c0, s0), mul_256_sse3(a0, d0)); + d1 = _mm_add_epi32(mul_256_sse3(c1, s1), mul_256_sse3(a1, d1)); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + d += 8; s += 8; l -= 8; + }) +} + +static void +_op_blend_rel_pan_dp_sse3(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + + const __m128i ones = _mm_set_epi32(1, 1, 1, 1); + + LOOP_ALIGNED_U1_A48_SSE3(d, l, + { /* UOP */ + + c = 1 + (*d >> 24); + *d++ = MUL_256(c, *s); + s++; l--; + }, + { /* A4OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128((__m128i *)d); + + __m128i c0 = _mm_add_epi32(_mm_srli_epi32(d0, 24), ones); + d0 = mul_256_sse3(c0, s0); + + _mm_store_si128((__m128i *)d, d0); + + d += 4; s += 4; l -= 4; + }, + { /* A8OP */ + + __m128i s0 = _mm_lddqu_si128((__m128i *)s); + __m128i d0 = _mm_load_si128 ((__m128i *)d); + + __m128i s1 = _mm_lddqu_si128((__m128i *)(s+4)); + __m128i d1 = _mm_load_si128 ((__m128i *)(d+4)); + + __m128i c0 = _mm_add_epi32(_mm_srli_epi32(d0, 24), ones); + __m128i c1 = _mm_add_epi32(_mm_srli_epi32(d1, 24), ones); + + d0 = mul_256_sse3(c0, s0); + d1 = mul_256_sse3(c1, s1); + + _mm_store_si128((__m128i *)d, d0); + _mm_store_si128((__m128i *)(d+4), d1); + + d += 8; s += 8; l -= 8; + }) +} + +#define _op_blend_rel_pas_dp_sse3 _op_blend_rel_p_dp_sse3 + +#define _op_blend_rel_p_dpan_sse3 _op_blend_p_dpan_sse3 +#define _op_blend_rel_pan_dpan_sse3 _op_blend_pan_dpan_sse3 +#define _op_blend_rel_pas_dpan_sse3 _op_blend_pas_dpan_sse3 + +static void +init_blend_rel_pixel_span_funcs_sse3(void) +{ + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_rel_p_dp_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_rel_pas_dp_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_rel_pan_dp_sse3; + + op_blend_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_p_dpan_sse3; + op_blend_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pas_dpan_sse3; + op_blend_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pan_dpan_sse3; +} + +#define _op_blend_rel_pt_p_dp_sse3 NULL +#define _op_blend_rel_pt_pan_dp_sse3 NULL + +#define _op_blend_rel_pt_pas_dp_sse3 _op_blend_rel_pt_p_dp_sse3 + +#define _op_blend_rel_pt_p_dpan_sse3 _op_blend_pt_p_dpan_sse3 +#define _op_blend_rel_pt_pan_dpan_sse3 _op_blend_pt_pan_dpan_sse3 +#define _op_blend_rel_pt_pas_dpan_sse3 _op_blend_pt_pas_dpan_sse3 + +static void +init_blend_rel_pixel_pt_funcs_sse3(void) +{ + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_rel_pt_p_dp_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_rel_pt_pas_dp_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_SSE3] = _op_blend_rel_pt_pan_dp_sse3; + + op_blend_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pt_p_dpan_sse3; + op_blend_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pas_dpan_sse3; + op_blend_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_SSE3] = _op_blend_rel_pt_pan_dpan_sse3; +} + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_blend_main_.c b/libraries/evas/src/lib/engines/common/evas_op_blend_main_.c new file mode 100644 index 0000000..a1a5de8 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_blend_main_.c @@ -0,0 +1,671 @@ +#include "evas_common.h" + +RGBA_Gfx_Func op_blend_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +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); +} + + +RGBA_Gfx_Func op_blend_rel_span_funcs[SP_LAST][SM_LAST][SC_LAST][DP_LAST][CPU_LAST]; +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" + +# include "./evas_op_blend/op_blend_pixel_neon.c" +# include "./evas_op_blend/op_blend_color_neon.c" +# include "./evas_op_blend/op_blend_pixel_color_neon.c" +# include "./evas_op_blend/op_blend_pixel_mask_neon.c" +# include "./evas_op_blend/op_blend_mask_color_neon.c" +//# include "./evas_op_blend/op_blend_pixel_mask_color_neon.c" + +#ifdef BUILD_SSE3 +void evas_common_op_blend_init_sse3(void); +#endif + +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_SSE3 + evas_common_op_blend_init_sse3(); +#endif +#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_NEON + init_blend_pixel_span_funcs_neon(); + init_blend_pixel_color_span_funcs_neon(); + init_blend_pixel_mask_span_funcs_neon(); + init_blend_color_span_funcs_neon(); + init_blend_mask_color_span_funcs_neon(); + + init_blend_pixel_pt_funcs_neon(); + init_blend_pixel_color_pt_funcs_neon(); + init_blend_pixel_mask_pt_funcs_neon(); + init_blend_color_pt_funcs_neon(); + init_blend_mask_color_pt_funcs_neon(); +#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_SSE3 + if (evas_common_cpu_has_feature(CPU_FEATURE_SSE3)) + { + cpu = CPU_SSE3; + func = op_blend_span_funcs[s][m][c][d][cpu]; + if(func) return func; + } +#endif +#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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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_SSE3 + if(evas_common_cpu_has_feature(CPU_FEATURE_SSE3)) + { + cpu = CPU_SSE3; + func = op_blend_pt_funcs[s][m][c][d][cpu]; + if(func) return func; + } +#endif +#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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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); +} + +void evas_common_op_blend_rel_init_sse3(void); + +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_SSE3 + evas_common_op_blend_rel_init_sse3(); +#endif +#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_NEON + init_blend_rel_pixel_span_funcs_neon(); + init_blend_rel_pixel_color_span_funcs_neon(); + init_blend_rel_pixel_mask_span_funcs_neon(); + init_blend_rel_color_span_funcs_neon(); + init_blend_rel_mask_color_span_funcs_neon(); + + init_blend_rel_pixel_pt_funcs_neon(); + init_blend_rel_pixel_color_pt_funcs_neon(); + init_blend_rel_pixel_mask_pt_funcs_neon(); + init_blend_rel_color_pt_funcs_neon(); + init_blend_rel_mask_color_pt_funcs_neon(); +#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_SSE3 + if (evas_common_cpu_has_feature(CPU_FEATURE_SSE3)) + { + cpu = CPU_SSE3; + func = op_blend_rel_span_funcs[s][m][c][d][cpu]; + if(func) return func; + } +#endif +#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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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_SSE3 + if (evas_common_cpu_has_feature(CPU_FEATURE_SSE3)) + { + cpu = CPU_SSE3; + func = op_blend_rel_pt_funcs[s][m][c][d][cpu]; + if(func) return func; + } +#endif +#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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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/libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.am b/libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.am new file mode 100644 index 0000000..599e98d --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.am @@ -0,0 +1,18 @@ +MAINTAINERCLEANFILES = Makefile.in + +EXTRA_DIST = \ +op_copy_color_.c \ +op_copy_color_i386.c \ +op_copy_color_neon.c \ +op_copy_mask_color_.c \ +op_copy_mask_color_i386.c \ +op_copy_mask_color_neon.c \ +op_copy_pixel_.c \ +op_copy_pixel_neon.c \ +op_copy_pixel_color_.c \ +op_copy_pixel_color_i386.c \ +op_copy_pixel_color_neon.c \ +op_copy_pixel_i386.c \ +op_copy_pixel_mask_.c \ +op_copy_pixel_mask_i386.c \ +op_copy_pixel_mask_neon.c diff --git a/libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.in b/libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.in new file mode 100644 index 0000000..52658a4 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/Makefile.in @@ -0,0 +1,548 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/engines/common/evas_op_copy +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +EXTRA_DIST = \ +op_copy_color_.c \ +op_copy_color_i386.c \ +op_copy_color_neon.c \ +op_copy_mask_color_.c \ +op_copy_mask_color_i386.c \ +op_copy_mask_color_neon.c \ +op_copy_pixel_.c \ +op_copy_pixel_neon.c \ +op_copy_pixel_color_.c \ +op_copy_pixel_color_i386.c \ +op_copy_pixel_color_neon.c \ +op_copy_pixel_i386.c \ +op_copy_pixel_mask_.c \ +op_copy_pixel_mask_i386.c \ +op_copy_pixel_mask_neon.c + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_copy/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_copy/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_.c new file mode 100644 index 0000000..0178358 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_.c @@ -0,0 +1,138 @@ +/* copy color --> dst */ + +#ifdef BUILD_C +static void +_op_copy_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d = c; + d++; + }); +} + +#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 __UNUSED__, DATA8 m __UNUSED__, 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 __UNUSED__, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL_SYM(*d >> 24, c); + d++; + }); +} + + +#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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c new file mode 100644 index 0000000..d864d92 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_i386.c @@ -0,0 +1,150 @@ +/* copy color --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 m __UNUSED__, 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 __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_neon.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_neon.c new file mode 100644 index 0000000..96310cd --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_color_neon.c @@ -0,0 +1,212 @@ +/* copy color --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { +#define AP "COPY_C_DP_" + uint32_t *e = d + l,*tmp; + asm volatile ( + ".fpu neon \n\t" + + "vdup.i32 q0, %[c] \n\t" + + // Can we do 32 byte? + "andS %[tmp], %[d], $0x1f \n\t" + "beq "AP"quadstart \n\t" + + // Can we do at least 16 byte? + "andS %[tmp], %[d], $0x4 \n\t" + "beq "AP"dualstart \n\t" + + // Only once + AP"singleloop: \n\t" + "vst1.32 d0[0], [%[d]] \n\t" + "add %[d], #4 \n\t" + + // Up to 3 times + AP"dualstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + AP"dualloop: \n\t" + "vstr.32 d0, [%[d]] \n\t" + + "add %[d], #8 \n\t" + "andS %[tmp], %[d], $0x1f \n\t" + "bne "AP"dualloop \n\t" + + + AP"quadstart: \n\t" + "sub %[tmp], %[e], %[d] \n\t" + "cmp %[tmp], #32 \n\t" + "blt "AP"loopout \n\t" + + "vmov q1, q0 \n\t" + "sub %[tmp],%[e],#31 \n\t" + + AP "quadloop: \n\t" + "vstm %[d]!, {d0,d1,d2,d3} \n\t" + + "cmp %[tmp], %[d] \n\t" + "bhi "AP"quadloop \n\t" + + + AP "loopout: \n\t" + "cmp %[d], %[e] \n\t" + "beq "AP"done \n\t" + "sub %[tmp],%[e], %[d] \n\t" + "cmp %[tmp],$0x04 \n\t" + "beq "AP"singleloop2 \n\t" + + AP "dualloop2: \n\t" + "sub %[tmp],%[e],#7 \n\t" + AP "dualloop2int: \n\t" + "vstr.64 d0, [%[d]] \n\t" + + "add %[d], #8 \n\t" + "cmp %[tmp], %[d] \n\t" + "bhi "AP"dualloop2int \n\t" + + // Single ?? + "cmp %[e], %[d] \n\t" + "beq "AP"done \n\t" + + AP "singleloop2: \n\t" + "vst1.32 d0[0], [%[d]] \n\t" + + AP "done:\n\t" + + : // No output regs + // Input + : [c] "r" (c), [e] "r" (e), [d] "r" (d),[tmp] "r" (tmp) + // Clobbered + : "q0","q1","memory" + + + ); +} + +#define _op_copy_cn_dp_neon _op_copy_c_dp_neon +#define _op_copy_can_dp_neon _op_copy_c_dp_neon +#define _op_copy_caa_dp_neon _op_copy_c_dp_neon + +#define _op_copy_cn_dpan_neon _op_copy_c_dp_neon +#define _op_copy_c_dpan_neon _op_copy_c_dp_neon +#define _op_copy_can_dpan_neon _op_copy_c_dp_neon +#define _op_copy_caa_dpan_neon _op_copy_c_dp_neon + +static void +init_copy_color_span_funcs_neon(void) +{ + op_copy_span_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_cn_dp_neon; + op_copy_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_c_dp_neon; + op_copy_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_can_dp_neon; + op_copy_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_caa_dp_neon; + + op_copy_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_cn_dpan_neon; + op_copy_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_c_dpan_neon; + op_copy_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_can_dpan_neon; + op_copy_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_pt_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = c; +} + +#define _op_copy_pt_cn_dp_neon _op_copy_pt_c_dp_neon +#define _op_copy_pt_can_dp_neon _op_copy_pt_c_dp_neon +#define _op_copy_pt_caa_dp_neon _op_copy_pt_c_dp_neon + +#define _op_copy_pt_cn_dpan_neon _op_copy_pt_c_dp_neon +#define _op_copy_pt_c_dpan_neon _op_copy_pt_c_dp_neon +#define _op_copy_pt_can_dpan_neon _op_copy_pt_c_dp_neon +#define _op_copy_pt_caa_dpan_neon _op_copy_pt_c_dp_neon + +static void +init_copy_color_pt_funcs_neon(void) +{ + op_copy_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_cn_dp_neon; + op_copy_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_c_dp_neon; + op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_can_dp_neon; + op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_caa_dp_neon; + + op_copy_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_cn_dpan_neon; + op_copy_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_c_dpan_neon; + op_copy_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_can_dpan_neon; + op_copy_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_caa_dpan_neon; +} +#endif + +/*-----*/ + +/* copy_rel color --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_rel_c_dp_neon(DATA32 *s, DATA8 *m, DATA32 c, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e = d + l; + for (; d < e; d++) { + *d = MUL_SYM(*d >> 24, c); + } +} + +#define _op_copy_rel_cn_dp_neon _op_copy_rel_c_dp_neon +#define _op_copy_rel_can_dp_neon _op_copy_rel_c_dp_neon +#define _op_copy_rel_caa_dp_neon _op_copy_rel_c_dp_neon + +#define _op_copy_rel_cn_dpan_neon _op_copy_cn_dpan_neon +#define _op_copy_rel_c_dpan_neon _op_copy_c_dpan_neon +#define _op_copy_rel_can_dpan_neon _op_copy_can_dpan_neon +#define _op_copy_rel_caa_dpan_neon _op_copy_caa_dpan_neon + +static void +init_copy_rel_color_span_funcs_neon(void) +{ + op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_cn_dp_neon; + op_copy_rel_span_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_c_dp_neon; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_can_dp_neon; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_caa_dp_neon; + + op_copy_rel_span_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_cn_dpan_neon; + op_copy_rel_span_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_c_dpan_neon; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_can_dpan_neon; + op_copy_rel_span_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_rel_pt_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + s = 1 + (*d >> 24); + *d = MUL_256(s, c); +} + + +#define _op_copy_rel_pt_cn_dp_neon _op_copy_rel_pt_c_dp_neon +#define _op_copy_rel_pt_can_dp_neon _op_copy_rel_pt_c_dp_neon +#define _op_copy_rel_pt_caa_dp_neon _op_copy_rel_pt_c_dp_neon + +#define _op_copy_rel_pt_cn_dpan_neon _op_copy_pt_cn_dpan_neon +#define _op_copy_rel_pt_c_dpan_neon _op_copy_pt_c_dpan_neon +#define _op_copy_rel_pt_can_dpan_neon _op_copy_pt_can_dpan_neon +#define _op_copy_rel_pt_caa_dpan_neon _op_copy_pt_caa_dpan_neon + +static void +init_copy_rel_color_pt_funcs_neon(void) +{ + op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_cn_dp_neon; + op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_c_dp_neon; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_can_dp_neon; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_caa_dp_neon; + + op_copy_rel_pt_funcs[SP_N][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_cn_dpan_neon; + op_copy_rel_pt_funcs[SP_N][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_c_dpan_neon; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_can_dpan_neon; + op_copy_rel_pt_funcs[SP_N][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_caa_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c new file mode 100644 index 0000000..c03a843 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_.c @@ -0,0 +1,170 @@ +/* copy mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_copy_mas_c_dp(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + case 0: + break; + case 255: + *d = c; + break; + default: + color++; + *d = INTERP_256(color, 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 __UNUSED__, 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 __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + case 0: + break; + case 255: + color = 1 + (*d >> 24); + *d = MUL_256(color, c); + break; + default: + { + DATA32 da = 1 + (*d >> 24); + da = MUL_256(da, c); + color++; + *d = INTERP_256(color, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c new file mode 100644 index 0000000..e27493f --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_i386.c @@ -0,0 +1,193 @@ +/* copy mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_mas_c_dp_mmx(DATA32 *s __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c new file mode 100644 index 0000000..dc7f78f --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_mask_color_neon.c @@ -0,0 +1,170 @@ +/* copy mask x color -> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + case 0: + break; + case 255: + *d = c; + break; + default: + color++; + *d = INTERP_256(color, c, *d); + break; + } + m++; d++; + }); +} + +#define _op_copy_mas_cn_dp_neon _op_copy_mas_c_dp_neon +#define _op_copy_mas_can_dp_neon _op_copy_mas_c_dp_neon +#define _op_copy_mas_caa_dp_neon _op_copy_mas_c_dp_neon + +#define _op_copy_mas_c_dpan_neon _op_copy_mas_c_dp_neon +#define _op_copy_mas_cn_dpan_neon _op_copy_mas_c_dpan_neon +#define _op_copy_mas_can_dpan_neon _op_copy_mas_c_dpan_neon +#define _op_copy_mas_caa_dpan_neon _op_copy_mas_c_dpan_neon + +static void +init_copy_mask_color_span_funcs_neon(void) +{ + op_copy_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_mas_cn_dp_neon; + op_copy_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_mas_c_dp_neon; + op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_mas_can_dp_neon; + op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_mas_caa_dp_neon; + + op_copy_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_mas_cn_dpan_neon; + op_copy_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_mas_c_dpan_neon; + op_copy_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_mas_can_dpan_neon; + op_copy_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_mas_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_pt_mas_c_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = INTERP_256(m + 1, c, *d); +} + +#define _op_copy_pt_mas_cn_dp_neon _op_copy_pt_mas_c_dp_neon +#define _op_copy_pt_mas_can_dp_neon _op_copy_pt_mas_c_dp_neon +#define _op_copy_pt_mas_caa_dp_neon _op_copy_pt_mas_c_dp_neon + +#define _op_copy_pt_mas_c_dpan_neon _op_copy_pt_mas_c_dp_neon +#define _op_copy_pt_mas_cn_dpan_neon _op_copy_pt_mas_c_dpan_neon +#define _op_copy_pt_mas_can_dpan_neon _op_copy_pt_mas_c_dpan_neon +#define _op_copy_pt_mas_caa_dpan_neon _op_copy_pt_mas_c_dpan_neon + +static void +init_copy_mask_color_pt_funcs_neon(void) +{ + op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_mas_cn_dp_neon; + op_copy_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_pt_mas_c_dp_neon; + op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_pt_mas_can_dp_neon; + op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_pt_mas_caa_dp_neon; + + op_copy_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_mas_cn_dpan_neon; + op_copy_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_pt_mas_c_dpan_neon; + op_copy_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_mas_can_dpan_neon; + op_copy_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_mas_caa_dpan_neon; +} +#endif + +/*-----*/ + +/* copy_rel mask x color -> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_rel_mas_c_dp_neon(DATA32 *s __UNUSED__, DATA8 *m, DATA32 c, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + case 0: + break; + case 255: + color = 1 + (*d >> 24); + *d = MUL_256(color, c); + break; + default: + { + DATA32 da = 1 + (*d >> 24); + da = MUL_256(da, c); + color++; + *d = INTERP_256(color, da, *d); + } + break; + } + m++; d++; + }); +} + +#define _op_copy_rel_mas_cn_dp_neon _op_copy_rel_mas_c_dp_neon +#define _op_copy_rel_mas_can_dp_neon _op_copy_rel_mas_c_dp_neon +#define _op_copy_rel_mas_caa_dp_neon _op_copy_rel_mas_c_dp_neon + +#define _op_copy_rel_mas_c_dpan_neon _op_copy_mas_c_dpan_neon +#define _op_copy_rel_mas_cn_dpan_neon _op_copy_mas_cn_dpan_neon +#define _op_copy_rel_mas_can_dpan_neon _op_copy_mas_can_dpan_neon +#define _op_copy_rel_mas_caa_dpan_neon _op_copy_mas_caa_dpan_neon + +static void +init_copy_rel_mask_color_span_funcs_neon(void) +{ + op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_mas_cn_dp_neon; + op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_rel_mas_c_dp_neon; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_rel_mas_can_dp_neon; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_rel_mas_caa_dp_neon; + + op_copy_rel_span_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_mas_cn_dpan_neon; + op_copy_rel_span_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_rel_mas_c_dpan_neon; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_mas_can_dpan_neon; + op_copy_rel_span_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_mas_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_rel_pt_mas_c_dp_neon(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_neon _op_copy_rel_pt_mas_c_dp_neon +#define _op_copy_rel_pt_mas_can_dp_neon _op_copy_rel_pt_mas_c_dp_neon +#define _op_copy_rel_pt_mas_caa_dp_neon _op_copy_rel_pt_mas_c_dp_neon + +#define _op_copy_rel_pt_mas_c_dpan_neon _op_copy_pt_mas_c_dpan_neon +#define _op_copy_rel_pt_mas_cn_dpan_neon _op_copy_pt_mas_cn_dpan_neon +#define _op_copy_rel_pt_mas_can_dpan_neon _op_copy_pt_mas_can_dpan_neon +#define _op_copy_rel_pt_mas_caa_dpan_neon _op_copy_pt_mas_caa_dpan_neon + +static void +init_copy_rel_mask_color_pt_funcs_neon(void) +{ + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_mas_cn_dp_neon; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP][CPU_NEON] = _op_copy_rel_pt_mas_c_dp_neon; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_mas_can_dp_neon; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_mas_caa_dp_neon; + + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_cn_dpan_neon; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_c_dpan_neon; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_can_dpan_neon; + op_copy_rel_pt_funcs[SP_N][SM_AS][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_mas_caa_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c new file mode 100644 index 0000000..45d59d0 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_.c @@ -0,0 +1,117 @@ +/* copy pixel --> dst */ + +#ifdef BUILD_C +static void +_op_copy_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + memcpy(d, s, l * sizeof(DATA32)); +} + +#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 __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL_SYM(*d >> 24, *s); + d++; 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c new file mode 100644 index 0000000..12b616d --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_.c @@ -0,0 +1,236 @@ +/* copy pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_copy_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL4_SYM(c, *s); + d++; + s++; + }); +} + +static void +_op_copy_p_caa_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + c = 1 + (c >> 24); + UNROLL8_PLD_WHILE(d, l, 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 __UNUSED__, DATA32 c, DATA32 *d) { + *d = MUL4_SYM(c, s); +} + +static void +_op_copy_pt_p_caa_dp(DATA32 s, DATA8 m __UNUSED__, 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 __UNUSED__, DATA32 c, DATA32 *d, int l) { + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c new file mode 100644 index 0000000..fb5bc70 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_i386.c @@ -0,0 +1,255 @@ +/* copy pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_p_c_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c new file mode 100644 index 0000000..f8a1e79 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_color_neon.c @@ -0,0 +1,238 @@ +/* copy pixel x color --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL4_SYM(c, *s); + d++; + s++; + }); +} + + +static void +_op_copy_p_caa_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { // FIXME: neon-it + // FIXME: neon-it + DATA32 *e; + c = 1 + (c >> 24); + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL_256(c, *s); + d++; + s++; + }); +} + + +#define _op_copy_pas_c_dp_neon _op_copy_p_c_dp_neon +#define _op_copy_pan_c_dp_neon _op_copy_p_c_dp_neon +#define _op_copy_p_can_dp_neon _op_copy_p_c_dp_neon +#define _op_copy_pas_can_dp_neon _op_copy_pas_c_dp_neon +#define _op_copy_pan_can_dp_neon _op_copy_pan_c_dp_neon +#define _op_copy_pas_caa_dp_neon _op_copy_p_caa_dp_neon +#define _op_copy_pan_caa_dp_neon _op_copy_p_caa_dp_neon + +#define _op_copy_p_c_dpan_neon _op_copy_p_c_dp_neon +#define _op_copy_pas_c_dpan_neon _op_copy_pas_c_dp_neon +#define _op_copy_pan_c_dpan_neon _op_copy_pan_c_dp_neon +#define _op_copy_p_can_dpan_neon _op_copy_p_can_dp_neon +#define _op_copy_pas_can_dpan_neon _op_copy_pas_can_dp_neon +#define _op_copy_pan_can_dpan_neon _op_copy_pan_can_dp_neon +#define _op_copy_p_caa_dpan_neon _op_copy_p_caa_dp_neon +#define _op_copy_pas_caa_dpan_neon _op_copy_pas_caa_dp_neon +#define _op_copy_pan_caa_dpan_neon _op_copy_pan_caa_dp_neon + +static void +init_copy_pixel_color_span_funcs_neon(void) +{ + op_copy_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_p_c_dp_neon; + op_copy_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_pas_c_dp_neon; + op_copy_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_pan_c_dp_neon; + op_copy_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_p_can_dp_neon; + op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pas_can_dp_neon; + op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pan_can_dp_neon; + op_copy_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_p_caa_dp_neon; + op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pas_caa_dp_neon; + op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pan_caa_dp_neon; + + op_copy_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_p_c_dpan_neon; + op_copy_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pas_c_dpan_neon; + op_copy_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pan_c_dpan_neon; + op_copy_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_p_can_dpan_neon; + op_copy_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pas_can_dpan_neon; + op_copy_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pan_can_dpan_neon; + op_copy_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_p_caa_dpan_neon; + op_copy_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pas_caa_dpan_neon; + op_copy_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pan_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) { + *d = MUL4_SYM(c, s); +} + +#define _op_copy_pt_pas_c_dp_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_pan_c_dp_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_p_can_dp_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_pas_can_dp_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_pan_can_dp_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_p_caa_dp_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_pas_caa_dp_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_pan_caa_dp_neon _op_copy_pt_p_c_dp_neon + +#define _op_copy_pt_p_c_dpan_neon _op_copy_pt_p_c_dp_neon +#define _op_copy_pt_pas_c_dpan_neon _op_copy_pt_pas_c_dp_neon +#define _op_copy_pt_pan_c_dpan_neon _op_copy_pt_pan_c_dp_neon +#define _op_copy_pt_p_can_dpan_neon _op_copy_pt_p_can_dp_neon +#define _op_copy_pt_pas_can_dpan_neon _op_copy_pt_pas_can_dp_neon +#define _op_copy_pt_pan_can_dpan_neon _op_copy_pt_pan_can_dp_neon +#define _op_copy_pt_p_caa_dpan_neon _op_copy_pt_p_caa_dp_neon +#define _op_copy_pt_pas_caa_dpan_neon _op_copy_pt_pas_caa_dp_neon +#define _op_copy_pt_pan_caa_dpan_neon _op_copy_pt_pan_caa_dp_neon + +static void +init_copy_pixel_color_pt_funcs_neon(void) +{ + op_copy_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_p_c_dp_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_pas_c_dp_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_pt_pan_c_dp_neon; + op_copy_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_p_can_dp_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_pas_can_dp_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_pt_pan_can_dp_neon; + op_copy_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_p_caa_dp_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_pas_caa_dp_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_pt_pan_caa_dp_neon; + + op_copy_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_p_c_dpan_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_pas_c_dpan_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_pt_pan_c_dpan_neon; + op_copy_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_p_can_dpan_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_pas_can_dpan_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_pt_pan_can_dpan_neon; + op_copy_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_p_caa_dpan_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_pas_caa_dpan_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_pt_pan_caa_dpan_neon; +} +#endif + +/*-----*/ + +/* copy_rel pixel x color --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_rel_p_c_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + DATA32 cs = MUL4_SYM(c, *s); + *d = MUL_SYM(*d >> 24, cs); + d++; + s++; + }); +} + + +#define _op_copy_rel_pas_c_dp_neon _op_copy_rel_p_c_dp_neon +#define _op_copy_rel_pan_c_dp_neon _op_copy_rel_p_c_dp_neon +#define _op_copy_rel_p_can_dp_neon _op_copy_rel_p_c_dp_neon +#define _op_copy_rel_pas_can_dp_neon _op_copy_rel_p_c_dp_neon +#define _op_copy_rel_pan_can_dp_neon _op_copy_rel_p_c_dp_neon +#define _op_copy_rel_p_caa_dp_neon _op_copy_rel_p_c_dp_neon +#define _op_copy_rel_pas_caa_dp_neon _op_copy_rel_p_c_dp_neon +#define _op_copy_rel_pan_caa_dp_neon _op_copy_rel_p_c_dp_neon + +#define _op_copy_rel_p_c_dpan_neon _op_copy_p_c_dpan_neon +#define _op_copy_rel_pas_c_dpan_neon _op_copy_pas_c_dpan_neon +#define _op_copy_rel_pan_c_dpan_neon _op_copy_pan_c_dpan_neon +#define _op_copy_rel_p_can_dpan_neon _op_copy_p_can_dpan_neon +#define _op_copy_rel_pas_can_dpan_neon _op_copy_pas_can_dpan_neon +#define _op_copy_rel_pan_can_dpan_neon _op_copy_pan_can_dpan_neon +#define _op_copy_rel_p_caa_dpan_neon _op_copy_p_caa_dpan_neon +#define _op_copy_rel_pas_caa_dpan_neon _op_copy_pas_caa_dpan_neon +#define _op_copy_rel_pan_caa_dpan_neon _op_copy_pan_caa_dpan_neon + +static void +init_copy_rel_pixel_color_span_funcs_neon(void) +{ + op_copy_rel_span_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_p_c_dp_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pas_c_dp_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pan_c_dp_neon; + op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_p_can_dp_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pas_can_dp_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pan_can_dp_neon; + op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_p_caa_dp_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pas_caa_dp_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pan_caa_dp_neon; + + op_copy_rel_span_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_p_c_dpan_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pas_c_dpan_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pan_c_dpan_neon; + op_copy_rel_span_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_p_can_dpan_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pas_can_dpan_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pan_can_dpan_neon; + op_copy_rel_span_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_p_caa_dpan_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pas_caa_dpan_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pan_caa_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_rel_pt_p_c_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) { + s = MUL4_SYM(c, s); + *d = MUL_SYM(*d >> 24, s); +} + + +#define _op_copy_rel_pt_pas_c_dp_neon _op_copy_rel_pt_p_c_dp_neon +#define _op_copy_rel_pt_pan_c_dp_neon _op_copy_rel_pt_p_c_dp_neon +#define _op_copy_rel_pt_p_can_dp_neon _op_copy_rel_pt_p_c_dp_neon +#define _op_copy_rel_pt_pas_can_dp_neon _op_copy_rel_pt_p_c_dp_neon +#define _op_copy_rel_pt_pan_can_dp_neon _op_copy_rel_pt_p_c_dp_neon +#define _op_copy_rel_pt_p_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon +#define _op_copy_rel_pt_pas_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon +#define _op_copy_rel_pt_pan_caa_dp_neon _op_copy_rel_pt_p_c_dp_neon + +#define _op_copy_rel_pt_p_c_dpan_neon _op_copy_pt_p_c_dpan_neon +#define _op_copy_rel_pt_pas_c_dpan_neon _op_copy_pt_pas_c_dpan_neon +#define _op_copy_rel_pt_pan_c_dpan_neon _op_copy_pt_pan_c_dpan_neon +#define _op_copy_rel_pt_p_can_dpan_neon _op_copy_pt_p_can_dpan_neon +#define _op_copy_rel_pt_pas_can_dpan_neon _op_copy_pt_pas_can_dpan_neon +#define _op_copy_rel_pt_pan_can_dpan_neon _op_copy_pt_pan_can_dpan_neon +#define _op_copy_rel_pt_p_caa_dpan_neon _op_copy_pt_p_caa_dpan_neon +#define _op_copy_rel_pt_pas_caa_dpan_neon _op_copy_pt_pas_caa_dpan_neon +#define _op_copy_rel_pt_pan_caa_dpan_neon _op_copy_pt_pan_caa_dpan_neon + + +static void +init_copy_rel_pixel_color_pt_funcs_neon(void) +{ + op_copy_rel_pt_funcs[SP][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_p_c_dp_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_pas_c_dp_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP][CPU_NEON] = _op_copy_rel_pt_pan_c_dp_neon; + op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_p_can_dp_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_pas_can_dp_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP][CPU_NEON] = _op_copy_rel_pt_pan_can_dp_neon; + op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_p_caa_dp_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_pas_caa_dp_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP][CPU_NEON] = _op_copy_rel_pt_pan_caa_dp_neon; + + op_copy_rel_pt_funcs[SP][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_c_dpan_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_c_dpan_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_c_dpan_neon; + op_copy_rel_pt_funcs[SP][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_can_dpan_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_can_dpan_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AN][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_can_dpan_neon; + op_copy_rel_pt_funcs[SP][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_caa_dpan_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_caa_dpan_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_AA][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_caa_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c new file mode 100644 index 0000000..b03022b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_i386.c @@ -0,0 +1,131 @@ +/* copy pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c new file mode 100644 index 0000000..48b5338 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_.c @@ -0,0 +1,150 @@ +/* copy pixel x mask --> dst */ + +#ifdef BUILD_C +static void +_op_copy_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + DATA32 *e; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + color++; + *d = INTERP_256(color, *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 __UNUSED__, 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; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c new file mode 100644 index 0000000..2511c41 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_i386.c @@ -0,0 +1,176 @@ +/* copy pixel x mask --> dst */ + +#ifdef BUILD_MMX +static void +_op_copy_p_mas_dp_mmx(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c new file mode 100644 index 0000000..e25f8f8 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_mask_neon.c @@ -0,0 +1,151 @@ +/* copy pixel x mask --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_p_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + case 0: + break; + case 255: + *d = *s; + break; + default: + color++; + *d = INTERP_256(color, *s, *d); + break; + } + m++; s++; d++; + }); +} + +#define _op_copy_pan_mas_dp_neon _op_copy_p_mas_dp_neon +#define _op_copy_pas_mas_dp_neon _op_copy_p_mas_dp_neon + +#define _op_copy_p_mas_dpan_neon _op_copy_p_mas_dp_neon +#define _op_copy_pan_mas_dpan_neon _op_copy_p_mas_dpan_neon +#define _op_copy_pas_mas_dpan_neon _op_copy_p_mas_dpan_neon + +static void +init_copy_pixel_mask_span_funcs_neon(void) +{ + op_copy_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_p_mas_dp_neon; + op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pan_mas_dp_neon; + op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pas_mas_dp_neon; + + op_copy_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_p_mas_dpan_neon; + op_copy_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pan_mas_dpan_neon; + op_copy_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pas_mas_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_pt_p_mas_dp_neon(DATA32 s, DATA8 m, DATA32 c, DATA32 *d) { + *d = INTERP_256(m + 1, s, *d); +} + +#define _op_copy_pt_pan_mas_dp_neon _op_copy_pt_p_mas_dp_neon +#define _op_copy_pt_pas_mas_dp_neon _op_copy_pt_p_mas_dp_neon + +#define _op_copy_pt_p_mas_dpan_neon _op_copy_pt_p_mas_dp_neon +#define _op_copy_pt_pan_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon +#define _op_copy_pt_pas_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon + +static void +init_copy_pixel_mask_pt_funcs_neon(void) +{ + op_copy_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_p_mas_dp_neon; + op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_pan_mas_dp_neon; + op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_pt_pas_mas_dp_neon; + + op_copy_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_p_mas_dpan_neon; + op_copy_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pan_mas_dpan_neon; + op_copy_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pas_mas_dpan_neon; +} +#endif + +/*-----*/ + +/* copy_rel pixel x mask --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_rel_p_mas_dp_neon(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e; + int color; + UNROLL8_PLD_WHILE(d, l, e, + { + color = *m; + switch(color) + { + 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_neon _op_copy_rel_p_mas_dp_neon +#define _op_copy_rel_pas_mas_dp_neon _op_copy_rel_p_mas_dp_neon + +#define _op_copy_rel_p_mas_dpan_neon _op_copy_p_mas_dpan_neon +#define _op_copy_rel_pan_mas_dpan_neon _op_copy_pan_mas_dpan_neon +#define _op_copy_rel_pas_mas_dpan_neon _op_copy_pas_mas_dpan_neon + +static void +init_copy_rel_pixel_mask_span_funcs_neon(void) +{ + op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_p_mas_dp_neon; + op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pan_mas_dp_neon; + op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pas_mas_dp_neon; + + op_copy_rel_span_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_p_mas_dpan_neon; + op_copy_rel_span_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pan_mas_dpan_neon; + op_copy_rel_span_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pas_mas_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_rel_pt_p_mas_dp_neon(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_neon _op_copy_rel_pt_p_mas_dp_neon +#define _op_copy_rel_pt_pas_mas_dp_neon _op_copy_rel_pt_p_mas_dp_neon + +#define _op_copy_rel_pt_p_mas_dpan_neon _op_copy_pt_p_mas_dpan_neon +#define _op_copy_rel_pt_pan_mas_dpan_neon _op_copy_pt_pan_mas_dpan_neon +#define _op_copy_rel_pt_pas_mas_dpan_neon _op_copy_pt_pas_mas_dpan_neon + +static void +init_copy_rel_pixel_mask_pt_funcs_neon(void) +{ + op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_p_mas_dp_neon; + op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pan_mas_dp_neon; + op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pas_mas_dp_neon; + + op_copy_rel_pt_funcs[SP][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_mas_dpan_neon; + op_copy_rel_pt_funcs[SP_AN][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_mas_dpan_neon; + op_copy_rel_pt_funcs[SP_AS][SM_AS][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_mas_dpan_neon; +} +#endif + diff --git a/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c new file mode 100644 index 0000000..5b8bd60 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy/op_copy_pixel_neon.c @@ -0,0 +1,158 @@ +/* copy pixel --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_p_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { +//#define USENEON 1 +#ifndef USENEON + memcpy(d, s, l * sizeof(DATA32)); + return; +#else + DATA32 *e; + e = d + l - 23; + if (e > d) + { + int dl; + + asm volatile + (".fpu neon \n\t" + "_op_copy_p_dp_neon_asmloop: \n\t" + "pld [%[s], #192] \n\t" // preload 256 bytes ahead + "pld [%[s], #320] \n\t" // preload 320 bytes ahead + "vld1.32 {d0-d3}, [%[s]]! \n\t" // load 256bits (32 bytes 8 pix), 32bit aligned + "vld1.32 {d4-d7} , [%[s]]! \n\t" // load 256bits (32 bytes 8 pix), 32bit aligned + "vld1.32 {d8-d11}, [%[s]]! \n\t" // load 256bits (32 bytes 8 pix), 32bit aligned + "vst1.32 {d0-d3}, [%[d]]! \n\t" // store 256bits (32 bytes 8 pix), 32bit aligned + "vst1.32 {d4-d7}, [%[d]]! \n\t" // store 256bits (32 bytes 8 pix), 32bit aligned + "vst1.32 {d8-d11}, [%[d]]! \n\t" // store 256bits (32 bytes 8 pix), 32bit aligned + "cmp %[e], %[d] \n\t" // compare current and end ptr + "bgt _op_copy_p_dp_neon_asmloop \n\t" + : /*out*/ + : /*in */ [s] "r" (s), [e] "r" (e), [d] "r" (d) + : /*clobber*/ + "q0", "q1", "q2","q3", "q4", "q5", "q6", + "d0", "d1", "d2", "d3", + "d4", "d5", "d6", "d7", + "d8", "d9", "d10", "d11", + "memory" // clobbered + ); + dl = l % 24; // dl is how many pixels at end that is not a multiple of 24 + l = l - dl; // jump to there at the end of the run? + s = s + l; + d = d + l; + } + e += 23; + for (;d < e; d++, s++) *d = *s; +#endif +} + +#define _op_copy_pan_dp_neon _op_copy_p_dp_neon +#define _op_copy_pas_dp_neon _op_copy_p_dp_neon + +#define _op_copy_p_dpan_neon _op_copy_p_dp_neon +#define _op_copy_pan_dpan_neon _op_copy_pan_dp_neon +#define _op_copy_pas_dpan_neon _op_copy_pas_dp_neon + +static void +init_copy_pixel_span_funcs_neon(void) +{ + op_copy_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_p_dp_neon; + op_copy_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pan_dp_neon; + op_copy_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pas_dp_neon; + + op_copy_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_p_dpan_neon; + op_copy_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pan_dpan_neon; + op_copy_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pas_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_pt_p_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d) { + *d = s; +} + +#define _op_copy_pt_pan_dp_neon _op_copy_pt_p_dp_neon +#define _op_copy_pt_pas_dp_neon _op_copy_pt_p_dp_neon + +#define _op_copy_pt_p_dpan_neon _op_copy_pt_p_dp_neon +#define _op_copy_pt_pan_dpan_neon _op_copy_pt_pan_dp_neon +#define _op_copy_pt_pas_dpan_neon _op_copy_pt_pas_dp_neon + +static void +init_copy_pixel_pt_funcs_neon(void) +{ + op_copy_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_p_dp_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_pan_dp_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_pt_pas_dp_neon; + + op_copy_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_p_dpan_neon; + op_copy_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pan_dpan_neon; + op_copy_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_pt_pas_dpan_neon; +} +#endif + +/*-----*/ + +/* copy_rel pixel --> dst */ + +#ifdef BUILD_NEON +static void +_op_copy_rel_p_dp_neon(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, DATA32 *d, int l) { + // FIXME: neon-it + DATA32 *e; + UNROLL8_PLD_WHILE(d, l, e, + { + *d = MUL_SYM(*d >> 24, c); + d++; + }); +} + + +#define _op_copy_rel_pas_dp_neon _op_copy_rel_p_dp_neon +#define _op_copy_rel_pan_dp_neon _op_copy_rel_p_dp_neon + +#define _op_copy_rel_p_dpan_neon _op_copy_p_dpan_neon +#define _op_copy_rel_pan_dpan_neon _op_copy_pan_dpan_neon +#define _op_copy_rel_pas_dpan_neon _op_copy_pas_dpan_neon + +static void +init_copy_rel_pixel_span_funcs_neon(void) +{ + op_copy_rel_span_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_p_dp_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pan_dp_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pas_dp_neon; + + op_copy_rel_span_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_p_dpan_neon; + op_copy_rel_span_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pan_dpan_neon; + op_copy_rel_span_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pas_dpan_neon; +} +#endif + +#ifdef BUILD_NEON +static void +_op_copy_rel_pt_p_dp_neon(DATA32 s, DATA8 m __UNUSED__, DATA32 c, DATA32 *d) { + s = 1 + (*d >> 24); + *d = MUL_256(s, c); +} + + +#define _op_copy_rel_pt_pan_dp_neon _op_copy_rel_pt_p_dp_neon +#define _op_copy_rel_pt_pas_dp_neon _op_copy_rel_pt_p_dp_neon + +#define _op_copy_rel_pt_p_dpan_neon _op_copy_pt_p_dpan_neon +#define _op_copy_rel_pt_pan_dpan_neon _op_copy_pt_pan_dpan_neon +#define _op_copy_rel_pt_pas_dpan_neon _op_copy_pt_pas_dpan_neon + +static void +init_copy_rel_pixel_pt_funcs_neon(void) +{ + op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_p_dp_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pan_dp_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP][CPU_NEON] = _op_copy_rel_pt_pas_dp_neon; + + op_copy_rel_pt_funcs[SP][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_p_dpan_neon; + op_copy_rel_pt_funcs[SP_AN][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pan_dpan_neon; + op_copy_rel_pt_funcs[SP_AS][SM_N][SC_N][DP_AN][CPU_NEON] = _op_copy_rel_pt_pas_dpan_neon; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_op_copy_main_.c b/libraries/evas/src/lib/engines/common/evas_op_copy_main_.c new file mode 100644 index 0000000..4575aee --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_copy_main_.c @@ -0,0 +1,675 @@ +#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); +/* XXX: doesn't exist +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" + +# include "./evas_op_copy/op_copy_pixel_neon.c" +# include "./evas_op_copy/op_copy_color_neon.c" +# include "./evas_op_copy/op_copy_pixel_color_neon.c" +# include "./evas_op_copy/op_copy_pixel_mask_neon.c" +# include "./evas_op_copy/op_copy_mask_color_neon.c" +//# include "./evas_op_copy/op_copy_pixel_mask_color_neon.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_NEON + init_copy_pixel_span_funcs_neon(); + init_copy_pixel_color_span_funcs_neon(); + init_copy_pixel_mask_span_funcs_neon(); + init_copy_color_span_funcs_neon(); + init_copy_mask_color_span_funcs_neon(); + + init_copy_pixel_pt_funcs_neon(); + init_copy_pixel_color_pt_funcs_neon(); + init_copy_pixel_mask_pt_funcs_neon(); + init_copy_color_pt_funcs_neon(); + init_copy_mask_color_pt_funcs_neon(); +#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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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_NEON + init_copy_rel_pixel_span_funcs_neon(); + init_copy_rel_pixel_color_span_funcs_neon(); + init_copy_rel_pixel_mask_span_funcs_neon(); + init_copy_rel_color_span_funcs_neon(); + init_copy_rel_mask_color_span_funcs_neon(); + + init_copy_rel_pixel_pt_funcs_neon(); + init_copy_rel_pixel_color_pt_funcs_neon(); + init_copy_rel_pixel_mask_pt_funcs_neon(); + init_copy_rel_color_pt_funcs_neon(); + init_copy_rel_mask_color_pt_funcs_neon(); +#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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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_NEON + if (evas_common_cpu_has_feature(CPU_FEATURE_NEON)) + { + cpu = CPU_NEON; + 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); +} + +/* XXX: not used +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/libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.am b/libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.am new file mode 100644 index 0000000..47eefd2 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.am @@ -0,0 +1,13 @@ +MAINTAINERCLEANFILES = Makefile.in + +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/libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.in b/libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.in new file mode 100644 index 0000000..0ccd7f3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/Makefile.in @@ -0,0 +1,543 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/engines/common/evas_op_mask +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +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 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_mask/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_mask/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_.c new file mode 100644 index 0000000..c95b125 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_.c @@ -0,0 +1,49 @@ +/* mask color --> dst */ + +#ifdef BUILD_C +static void +_op_mask_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 m __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c new file mode 100644 index 0000000..9635eac --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_color_i386.c @@ -0,0 +1,58 @@ +/* mask color --> dst */ + +#ifdef BUILD_MMX +static void +_op_mask_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 m __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c new file mode 100644 index 0000000..c75edb4 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_.c @@ -0,0 +1,63 @@ +/* mask mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_mask_mas_c_dp(DATA32 *s __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c new file mode 100644 index 0000000..9427dbf --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_mask_color_i386.c @@ -0,0 +1,13 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c new file mode 100644 index 0000000..ea7982b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_.c @@ -0,0 +1,48 @@ +/* mask pixel --> dst */ + +#ifdef BUILD_C +static void +_op_mask_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c new file mode 100644 index 0000000..18d1cab --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_.c @@ -0,0 +1,100 @@ +/* mask pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_mask_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c new file mode 100644 index 0000000..0afcb71 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_color_i386.c @@ -0,0 +1,13 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c new file mode 100644 index 0000000..a1c09af --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_i386.c @@ -0,0 +1,58 @@ +/* mask pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_mask_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c new file mode 100644 index 0000000..b948aa6 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_.c @@ -0,0 +1,62 @@ +/* mask pixel x mask --> dst */ + +#ifdef BUILD_C +static void +_op_mask_p_mas_dp(DATA32 *s, DATA8 *m, DATA32 c __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c new file mode 100644 index 0000000..c5dd8da --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mask/op_mask_pixel_mask_i386.c @@ -0,0 +1,13 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_mask_main_.c b/libraries/evas/src/lib/engines/common/evas_op_mask_main_.c new file mode 100644 index 0000000..bbe497a --- /dev/null +++ b/libraries/evas/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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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/libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.am b/libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.am new file mode 100644 index 0000000..e3d0b82 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.am @@ -0,0 +1,13 @@ +MAINTAINERCLEANFILES = Makefile.in + +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/libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.in b/libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.in new file mode 100644 index 0000000..f239cf7 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/Makefile.in @@ -0,0 +1,543 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/engines/common/evas_op_mul +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +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 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_mul/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_mul/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_.c new file mode 100644 index 0000000..fb656b5 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_.c @@ -0,0 +1,65 @@ +/* mul color --> dst */ + +#ifdef BUILD_C +static void +_op_mul_c_dp(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 m __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c new file mode 100644 index 0000000..95f43f6 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_color_i386.c @@ -0,0 +1,66 @@ +/* mul color --> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_c_dp_mmx(DATA32 *s __UNUSED__, DATA8 *m __UNUSED__, 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 __UNUSED__, DATA8 m __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c new file mode 100644 index 0000000..7a6e403 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_.c @@ -0,0 +1,72 @@ +/* mul mask x color -> dst */ + +#ifdef BUILD_C +static void +_op_mul_mas_c_dp(DATA32 *s __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c new file mode 100644 index 0000000..1999503 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_mask_color_i386.c @@ -0,0 +1,92 @@ +/* mul mask x color -> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_mas_c_dp_mmx(DATA32 *s __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c new file mode 100644 index 0000000..2e034b9 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_.c @@ -0,0 +1,56 @@ +/* mul pixel --> dst */ + +#ifdef BUILD_C +static void +_op_mul_p_dp(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c new file mode 100644 index 0000000..3ea6919 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_.c @@ -0,0 +1,122 @@ +/* mul pixel x color --> dst */ + +#ifdef BUILD_C +static void +_op_mul_p_c_dp(DATA32 *s, DATA8 *m __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c new file mode 100644 index 0000000..24f5a80 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_color_i386.c @@ -0,0 +1,120 @@ +/* mul pixel x color --> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_p_c_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c new file mode 100644 index 0000000..0db6cd7 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_i386.c @@ -0,0 +1,66 @@ +/* mul pixel --> dst */ + +#ifdef BUILD_MMX +static void +_op_mul_p_dp_mmx(DATA32 *s, DATA8 *m __UNUSED__, DATA32 c __UNUSED__, 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 __UNUSED__, DATA32 c __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c new file mode 100644 index 0000000..37d0497 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_.c @@ -0,0 +1,117 @@ +/* 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 __UNUSED__, 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/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c new file mode 100644 index 0000000..ebbac01 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_mul/op_mul_pixel_mask_i386.c @@ -0,0 +1,63 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_mul_main_.c b/libraries/evas/src/lib/engines/common/evas_op_mul_main_.c new file mode 100644 index 0000000..25fa932 --- /dev/null +++ b/libraries/evas/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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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/libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.am b/libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.am new file mode 100644 index 0000000..a8eca14 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.am @@ -0,0 +1,14 @@ +MAINTAINERCLEANFILES = Makefile.in + +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/libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.in b/libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.in new file mode 100644 index 0000000..b68ed3b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/Makefile.in @@ -0,0 +1,543 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/lib/engines/common/evas_op_sub +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/efl_attribute.m4 \ + $(top_srcdir)/m4/efl_coverage.m4 \ + $(top_srcdir)/m4/efl_doxygen.m4 \ + $(top_srcdir)/m4/efl_fnmatch.m4 \ + $(top_srcdir)/m4/efl_path_max.m4 $(top_srcdir)/m4/efl_tests.m4 \ + $(top_srcdir)/m4/evas_check_engine.m4 \ + $(top_srcdir)/m4/evas_check_loader.m4 \ + $(top_srcdir)/m4/evas_converter.m4 \ + $(top_srcdir)/m4/evas_dither.m4 \ + $(top_srcdir)/m4/evas_scaler.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CHECK_CFLAGS = @CHECK_CFLAGS@ +CHECK_LIBS = @CHECK_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@ +DIRECTFB_LIBS = @DIRECTFB_LIBS@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +ECORE_EVAS_CFLAGS = @ECORE_EVAS_CFLAGS@ +ECORE_EVAS_LIBS = @ECORE_EVAS_LIBS@ +EDB_CFLAGS = @EDB_CFLAGS@ +EDB_LIBS = @EDB_LIBS@ +EDJE_CFLAGS = @EDJE_CFLAGS@ +EDJE_LIBS = @EDJE_LIBS@ +EET_CFLAGS = @EET_CFLAGS@ +EET_LIBS = @EET_LIBS@ +EFL_COVERAGE_CFLAGS = @EFL_COVERAGE_CFLAGS@ +EFL_COVERAGE_LIBS = @EFL_COVERAGE_LIBS@ +EFL_FNMATCH_LIBS = @EFL_FNMATCH_LIBS@ +EGREP = @EGREP@ +EINA_CFLAGS = @EINA_CFLAGS@ +EINA_LIBS = @EINA_LIBS@ +EVAS_CFLAGS = @EVAS_CFLAGS@ +EVAS_LIBS = @EVAS_LIBS@ +EVAS_SSE3_CFLAGS = @EVAS_SSE3_CFLAGS@ +EVIL_CFLAGS = @EVIL_CFLAGS@ +EVIL_LIBS = @EVIL_LIBS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ +FREETYPE_LIBS = @FREETYPE_LIBS@ +FRIBIDI_CFLAGS = @FRIBIDI_CFLAGS@ +FRIBIDI_LIBS = @FRIBIDI_LIBS@ +GL_EET_CFLAGS = @GL_EET_CFLAGS@ +GL_EET_LIBS = @GL_EET_LIBS@ +GREP = @GREP@ +HARFBUZZ_CFLAGS = @HARFBUZZ_CFLAGS@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LINEBREAK_CFLAGS = @LINEBREAK_CFLAGS@ +LINEBREAK_LIBS = @LINEBREAK_LIBS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJCDEPMODE = @OBJCDEPMODE@ +OBJCFLAGS = @OBJCFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_CFLAGS = @PIXMAN_CFLAGS@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PNG_CFLAGS = @PNG_CFLAGS@ +PNG_LIBS = @PNG_LIBS@ +RANLIB = @RANLIB@ +SDL_CFLAGS = @SDL_CFLAGS@ +SDL_LIBS = @SDL_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SHM_OPEN_LINK = @SHM_OPEN_LINK@ +STRIP = @STRIP@ +SVG_CFLAGS = @SVG_CFLAGS@ +SVG_LIBS = @SVG_LIBS@ +VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ +VALGRIND_LIBS = @VALGRIND_LIBS@ +VERSION = @VERSION@ +VMAJ = @VMAJ@ +WIN32_CFLAGS = @WIN32_CFLAGS@ +WIN32_CPPFLAGS = @WIN32_CPPFLAGS@ +XCB_CFLAGS = @XCB_CFLAGS@ +XCB_GL_CFLAGS = @XCB_GL_CFLAGS@ +XCB_GL_LIBS = @XCB_GL_LIBS@ +XCB_LIBS = @XCB_LIBS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XMKMF = @XMKMF@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJC = @ac_ct_OBJC@ +altivec_cflags = @altivec_cflags@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +dlopen_libs = @dlopen_libs@ +docdir = @docdir@ +dvidir = @dvidir@ +edje_cc = @edje_cc@ +efl_doxygen = @efl_doxygen@ +efl_have_doxygen = @efl_have_doxygen@ +evas_engine_buffer_cflags = @evas_engine_buffer_cflags@ +evas_engine_buffer_libs = @evas_engine_buffer_libs@ +evas_engine_direct3d_cflags = @evas_engine_direct3d_cflags@ +evas_engine_direct3d_libs = @evas_engine_direct3d_libs@ +evas_engine_directfb_cflags = @evas_engine_directfb_cflags@ +evas_engine_directfb_libs = @evas_engine_directfb_libs@ +evas_engine_fb_cflags = @evas_engine_fb_cflags@ +evas_engine_fb_libs = @evas_engine_fb_libs@ +evas_engine_gl_cocoa_cflags = @evas_engine_gl_cocoa_cflags@ +evas_engine_gl_cocoa_libs = @evas_engine_gl_cocoa_libs@ +evas_engine_gl_common_libs = @evas_engine_gl_common_libs@ +evas_engine_gl_sdl_cflags = @evas_engine_gl_sdl_cflags@ +evas_engine_gl_sdl_libs = @evas_engine_gl_sdl_libs@ +evas_engine_gl_xcb_cflags = @evas_engine_gl_xcb_cflags@ +evas_engine_gl_xcb_libs = @evas_engine_gl_xcb_libs@ +evas_engine_gl_xlib_cflags = @evas_engine_gl_xlib_cflags@ +evas_engine_gl_xlib_libs = @evas_engine_gl_xlib_libs@ +evas_engine_psl1ght_cflags = @evas_engine_psl1ght_cflags@ +evas_engine_psl1ght_libs = @evas_engine_psl1ght_libs@ +evas_engine_software_16_ddraw_cflags = @evas_engine_software_16_ddraw_cflags@ +evas_engine_software_16_ddraw_libs = @evas_engine_software_16_ddraw_libs@ +evas_engine_software_16_sdl_cflags = @evas_engine_software_16_sdl_cflags@ +evas_engine_software_16_sdl_libs = @evas_engine_software_16_sdl_libs@ +evas_engine_software_16_wince_cflags = @evas_engine_software_16_wince_cflags@ +evas_engine_software_16_wince_libs = @evas_engine_software_16_wince_libs@ +evas_engine_software_16_x11_cflags = @evas_engine_software_16_x11_cflags@ +evas_engine_software_16_x11_libs = @evas_engine_software_16_x11_libs@ +evas_engine_software_8_x11_cflags = @evas_engine_software_8_x11_cflags@ +evas_engine_software_8_x11_libs = @evas_engine_software_8_x11_libs@ +evas_engine_software_ddraw_cflags = @evas_engine_software_ddraw_cflags@ +evas_engine_software_ddraw_libs = @evas_engine_software_ddraw_libs@ +evas_engine_software_gdi_cflags = @evas_engine_software_gdi_cflags@ +evas_engine_software_gdi_libs = @evas_engine_software_gdi_libs@ +evas_engine_software_sdl_cflags = @evas_engine_software_sdl_cflags@ +evas_engine_software_sdl_libs = @evas_engine_software_sdl_libs@ +evas_engine_software_xcb_cflags = @evas_engine_software_xcb_cflags@ +evas_engine_software_xcb_libs = @evas_engine_software_xcb_libs@ +evas_engine_software_xlib_cflags = @evas_engine_software_xlib_cflags@ +evas_engine_software_xlib_libs = @evas_engine_software_xlib_libs@ +evas_image_loader_bmp_cflags = @evas_image_loader_bmp_cflags@ +evas_image_loader_bmp_libs = @evas_image_loader_bmp_libs@ +evas_image_loader_edb_cflags = @evas_image_loader_edb_cflags@ +evas_image_loader_edb_libs = @evas_image_loader_edb_libs@ +evas_image_loader_eet_cflags = @evas_image_loader_eet_cflags@ +evas_image_loader_eet_libs = @evas_image_loader_eet_libs@ +evas_image_loader_generic_cflags = @evas_image_loader_generic_cflags@ +evas_image_loader_generic_libs = @evas_image_loader_generic_libs@ +evas_image_loader_gif_cflags = @evas_image_loader_gif_cflags@ +evas_image_loader_gif_libs = @evas_image_loader_gif_libs@ +evas_image_loader_ico_cflags = @evas_image_loader_ico_cflags@ +evas_image_loader_ico_libs = @evas_image_loader_ico_libs@ +evas_image_loader_jpeg_cflags = @evas_image_loader_jpeg_cflags@ +evas_image_loader_jpeg_libs = @evas_image_loader_jpeg_libs@ +evas_image_loader_pmaps_cflags = @evas_image_loader_pmaps_cflags@ +evas_image_loader_pmaps_libs = @evas_image_loader_pmaps_libs@ +evas_image_loader_png_cflags = @evas_image_loader_png_cflags@ +evas_image_loader_png_libs = @evas_image_loader_png_libs@ +evas_image_loader_psd_cflags = @evas_image_loader_psd_cflags@ +evas_image_loader_psd_libs = @evas_image_loader_psd_libs@ +evas_image_loader_svg_cflags = @evas_image_loader_svg_cflags@ +evas_image_loader_svg_libs = @evas_image_loader_svg_libs@ +evas_image_loader_tga_cflags = @evas_image_loader_tga_cflags@ +evas_image_loader_tga_libs = @evas_image_loader_tga_libs@ +evas_image_loader_tiff_cflags = @evas_image_loader_tiff_cflags@ +evas_image_loader_tiff_libs = @evas_image_loader_tiff_libs@ +evas_image_loader_wbmp_cflags = @evas_image_loader_wbmp_cflags@ +evas_image_loader_wbmp_libs = @evas_image_loader_wbmp_libs@ +evas_image_loader_xpm_cflags = @evas_image_loader_xpm_cflags@ +evas_image_loader_xpm_libs = @evas_image_loader_xpm_libs@ +exec_prefix = @exec_prefix@ +have_evas_engine_gl_x11 = @have_evas_engine_gl_x11@ +have_evas_engine_gl_xcb = @have_evas_engine_gl_xcb@ +have_evas_engine_gl_xlib = @have_evas_engine_gl_xlib@ +have_evas_engine_software_x11 = @have_evas_engine_software_x11@ +have_evas_engine_software_xcb = @have_evas_engine_software_xcb@ +have_evas_engine_software_xlib = @have_evas_engine_software_xlib@ +have_lcov = @have_lcov@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +lt_enable_auto_import = @lt_enable_auto_import@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgconfig_requires_private = @pkgconfig_requires_private@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pthread_cflags = @pthread_cflags@ +pthread_libs = @pthread_libs@ +release_info = @release_info@ +requirement_evas = @requirement_evas@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +version_info = @version_info@ +MAINTAINERCLEANFILES = Makefile.in +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 + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_sub/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/lib/engines/common/evas_op_sub/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_.c new file mode 100644 index 0000000..8490b68 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c new file mode 100644 index 0000000..d8fbbea --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_color_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c new file mode 100644 index 0000000..0584227 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c new file mode 100644 index 0000000..972a2c9 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_mask_color_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c new file mode 100644 index 0000000..97001d4 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c new file mode 100644 index 0000000..13caa0b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c new file mode 100644 index 0000000..e3c1793 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_color_i386.c @@ -0,0 +1,29 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c new file mode 100644 index 0000000..95e2ab6 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c new file mode 100644 index 0000000..c0c67be --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_.c @@ -0,0 +1,37 @@ +/* sub pixel x mask --> dst */ + +#ifdef BUILD_C +/* XXX: not used +static void +init_sub_pixel_mask_span_funcs_c(void) +{ +} +*/ +#endif + +#ifdef BUILD_C +/* XXX: not used +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/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c new file mode 100644 index 0000000..bfd145e --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_op_sub/op_sub_pixel_mask_i386.c @@ -0,0 +1,33 @@ +/* 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/libraries/evas/src/lib/engines/common/evas_op_sub_main_.c b/libraries/evas/src/lib/engines/common/evas_op_sub_main_.c new file mode 100644 index 0000000..329c2e4 --- /dev/null +++ b/libraries/evas/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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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 __UNUSED__) +{ + 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/libraries/evas/src/lib/engines/common/evas_pipe.c b/libraries/evas/src/lib/engines/common/evas_pipe.c new file mode 100644 index 0000000..66085c8 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_pipe.c @@ -0,0 +1,1733 @@ +// THIS IS DEPRECATED. WILL GO EVENTUALLTY. NO NEED TO SUPPORT ANYMORE + +#include "evas_common.h" +#include + +#ifdef BUILD_PIPE_RENDER + +#ifdef EVAS_FRAME_QUEUING +#define SCALECACHE +static Evas_FrameQ gframeq; // global frameQ + +static Evas_Surface * +evas_common_surface_alloc(void *surface, int x, int y, int w, int h) +{ + Evas_Surface *e_surface; + + e_surface = calloc(1, sizeof(Evas_Surface)); + e_surface->im = surface; + LKL(e_surface->im->cache_entry.ref_fq_add); + e_surface->im->cache_entry.ref_fq[0]++; + LKU(e_surface->im->cache_entry.ref_fq_add); + e_surface->x = x; + e_surface->y = y; + e_surface->w = w; + e_surface->h = h; + + return e_surface; +} + +static void +evas_common_surface_dealloc(Evas_Surface *surface) +{ + Evas_Surface *d_surface; + + while (surface) + { + d_surface = surface; + surface = (Evas_Surface *)eina_inlist_remove(EINA_INLIST_GET(surface), EINA_INLIST_GET(d_surface)); + LKL(d_surface->im->cache_entry.ref_fq_del); + d_surface->im->cache_entry.ref_fq[1]++; + LKU(d_surface->im->cache_entry.ref_fq_del); + free(d_surface); + } +} + +static void +evas_common_surface_add(Evas_Frame *frame, Evas_Surface *surface) +{ + frame->surfaces = (Evas_Surface *)eina_inlist_append(EINA_INLIST_GET(frame->surfaces), EINA_INLIST_GET(surface)); +} + +static Evas_Frame * +evas_common_frame_alloc(void) +{ + Evas_Frame *frame; + + frame = calloc(1, sizeof(Evas_Frame)); + frame->surfaces = NULL; + return frame; +} + +static void +evas_common_frame_dealloc(Evas_Frame *frame) +{ + evas_common_surface_dealloc(frame->surfaces); + free(frame); +} + +static void +evas_common_frame_add(Evas_FrameQ *frameq, Evas_Frame *frame) +{ + Evas_Frame *temp_frame; + + LKL(frameq->mutex); + while ((int)eina_inlist_count(EINA_INLIST_GET(frameq->frames)) >= frameq->frameq_sz) + { + /* wait a worker thread finish previous frame */ + eina_condition_wait(&(frameq->cond_done)); + } + frameq->frames = (Evas_Frame *) eina_inlist_append(EINA_INLIST_GET(frameq->frames), EINA_INLIST_GET(frame)); + + // this frame need not to be scheduled for flushing time + EINA_INLIST_FOREACH(EINA_INLIST_GET(frameq->frames), temp_frame) + { + if (!temp_frame->ready) + { + break; + } + } + if (temp_frame && temp_frame == frame) + frame->dont_schedule = 1; + + LKU(frameq->mutex); + + eina_condition_signal(&(frameq->cond_new)); +} + +EAPI Evas_Surface * +evas_common_frameq_new_surface(void *surface, int x, int y, int w, int h) +{ + return evas_common_surface_alloc(surface, x, y, w, h); +} + +EAPI void +evas_common_frameq_add_surface(Evas_Surface *surface) +{ + evas_common_surface_add(gframeq.cur_frame, surface); +} + +EAPI void +evas_common_frameq_set_frame_data(void *data, + void (*fn_output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h), + void (*fn_output_flush) (void *data), + void (*fn_output_set_priv)(void *data, void *cur, void *prev)) +{ + if (gframeq.cur_frame) + { + gframeq.cur_frame->data = data; + gframeq.cur_frame->output_redraws_next_update_push = fn_output_redraws_next_update_push; + gframeq.cur_frame->output_flush = fn_output_flush; + gframeq.cur_frame->output_set_priv = fn_output_set_priv; + } +} + +EAPI void +evas_common_frameq_prepare_frame(void) +{ + if (!gframeq.cur_frame ) + { + gframeq.cur_frame = evas_common_frame_alloc(); + } +} + +EAPI void +evas_common_frameq_ready_frame(void) +{ + if (gframeq.cur_frame) + { + evas_common_frame_add(&gframeq, gframeq.cur_frame); + gframeq.cur_frame = NULL; // create a new frame for the next frame later + } +} + + +EAPI void +evas_common_frameq_init(void) +{ + gframeq.frames = NULL; + LKI(gframeq.mutex); + eina_condition_new(&(gframeq.cond_new), &(gframeq.mutex)); + eina_condition_new(&(gframeq.cond_ready), &(gframeq.mutex)); + eina_condition_new(&(gframeq.cond_done), &(gframeq.mutex)); + gframeq.initialised = 0; // worker thread are not created yet + gframeq.frameq_sz = 1; // this value ensures the first frame can be enqueued. +} + +EAPI void +evas_common_frameq_destroy(void) +{ +#if 0 // let them destroyed indirectly with program exit + LKL(gframeq.mutex); + eina_condition_free(&(gframeq.cond_new)); + eina_condition_free(&(gframeq.cond_ready)); + eina_condition_free(&(gframeq.cond_done)); + LKU(gframeq.mutex); +#endif + LKD(gframeq.mutex); + + gframeq.frames = NULL; + gframeq.initialised = 0; +} + +EAPI void +evas_common_frameq_flush(void) +{ + if (! evas_common_frameq_enabled()) + return; + + LKL(gframeq.mutex); + while(eina_inlist_count(EINA_INLIST_GET(gframeq.frames)) > 0) + { + /* wait a worker thread finish previous frame */ + eina_condition_wait(&(gframeq.cond_done)); + } + LKU(gframeq.mutex); +} + + +EAPI void +evas_common_frameq_flush_ready(void) +{ + return; +} + +EAPI int +evas_common_frameq_get_frameq_sz(void) +{ + return gframeq.frameq_sz; +} + +EAPI int +evas_common_frameq_enabled(void) +{ + return gframeq.initialised; +} +#endif + +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 *rpipe, RGBA_Pipe_Op **op) +{ + RGBA_Pipe *p; + int first_pipe = 0; + + if (!rpipe) + { + first_pipe = 1; + p = calloc(1, sizeof(RGBA_Pipe)); + if (!p) return NULL; + rpipe = (RGBA_Pipe *)eina_inlist_append(EINA_INLIST_GET(rpipe), EINA_INLIST_GET(p)); + } + p = (RGBA_Pipe *)(EINA_INLIST_GET(rpipe))->last; + if (p->op_num == PIPE_LEN) + { + p = calloc(1, sizeof(RGBA_Pipe)); + if (!p) return NULL; + rpipe = (RGBA_Pipe *)eina_inlist_append(EINA_INLIST_GET(rpipe), EINA_INLIST_GET(p)); + } + p->op_num++; + *op = &(p->op[p->op_num - 1]); + if (first_pipe) + { + /* FIXME: PTHREAD init any thread locks etc */ + } + return rpipe; +} + +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); +} + +#ifdef BUILD_PTHREAD +/* main api calls */ +static void * +evas_common_pipe_thread(void *data) +{ + Thinfo *thinfo; + +// INF("TH [..........."); + thinfo = data; + for (;;) + { + RGBA_Pipe_Thread_Info *info; + RGBA_Pipe *p; + + /* wait for start signal */ +// INF(" TH %i START...", thinfo->thread_num); + pthread_barrier_wait(&(thinfo->barrier[0])); + info = thinfo->info; +// if (info) +// { +// thinfo->info = NULL; +// INF(" TH %i GO", thinfo->thread_num); + EINA_INLIST_FOREACH(EINA_INLIST_GET(info->im->cache_entry.pipe), p) + { + 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); +// } +// INF(" TH %i DONE", thinfo->thread_num); + /* send finished signal */ + pthread_barrier_wait(&(thinfo->barrier[1])); + } + return NULL; +} + +#ifdef EVAS_FRAME_QUEUING +static void +evas_common_frameq_release(void *data) +{ + Evas_FrameQ *frameq; + Evas_Frameq_Thread_Info *fq_info; + Thinfo *thinfo; + + thinfo = data; + fq_info = (Evas_Frameq_Thread_Info *)(thinfo->fq_info); + frameq = fq_info->frameq; + + /* This thread may or may not own the mutex. + * But there's no way to determine the ownership of the mutex, so release it anyway + */ + LKU(frameq->mutex); +} + +static void * +evas_common_frameq_thread(void *data) +{ + Evas_FrameQ *frameq; + Evas_Frame *frame; + Evas_Surface *surface; + RGBA_Pipe *p; + Thinfo *thinfo; + Evas_Frameq_Thread_Info *fq_info; + RGBA_Pipe_Thread_Info p_info; + + thinfo = data; + fq_info = (Evas_Frameq_Thread_Info *)(thinfo->fq_info); + frameq = fq_info->frameq; + + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); + /* install thread cancelation cleanup handler */ + pthread_cleanup_push(evas_common_frameq_release, data); + + for (;;) + { + frame = NULL; + + /* 1. pick a frame to draw */ + LKL(frameq->mutex); + while(!frame) + { + EINA_INLIST_FOREACH(EINA_INLIST_GET(frameq->frames), frame) + { + if (!frame->in_process) + { + frame->in_process = 1; + break; + } + } + if (frame) + { + break; + } + pthread_testcancel(); + eina_condition_wait(&(frameq->cond_new)); + } + LKU(frameq->mutex); + + /* 2. draw selected frame */ + EINA_INLIST_FOREACH(EINA_INLIST_GET(frame->surfaces), surface) + { + p_info.im = surface->im; + p_info.x = 0; + p_info.y = 0; + p_info.w = surface->im->cache_entry.w; + p_info.h = surface->im->cache_entry.h; + + EINA_INLIST_FOREACH(EINA_INLIST_GET(p_info.im->cache_entry.pipe), p) + { + int i; + + for (i = 0; i < p->op_num; i++) + { + if (p->op[i].op_func) + { + p->op[i].op_func(p_info.im, &(p->op[i]), &p_info); + } + } + } + + /* push surface out */ + if (! surface->dontpush) + { + frame->output_redraws_next_update_push(frame->data, + surface->im, surface->x, surface->y, surface->w, surface->h); + } + } + + // record frame ready time, will be used in post worker thread, evas_common_frameq_thread_post() + gettimeofday(&frame->ready_time, NULL); + + LKL(frameq->mutex); + frame->ready = 1; + eina_condition_signal(&(frameq->cond_ready)); + LKU(frameq->mutex); + } + + // Remove cleanup handler + pthread_cleanup_pop(0); + return NULL; +} + + +#define INTERVAL_QSIZE 17 // Actual size is 'INTERVAL_QSIZE - 1' because of not using index +#define SATISFACTION_THRESHOLD 4 // 4 ms --> 250 FPS +#define RESET_RATIO 4 // RESET_RATIO * [Average Ready Gap | get_max_interval()] --> Reset Threshold +#define DOUBLE_RESET_TIME_INTERVAL_THRESHOLD 16000 // make it double in case of less 16ms +#define RESET_ABSOLUTE_INTERVAL 600000 // 600 msec + +struct iq_node +{ + long long rt; + long long ri; +}; + +static struct iq_node _IQ[INTERVAL_QSIZE]; +static int _IQ_head = 0, _IQ_tail = 0; +static int _IQ_length = 0; +static long long min_ready, max_ready; +static long long average_interval; + +static int +_IQ_next_index(int i) +{ + return (i + 1) % INTERVAL_QSIZE; +} + +static int +_IQ_previous_index(int i) +{ + if (--i < 0) i += INTERVAL_QSIZE; + return i; +} + +static void +_IQ_init(void) +{ + _IQ_length = _IQ_head = _IQ_tail = 0; + min_ready = LLONG_MAX, max_ready = LLONG_MIN; + average_interval = 0; +} + +static int +_IQ_empty(void) +{ + return (_IQ_head == _IQ_tail) ? 1 : 0; +} + +static int +_IQ_full(void) +{ + return (_IQ_head == ((_IQ_tail + 1) % INTERVAL_QSIZE)) ? 1 : 0; +} + +static void +_IQ_insert(long long ready_time, long long last_interval) +{ + if (_IQ_full()) return; + + if (_IQ_empty()) + { + if (last_interval < 0) + { + last_interval = -last_interval; + } + _IQ[_IQ_tail].rt = ready_time; + _IQ[_IQ_tail].ri = last_interval; + min_ready = ready_time - last_interval; + max_ready = ready_time; + _IQ_tail = _IQ_next_index(_IQ_tail); + _IQ_length++; + } + else + { + if (max_ready < ready_time) + { + _IQ[_IQ_tail].rt = ready_time; + _IQ[_IQ_tail].ri = ready_time - max_ready; + _IQ_tail = _IQ_next_index(_IQ_tail); + _IQ_length++; + max_ready = ready_time; + } + else if (ready_time < min_ready) + { + last_interval = _IQ[_IQ_head].ri; + _IQ[_IQ_head].ri = _IQ[_IQ_head].rt - ready_time; + _IQ_head = _IQ_previous_index(_IQ_head); + _IQ[_IQ_head].rt = ready_time; + _IQ[_IQ_head].ri = last_interval; + min_ready = ready_time; + _IQ_length++; + } + else + { + int i, j, k, l = 0; + for (i = _IQ_head; i != _IQ_tail; i = j) + { + j = _IQ_next_index(i); + if (_IQ[j].rt < ready_time) + { + continue; + } + break; + } + for (k = _IQ_tail; k != j; k = l) + { + l = _IQ_previous_index(k); + _IQ[k] = _IQ[l]; + } + i = _IQ_next_index(j); + _IQ[j].ri -= (_IQ[j].rt - ready_time); + _IQ[j].rt = ready_time; + _IQ[i].ri = _IQ[i].rt - ready_time; + _IQ_tail = _IQ_next_index(_IQ_tail); + _IQ_length++; + } + } + average_interval = (max_ready - min_ready) / _IQ_length; +} + +static long long +_IQ_delete(void) +{ + struct iq_node oldest; + + if (_IQ_empty()) return 0; + oldest = _IQ[_IQ_head]; + _IQ_head = (_IQ_head + 1) % INTERVAL_QSIZE; + if ((--_IQ_length) == 0) + { + _IQ_init(); + } + else + { + min_ready = _IQ[_IQ_head].rt; + average_interval = (max_ready - min_ready) / _IQ_length; + } + + return oldest.ri; +} + +static long long +get_max_interval(void) +{ + int i; + long long max = LLONG_MIN; + + for ( i= _IQ_head ; i != _IQ_tail ; i = _IQ_next_index(i)) + { + if (_IQ[i].ri > max) + { + max = _IQ[i].ri; + } + } + + return max; +} + +static long long +tv_to_long_long(struct timeval *tv) +{ + if (!tv) + { + return 0; + } + + return tv->tv_sec * 1000000LL + tv->tv_usec; +} + +static long long +evas_common_frameq_schedule_flush_time(int frameq_sz, int thread_no, + long long last_ready_time, long long current_ready_time, + long long last_flush_time, int ready_frames_num, + int dont_schedule) +{ + // to get each time and to do others + long long current_time = 0LL; + long long current_ready_interval = 0LL; + long long theshold_time = SATISFACTION_THRESHOLD * 1000LL; // ms -> usec + long long reset_time_interval = 0LL; + long long sleep_time = 0LL; + long long saved_ready_time, saved_ready_interval; + long long time_slept = 0LL; + static long long time_lag = 0; + struct timeval now; + int frameq_full_threshold =0; + int need_reset = 0; + int need_schedule = 0; + + frameq_full_threshold = frameq_sz -thread_no; // Qsize - threads# + + /* 1.5 defer flush time of current frame if need */ + // in case of the first time, just keep ready time only + if (last_ready_time == 0LL) + { + last_ready_time = current_ready_time; + } + else + { + /* 1.5.1 get current ready time & interval */ + saved_ready_time = current_ready_time; + saved_ready_interval = current_ready_interval = current_ready_time - last_ready_time; + // compensate a case which current ready time is older than previous one, + // doesn't work on the interval queue + if (current_ready_interval < 0) + { + current_ready_time = last_ready_time; + current_ready_interval = 0; + } + + /* 1.5.2 get the reset time interval before keeping a new one */ + if (!_IQ_empty()) + { + reset_time_interval = RESET_RATIO * average_interval; + if (average_interval < DOUBLE_RESET_TIME_INTERVAL_THRESHOLD) + { + reset_time_interval *= 2; + } + } + + /* 1.5.3 reset - if too late, discard all saved interval and start from here */ + if (current_ready_interval > RESET_ABSOLUTE_INTERVAL) + { + need_reset = 1; + } + else if (_IQ_length >= thread_no * 2 && current_ready_interval > reset_time_interval) + { + need_reset = 1; + } + else if (_IQ_length >= thread_no && _IQ_length < thread_no * 2 + && current_ready_interval > get_max_interval() * RESET_RATIO) + { + need_reset = 1; + } + + if (need_reset) + { + _IQ_init(); + } + else + { + /* 1.5.4 enqueue - keep a new interval for next average interval */ + if (_IQ_full()) + { + _IQ_delete(); + } + _IQ_insert(saved_ready_time, saved_ready_interval); + + /* 1.5.5 schedule - if faster than average interval, figure out sleep time to meet it */ + if (!dont_schedule) + { + need_schedule = 0; + sleep_time = 0; + if (_IQ_length >= thread_no * 2 && average_interval > theshold_time) + { + need_schedule = 1; + } + // compensate the case that postworker blocks the workers from getting a new fresh frame + // It's actually occurred when during the wait time of postworker, the frame queue is full + // Consequently check the number of currently ready frames and apply some time drop to average time according to the number + if (ready_frames_num >= frameq_full_threshold) + { + need_schedule = 0; + } + if (need_schedule) + { + gettimeofday(&now, NULL); + current_time = tv_to_long_long(&now); + time_lag += (current_time - last_flush_time); + sleep_time = (average_interval < time_lag) ? 0 : (average_interval - time_lag); + } + } + + /* 1.5.6 sleep - actually sleep and get over-slept time (time_lag) for next frame */ + if (sleep_time > 0) + { + sleep_time = sleep_time * 9 / 10; + usleep((unsigned int)sleep_time); + gettimeofday(&now, NULL); + time_slept = tv_to_long_long(&now) - current_time; + time_lag = time_slept - sleep_time; + } + else + { + time_lag = 0; + } + } + last_ready_time = current_ready_time; + } + + return last_ready_time; +} + +static void * +evas_common_frameq_thread_post(void *data) +{ + Evas_FrameQ *frameq; + Evas_Frame *frame; + Evas_Surface *surface; + Thinfo *thinfo; + Evas_Frameq_Thread_Info *fq_info; + Eina_List *pending_writes = NULL; + Eina_List *prev_pending_writes = NULL; + + long long last_ready_time = 0LL; + long long current_ready_time; + Evas_Frame *temp_frame = NULL; + int ready_frames_num; + long long last_flush_time = 0LL; + struct timeval now; + int dont_schedule = 0; + + thinfo = data; + fq_info = (Evas_Frameq_Thread_Info *)(thinfo->fq_info); + frameq = fq_info->frameq; + + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); + /* install thread cancelation cleanup handler */ + pthread_cleanup_push(evas_common_frameq_release, data); + + _IQ_init(); + + for (;;) + { + /* 1. wait the first frame being done */ + LKL(frameq->mutex); + while(!frameq->frames || !frameq->frames->ready) + { + eina_condition_wait(&(frameq->cond_ready)); + } + frame = frameq->frames; + + /* 1.5. prepare to schedule flush time */ + current_ready_time = tv_to_long_long(&frame->ready_time); + ready_frames_num = 0; + EINA_INLIST_FOREACH(EINA_INLIST_GET(frameq->frames), temp_frame) + { + if (temp_frame->ready == 1) + { + ready_frames_num++; + } + } + dont_schedule = (frame->dont_schedule)?1:0; + LKU(frameq->mutex); + + /* 2. generate pending_writes */ + EINA_INLIST_FOREACH(EINA_INLIST_GET(frame->surfaces), surface) + { + evas_common_pipe_flush(surface->im); + if (! surface->dontpush) + { + pending_writes = eina_list_append(pending_writes, surface->im); + } + } + + /* 2.5. schedule flush time */ + last_ready_time = evas_common_frameq_schedule_flush_time( + frameq->frameq_sz, frameq->thread_num, + last_ready_time, current_ready_time, + last_flush_time, ready_frames_num, dont_schedule); + + /* 3. flush redraws */ + frame->output_set_priv(frame->data, pending_writes, prev_pending_writes); + frame->output_flush(frame->data); + gettimeofday(&now, NULL); + // keep as the last flush time + last_flush_time = now.tv_sec * 1000000LL + now.tv_usec; + + prev_pending_writes = pending_writes; + pending_writes = NULL; + + /* 4. remove this frame from the frame queue */ + LKL(frameq->mutex); + frameq->frames = + (Evas_Frame *)eina_inlist_remove(EINA_INLIST_GET(frameq->frames), + EINA_INLIST_GET(frame)); + + LKU(frameq->mutex); + eina_condition_broadcast(&frameq->cond_done); + evas_common_frame_dealloc(frame); + } + + // Remove cleanup handler + pthread_cleanup_pop(0); + return NULL; +} + +#endif /* EVAS_FRAME_QUEUING */ +#endif + +#ifdef BUILD_PTHREAD +static int thread_num = 0; +static Thinfo thinfo[TH_MAX]; +static pthread_barrier_t thbarrier[2]; +#endif + +static void +evas_common_pipe_begin(RGBA_Image *im) +{ +#ifdef BUILD_PTHREAD + int i, y, h; + +#ifdef EVAS_FRAME_QUEUING + return; +#endif + + if (!im->cache_entry.pipe) return; + if (thread_num == 1) return; + 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 +} + +#ifdef EVAS_FRAME_QUEUING +EAPI void +evas_common_frameq_begin(void) +{ +#ifdef BUILD_PTHREAD + int i; + Evas_Frameq_Thread_Info *fp_info; + pthread_attr_t attr; + cpu_set_t cpu; + + if (!gframeq.initialised) + { + int cpunum, set_cpu_affinity = 0; + + cpunum = eina_cpu_count(); + gframeq.thread_num = cpunum; + gframeq.frameq_sz = cpunum * FRAMEQ_SZ_PER_THREAD; + + eina_threads_init(); + + for (i = 0; i < gframeq.thread_num; i++) + { + + fp_info = calloc(1, sizeof(Evas_Frameq_Thread_Info)); + fp_info->frameq = &gframeq; + + gframeq.thinfo[i].thread_num = i; + gframeq.thinfo[i].fq_info = fp_info; + + pthread_attr_init(&attr); + if (set_cpu_affinity) + { + CPU_ZERO(&cpu); + CPU_SET((i+1) % cpunum, &cpu); + pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu); + } + + pthread_create(&(gframeq.thinfo[i].thread_id), &attr, + evas_common_frameq_thread, &(gframeq.thinfo[i])); + + pthread_attr_destroy(&attr); + pthread_detach(gframeq.thinfo[i].thread_id); + } + + { + fp_info = calloc(1, sizeof(Evas_Frameq_Thread_Info)); + fp_info->frameq = &gframeq; + + gframeq.thinfo[i].thread_num = i; + gframeq.thinfo[i].fq_info = fp_info; + + pthread_attr_init(&attr); + if (set_cpu_affinity) + { + CPU_ZERO(&cpu); + CPU_SET((i+1) % cpunum, &cpu); + pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu); + } + + pthread_create(&(gframeq.thinfo[i].thread_id), &attr, + evas_common_frameq_thread_post, &(gframeq.thinfo[i])); + pthread_attr_destroy(&attr); + pthread_detach(gframeq.thinfo[i].thread_id); + } + gframeq.initialised = 1; // now worker threads are created. + + INF("initialised"); + DBG("%d cpus, set_cpu_affinity=%d, frameq_sz=%d", + cpunum, set_cpu_affinity, gframeq.frameq_sz); + } +#endif /* BUILD_PTHREAD */ +} + +EAPI void +evas_common_frameq_finish(void) +{ + int i; + + /* 1. cancel all worker threads */ + for (i = 0; i < gframeq.thread_num; i++) + { + pthread_cancel(gframeq.thinfo[i].thread_id); + } + // cancel post-worker thread + pthread_cancel(gframeq.thinfo[i].thread_id); + + /* 2. send signal to worker threads so that they enter to the thread cancelation cleanup handler */ + for (i = 0; i < gframeq.thread_num; i++) + { + eina_condition_signal(&(gframeq.cond_new)); + } + // send signal to post-worker thread + eina_condition_signal(&(gframeq.cond_ready)); + + /* all the workers were created and detached before + * so don't need to join them here. + */ + +} + +#endif /* EVAS_FRAME_QUEUING */ + +EAPI void +evas_common_pipe_flush(RGBA_Image *im) +{ + if (!im->cache_entry.pipe) return; +#ifndef EVAS_FRAME_QUEUING +#ifdef BUILD_PTHREAD + if (thread_num > 1) + { + /* sync worker threads */ + pthread_barrier_wait(&(thbarrier[1])); + } + else +#endif + { + RGBA_Pipe *p; + int i; + + /* process pipe - 1 thead */ + for (p = im->cache_entry.pipe; p; p = (RGBA_Pipe *)(EINA_INLIST_GET(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); + } + } + } + } +#endif /* !EVAS_FRAME_QUEUING */ + 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->cache_entry.pipe) return; + /* FIXME: PTHREAD join all threads here (if not finished) */ + + /* free pipe */ + while (im->cache_entry.pipe) + { + p = im->cache_entry.pipe; + for (i = 0; i < p->op_num; i++) + { + if (p->op[i].free_func) + { + p->op[i].free_func(&(p->op[i])); + } + } + im->cache_entry.pipe = (RGBA_Pipe *)eina_inlist_remove(EINA_INLIST_GET(im->cache_entry.pipe), EINA_INLIST_GET(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->cache_entry.pipe = evas_common_pipe_add(dst->cache_entry.pipe, &op); + if (!dst->cache_entry.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->cache_entry.pipe = evas_common_pipe_add(dst->cache_entry.pipe, &op); + if (!dst->cache_entry.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 = (RGBA_Polygon_Point *)eina_inlist_remove(EINA_INLIST_GET(op->op.poly.points), + EINA_INLIST_GET(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, 0, 0); + } + else + { + evas_common_polygon_draw(dst, &(op->context), + op->op.poly.points, 0, 0); + } +} + +EAPI void +evas_common_pipe_poly_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + RGBA_Polygon_Point *points, int x, int y) +{ + RGBA_Pipe_Op *op; + RGBA_Polygon_Point *pts = NULL, *p, *pp; + + if (!points) return; + dst->cache_entry.pipe = evas_common_pipe_add(dst->cache_entry.pipe, &op); + if (!dst->cache_entry.pipe) return; + /* FIXME: copy points - maybe we should refcount? */ + for (p = points; p; p = (RGBA_Polygon_Point *)(EINA_INLIST_GET(p))->next) + { + pp = calloc(1, sizeof(RGBA_Polygon_Point)); + if (pp) + { + pp->x = p->x + x; + pp->y = p->y + y; + pts = (RGBA_Polygon_Point *)eina_inlist_append(EINA_INLIST_GET(pts), EINA_INLIST_GET(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); +} + +/**************** TEXT ******************/ +static void +evas_common_pipe_op_text_free(RGBA_Pipe_Op *op) +{ +#ifdef EVAS_FRAME_QUEUING + LKL(op->op.text.font->ref_fq_del); + op->op.text.font->ref_fq[1]++; + LKU(op->op.text.font->ref_fq_del); + eina_condition_signal(&(op->op.text.font->cond_fq_del)); +#else + evas_common_font_free(op->op.text.font); +#endif + evas_common_text_props_content_unref(&(op->op.text.intl_props)); + evas_common_pipe_op_free(op); +} + +#ifdef EVAS_FRAME_QUEUING +/* flush all op using @fn */ +EAPI void +evas_common_pipe_op_text_flush(RGBA_Font *fn) +{ + if (! evas_common_frameq_enabled()) + return; + + LKL(fn->ref_fq_add); + LKL(fn->ref_fq_del); + + while (fn->ref_fq[0] != fn->ref_fq[1]) + eina_condition_wait(&(fn->cond_fq_del)); + + LKU(fn->ref_fq_del); + LKU(fn->ref_fq_add); +} +#endif + +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.intl_props); + } + else + { + evas_common_font_draw(dst, &(op->context), + op->op.text.font, op->op.text.x, op->op.text.y, + &op->op.text.intl_props); + } +} + +EAPI void +evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, + RGBA_Font *fn, int x, int y, const Evas_Text_Props *intl_props) +{ + RGBA_Pipe_Op *op; + + if (!fn) return; + dst->cache_entry.pipe = evas_common_pipe_add(dst->cache_entry.pipe, &op); + if (!dst->cache_entry.pipe) return; + op->op.text.x = x; + op->op.text.y = y; + evas_common_text_props_content_copy_and_ref(&(op->op.text.intl_props), + intl_props); +#ifdef EVAS_FRAME_QUEUING + LKL(fn->ref_fq_add); + fn->ref_fq[0]++; + LKU(fn->ref_fq_add); +#else + fn->references++; +#endif + 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) +{ +#ifdef EVAS_FRAME_QUEUING + LKL(op->op.image.src->cache_entry.ref_fq_del); + op->op.image.src->cache_entry.ref_fq[1]++; + LKU(op->op.image.src->cache_entry.ref_fq_del); + eina_condition_signal(&(op->op.image.src->cache_entry.cond_fq_del)); +#else + op->op.image.src->ref--; + if (op->op.image.src->ref == 0) + { + evas_cache_image_drop(&op->op.image.src->cache_entry); + } +#endif + evas_common_pipe_op_free(op); +} + +#ifdef EVAS_FRAME_QUEUING +EAPI void +evas_common_pipe_op_image_flush(RGBA_Image *im) +{ + if (! evas_common_frameq_enabled()) + return; + + LKL(im->cache_entry.ref_fq_add); + LKL(im->cache_entry.ref_fq_del); + + while (im->cache_entry.ref_fq[0] != im->cache_entry.ref_fq[1]) + eina_condition_wait(&(im->cache_entry.cond_fq_del)); + + LKU(im->cache_entry.ref_fq_del); + LKU(im->cache_entry.ref_fq_add); +} +#endif + +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 + +#ifdef SCALECACHE + evas_common_rgba_image_scalecache_do((Image_Entry *)(op->op.image.src), + dst, &(context), + op->op.image.smooth, + 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, &(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); + } +#endif + } + else + { +#ifdef SCALECACHE + evas_common_rgba_image_scalecache_do((Image_Entry *)(op->op.image.src), + dst, &(op->context), + op->op.image.smooth, + 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); + } +#endif + } +} + +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->cache_entry.pipe = evas_common_pipe_add(dst->cache_entry.pipe, &op); + if (!dst->cache_entry.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; +#ifdef EVAS_FRAME_QUEUING + LKL(src->cache_entry.ref_fq_add); + src->cache_entry.ref_fq[0]++; + LKU(src->cache_entry.ref_fq_add); +#else + src->ref++; +#endif + 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); + +#ifdef EVAS_FRAME_QUEUING + /* laod every src image here. + * frameq utilize all cpu cores already by worker threads + * so another threads and barrier waiting can't be of any benefit. + * therefore, not instantiate loader threads. + */ + if (src->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&src->cache_entry); + evas_common_image_colorspace_normalize(src); +#else + evas_common_pipe_image_load(src); +#endif +} + +static void +evas_common_pipe_op_map_free(RGBA_Pipe_Op *op) +{ +#ifdef EVAS_FRAME_QUEUING + LKL(op->op.image.src->cache_entry.ref_fq_del); + op->op.image.src->cache_entry.ref_fq[1]++; + LKU(op->op.image.src->cache_entry.ref_fq_del); +#else + op->op.map.src->ref--; + if (op->op.map.src->ref == 0) + evas_cache_image_drop(&op->op.map.src->cache_entry); +#endif + free(op->op.map.p); + evas_common_pipe_op_free(op); +} + +static void +evas_common_pipe_map_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_map_rgba(op->op.map.src, dst, + &context, op->op.map.npoints, op->op.map.p, + op->op.map.smooth, op->op.map.level); + } + else + { + evas_common_map_rgba(op->op.map.src, dst, + &(op->context), op->op.map.npoints, op->op.map.p, + op->op.map.smooth, op->op.map.level); + } +} + +EAPI void +evas_common_pipe_map_draw(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, int npoints, RGBA_Map_Point *p, + int smooth, int level) +{ + RGBA_Pipe_Op *op; + RGBA_Map_Point *pts_copy; + int i; + + if (!src) return; + pts_copy = malloc(sizeof (RGBA_Map_Point) * 4); + if (!pts_copy) return; + dst->cache_entry.pipe = evas_common_pipe_add(dst->cache_entry.pipe, &op); + if (!dst->cache_entry.pipe) + { + free(pts_copy); + return; + } + + for (i = 0; i < 4; ++i) + pts_copy[i] = p[i]; + + op->op.map.npoints = npoints; + op->op.map.smooth = smooth; + op->op.map.level = level; +#ifdef EVAS_FRAME_QUEUING + LKL(src->cache_entry.ref_fq_add); + src->cache_entry.ref_fq[0]++; + LKU(src->cache_entry.ref_fq_add); +#else + src->ref++; +#endif + op->op.map.src = src; + op->op.map.p = pts_copy; + op->op_func = evas_common_pipe_map_draw_do; + op->free_func = evas_common_pipe_op_map_free; + evas_common_pipe_draw_context_copy(dc, op); + +#ifdef EVAS_FRAME_QUEUING + /* laod every src image here. + * frameq utilize all cpu cores already by worker threads + * so another threads and barrier waiting can't be of any benefit. + * therefore, not instantiate loader threads. + */ + if (src->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&src->cache_entry); + evas_common_image_colorspace_normalize(src); +#else + evas_common_pipe_image_load(src); +#endif +} + +static void +evas_common_pipe_map_render(RGBA_Image *root) +{ + RGBA_Pipe *p; + int i; + + /* Map imply that we need to process them recursively first. */ + for (p = root->cache_entry.pipe; p; p = (RGBA_Pipe *)(EINA_INLIST_GET(p))->next) + { + for (i = 0; i < p->op_num; i++) + { + if (p->op[i].op_func == evas_common_pipe_map_draw_do) + { + if (p->op[i].op.map.src->cache_entry.pipe) + evas_common_pipe_map_render(p->op[i].op.map.src); + } + else if (p->op[i].op_func == evas_common_pipe_image_draw_do) + { + if (p->op[i].op.image.src->cache_entry.pipe) + evas_common_pipe_map_render(p->op[i].op.image.src); + } + } + } + + evas_common_pipe_begin(root); + evas_common_pipe_flush(root); +} + +#ifdef BUILD_PTHREAD +static Eina_List *task = NULL; +static Thinfo task_thinfo[TH_MAX]; +static pthread_barrier_t task_thbarrier[2]; +static LK(task_mutext); +#endif + +#ifdef BUILD_PTHREAD +static void* +evas_common_pipe_load(void *data) +{ + Thinfo *tinfo; + + tinfo = data; + for (;;) + { + /* wait for start signal */ + pthread_barrier_wait(&(tinfo->barrier[0])); + + while (task) + { + RGBA_Image *im = NULL; + + LKL(task_mutext); + im = eina_list_data_get(task); + task = eina_list_remove_list(task, task); + LKU(task_mutext); + + if (im) + { + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); + + im->flags &= ~RGBA_IMAGE_TODO_LOAD; + } + } + + /* send finished signal */ + pthread_barrier_wait(&(tinfo->barrier[1])); + } + + return NULL; +} +#endif + +static volatile int bval = 0; + +static void +evas_common_pipe_image_load_do(void) +{ +#ifdef BUILD_PTHREAD + /* Notify worker thread. */ + pthread_barrier_wait(&(task_thbarrier[0])); + + /* sync worker threads */ + pthread_barrier_wait(&(task_thbarrier[1])); +#endif +} + +static Eina_Bool +evas_common_pipe_init(void) +{ +#ifdef BUILD_PTHREAD + if (thread_num == 0) + { + int cpunum; + int i; + + cpunum = eina_cpu_count(); + thread_num = cpunum; +// on single cpu we still want this initted.. otherwise we block forever +// waiting onm pthread barriers for async rendering on a single core! +// if (thread_num == 1) return EINA_FALSE; + + eina_threads_init(); + + LKI(task_mutext); + + 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); + } + + pthread_barrier_init(&(task_thbarrier[0]), NULL, thread_num + 1); + pthread_barrier_init(&(task_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); + task_thinfo[i].thread_num = i; + task_thinfo[i].info = NULL; + task_thinfo[i].barrier = task_thbarrier; + /* setup initial locks */ + pthread_create(&(task_thinfo[i].thread_id), &attr, + evas_common_pipe_load, &(task_thinfo[i])); + pthread_attr_destroy(&attr); + } + } + + if (thread_num == 1) return EINA_FALSE; + return EINA_TRUE; +#endif + return EINA_FALSE; +} + +EAPI void +evas_common_pipe_image_load(RGBA_Image *im) +{ + if (im->flags & RGBA_IMAGE_TODO_LOAD) + return ; + + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888 + && !evas_cache_image_is_loaded(&(im->cache_entry))) + goto add_task; + + if ((!im->cs.data) || ((!im->cs.dirty) && (!(im->flags & RGBA_IMAGE_IS_DIRTY)))) + goto add_task; + + return ; + + add_task: + task = eina_list_append(task, im); + im->flags |= RGBA_IMAGE_TODO_LOAD; +} + +EAPI void +evas_common_pipe_map_begin(RGBA_Image *root) +{ + if (!evas_common_pipe_init()) + { + RGBA_Image *im; + + EINA_LIST_FREE(task, im) + { + if (im->cache_entry.space == EVAS_COLORSPACE_ARGB8888) + evas_cache_image_load_data(&im->cache_entry); + evas_common_image_colorspace_normalize(im); + + im->flags &= ~RGBA_IMAGE_TODO_LOAD; + } + } + + evas_common_pipe_image_load_do(); + + evas_common_pipe_map_render(root); +} + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_pipe.h b/libraries/evas/src/lib/engines/common/evas_pipe.h new file mode 100644 index 0000000..37b0136 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_pipe.h @@ -0,0 +1,111 @@ +#ifndef _EVAS_PIPE_H +#define _EVAS_PIPE_H + +#include +#include "language/evas_bidi_utils.h" + +#ifdef BUILD_PTHREAD +typedef struct _Thinfo +{ + int thread_num; + pthread_t thread_id; + pthread_barrier_t *barrier; + RGBA_Pipe_Thread_Info *info; +# ifdef EVAS_FRAME_QUEUING + void *fq_info; +#endif +} Thinfo; +#endif + +#ifdef EVAS_FRAME_QUEUING +struct _Evas_Surface +{ + EINA_INLIST; + RGBA_Image *im; + int x, y, w, h; + int dontpush; // dont push the surface out after drawing done +}; +typedef struct _Evas_Surface Evas_Surface; + +struct _Evas_Frame +{ + EINA_INLIST; + Evas_Surface *surfaces; + void *data; + int in_process; + int ready; + int dont_schedule; + struct timeval ready_time; + + 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_set_priv)(void *data, void *cur, void *prev); +}; +typedef struct _Evas_Frame Evas_Frame; + + +struct _Evas_FrameQ +{ + int initialised; + Evas_Frame *frames; + Eina_Condition cond_new; + Eina_Condition cond_ready; + Eina_Condition cond_done; + LK(mutex); + + int thread_num; + Thinfo thinfo[TH_MAX]; + int frameq_sz; + + Evas_Frame *cur_frame; +}; +typedef struct _Evas_FrameQ Evas_FrameQ; +#define FRAMEQ_SZ_PER_THREAD 2 + +struct _Evas_Frameq_Thread_Info +{ + Evas_FrameQ *frameq; +}; +typedef struct _Evas_Frameq_Thread_Info Evas_Frameq_Thread_Info; + +EAPI Evas_Surface *evas_common_frameq_new_surface(void *surface, int x, int y, int w, int h); +EAPI void evas_common_frameq_add_surface(Evas_Surface *surface); +EAPI void evas_common_frameq_set_frame_data(void *data, + void (*fn_output_redraws_next_update_push) (void *data, void *surface, int x, int y, int w, int h), + void (*fn_output_flush) (void *data), + void (*fn_output_set_priv)(void *data, void *cur, void *prev)); +EAPI void evas_common_frameq_prepare_frame(void); +EAPI void evas_common_frameq_ready_frame(void); +EAPI void evas_common_frameq_init(void); +EAPI void evas_common_frameq_destroy(void); +EAPI void evas_common_frameq_flush(void); +EAPI void evas_common_frameq_flush_ready(void); +EAPI int evas_common_frameq_get_frameq_sz(void); +EAPI int evas_common_frameq_enabled(void); +EAPI void evas_common_frameq_begin(void); +EAPI void evas_common_frameq_finish(void); +#endif + +/* image rendering pipelines... new optional system - non-immediate and + * threadable + */ + +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, int x, int y); +EAPI void evas_common_pipe_text_draw(RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const Evas_Text_Props *intl_props); +EAPI void evas_common_pipe_image_load(RGBA_Image *im); +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); +EAPI void evas_common_pipe_map_begin(RGBA_Image *root); +EAPI void evas_common_pipe_map_draw(RGBA_Image *src, RGBA_Image *dst, + RGBA_Draw_Context *dc, int npoints, RGBA_Map_Point *p, + int smooth, int level); +EAPI void evas_common_pipe_flush(RGBA_Image *im); + +#ifdef EVAS_FRAME_QUEUING +EAPI void evas_common_pipe_op_text_flush(RGBA_Font *fn); +EAPI void evas_common_pipe_op_image_flush(RGBA_Image *im); +#endif + +#endif /* _EVAS_PIPE_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_polygon.h b/libraries/evas/src/lib/engines/common/evas_polygon.h new file mode 100644 index 0000000..0695f54 --- /dev/null +++ b/libraries/evas/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, int x, int y); + + +#endif /* _EVAS_POLYGON_H */ + diff --git a/libraries/evas/src/lib/engines/common/evas_polygon_main.c b/libraries/evas/src/lib/engines/common/evas_polygon_main.c new file mode 100644 index 0000000..bca3f83 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_polygon_main.c @@ -0,0 +1,293 @@ +#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 +{ + EINA_INLIST; + 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 = (RGBA_Polygon_Point *)eina_inlist_append(EINA_INLIST_GET(points), EINA_INLIST_GET(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 = (RGBA_Polygon_Point *)eina_inlist_remove(EINA_INLIST_GET(points), EINA_INLIST_GET(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, int x, int y) +{ + RGBA_Gfx_Func func; + RGBA_Polygon_Point *pt; + RGBA_Vertex *point; + RGBA_Edge *edges; + Eina_Inlist *spans; + int num_active_edges; + int n; + int i, j, k; + int y0, y1, yi; + 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; EINA_INLIST_FOREACH(points, pt) 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; + EINA_INLIST_FOREACH(points, pt) + { + point[k].x = pt->x + x; + point[k].y = pt->y + 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; + EINA_INLIST_FOREACH(points, pt) + { + point[k].x = pt->x + x; + point[k].y = pt->y + 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 (yi = y0; yi <= y1; yi++) + { + for (; (k < n) && (point[sorted_index[k]].y <= ((double)yi + 0.5)); k++) + { + i = sorted_index[k]; + + if (i > 0) j = i - 1; + else j = n - 1; + if (point[j].y <= ((double)yi - 0.5)) + { + POLY_EDGE_DEL(j) + } + else if (point[j].y > ((double)yi + 0.5)) + { + POLY_EDGE_ADD(j, yi) + } + if (i < (n - 1)) j = i + 1; + else j = 0; + if (point[j].y <= ((double)yi - 0.5)) + { + POLY_EDGE_DEL(i) + } + else if (point[j].y > ((double)yi + 0.5)) + { + POLY_EDGE_ADD(i, yi) + } + } + + 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 = eina_inlist_append(spans, EINA_INLIST_GET(span)); + span->y = yi; + 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) + { + RGBA_Span *span; + + EINA_INLIST_FOREACH(spans, span) + { + DATA32 *ptr; + +#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) + { + span = (RGBA_Span *)spans; + spans = eina_inlist_remove(spans, spans); + free(span); + } + } +} diff --git a/libraries/evas/src/lib/engines/common/evas_rectangle.h b/libraries/evas/src/lib/engines/common/evas_rectangle.h new file mode 100644 index 0000000..a653b04 --- /dev/null +++ b/libraries/evas/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/libraries/evas/src/lib/engines/common/evas_rectangle_main.c b/libraries/evas/src/lib/engines/common/evas_rectangle_main.c new file mode 100644 index 0000000..28aaf16 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_rectangle_main.c @@ -0,0 +1,73 @@ +#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/libraries/evas/src/lib/engines/common/evas_regionbuf.c b/libraries/evas/src/lib/engines/common/evas_regionbuf.c new file mode 100644 index 0000000..f381da5 --- /dev/null +++ b/libraries/evas/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] = eina_inlist_remove(rb->spans[y], rb->spans[y]); + free(span); + } + } +} + +void +evas_common_regionbuf_span_add(Regionbuf *rb, int x1, int x2, int y) +{ + 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; + EINA_INLIST_FOREACH(rb->spans[y], span) + { + nspan = (Regionspan *)(EINA_INLIST_GET(span))->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] = eina_inlist_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 + { + Eina_Inlist *l; + + /* remove all nodes after sp_start and before_sp_stop because + * the new */ + for (l = (EINA_INLIST_GET(sp_start))->next; l != EINA_INLIST_GET(sp_stop);) + { + span = (Regionspan *)l; + l = l->next; + rb->spans[y] = eina_inlist_remove(rb->spans[y], span); + free(span); + } + /* remove the end span */ + rb->spans[y] = eina_inlist_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] = eina_inlist_append(rb->spans[y], span2); +} + +void +evas_common_regionbuf_span_del(Regionbuf *rb, int x1, int x2, int y) +{ + /* FIXME: del span */ + 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; + EINA_INLIST_FOREACH(rb->spans[y], span) + { + nspan = (Regionspan *)(EINA_INLIST_GET(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] = eina_inlist_remove(rb->spans[y], sp_start); + return; + } + } + /* it ends on or after the end of this 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] = eina_inlist_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] = eina_inlist_prepend_relative(rb->spans[y], span2, sp_start); + sp_start->x1 = x2 + 1; + return; + } + } + else + { + Eina_Inlist *l; + + /* remove all nodes after sp_start and before_sp_stop because + * the new */ + for (l = (EINA_INLIST_GET(sp_start))->next; l != EINA_INLIST_GET(sp_stop);) + { + span = (Regionspan *)l; + l = l->next; + rb->spans[y] = eina_inlist_remove(rb->spans[y], span); + free(span); + } + /* all of the start span is cut out */ + if (x1 <= sp_start->x1) + { + rb->spans[y] = eina_inlist_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] = eina_inlist_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++) + { + Regionspan *sp_start; + Eina_Inlist *l, *ll; + + for (l = EINA_INLIST_GET(rb->spans[y]); l;) + { + Regionspan *span; + int yy; + + sp_start = (Regionspan *)l; + l = l->next; + rb->spans[y] = eina_inlist_remove(rb->spans[y], sp_start); + for (yy = y + 1; yy < rb->h; yy++) + { + int match = 0; + + for (ll = EINA_INLIST_GET(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] = eina_inlist_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 = eina_inlist_append(rects, r); + free(sp_start); + } + } + evas_common_regionbuf_clear(rb); + return rects; +} +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_scale_main.c b/libraries/evas/src/lib/engines/common/evas_scale_main.c new file mode 100644 index 0000000..959336c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_main.c @@ -0,0 +1,6 @@ +#include "evas_common.h" + +EAPI void +evas_common_scale_init(void) +{ +} diff --git a/libraries/evas/src/lib/engines/common/evas_scale_main.h b/libraries/evas/src/lib/engines/common/evas_scale_main.h new file mode 100644 index 0000000..eafd9d2 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_main.h @@ -0,0 +1,13 @@ +#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); + +EAPI void evas_common_rgba_image_scalecache_dump(void); + +#endif /* _EVAS_SCALE_MAIN_H */ diff --git a/libraries/evas/src/lib/engines/common/evas_scale_sample.c b/libraries/evas/src/lib/engines/common/evas_scale_sample.c new file mode 100644 index 0000000..54b8e92 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_sample.c @@ -0,0 +1,398 @@ +#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 m_clip_x = 0, m_clip_y = 0, m_clip_w = 0, m_clip_h = 0, mdx = 0, mdy = 0; + int src_w, src_h, dst_w, dst_h; + RGBA_Gfx_Func func; + RGBA_Image *maskobj = NULL; + DATA8 *mask = NULL; + + 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 (dc->mask.mask) + { + m_clip_x = dc->mask.x; + m_clip_y = dc->mask.y; + m_clip_w = dc->mask.mask->cache_entry.w; + m_clip_h = dc->mask.mask->cache_entry.h; + RECTS_CLIP_TO_RECT(m_clip_x, m_clip_y, m_clip_w, m_clip_h, + dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h); + if ((m_clip_w <= 0) || (m_clip_h <= 0)) return; + dst_clip_x = m_clip_x; + dst_clip_y = m_clip_y; + dst_clip_w = m_clip_w; + dst_clip_h = m_clip_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->mask.mask) + { + func = evas_common_gfx_func_composite_pixel_mask_span_get(src, dst, dst_clip_w, dc->render_op); + maskobj = dc->mask.mask; + mask = maskobj->mask.mask; +/* + if (1 || dst_region_w > src_region_w || dst_region_h > src_region_h){ + printf("Mask w/h: %d/%d\n",maskobj->cache_entry.w, + maskobj->cache_entry.h); + printf("Warning: Unscaled mask (%d/%d) // (%d/%d)\n", + dst_region_w,src_region_w, + dst_region_h,src_region_h); + } + */ + } + else 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)) + { +#ifdef HAVE_PIXMAN + if ((1) && + (src->pixman.im) && (dst->pixman.im) && + ((!dc->mul.use) || + ((dc->mul.use) && (dc->mul.col == 0xffffffff))) && + ((dc->render_op == _EVAS_RENDER_COPY) || + (dc->render_op == _EVAS_RENDER_BLEND)) + ) + { + pixman_op_t op = PIXMAN_OP_SRC; // _EVAS_RENDER_COPY + if (dc->render_op == _EVAS_RENDER_BLEND) op = PIXMAN_OP_OVER; + pixman_image_composite(op, + src->pixman.im, NULL, + dst->pixman.im, + (dst_clip_x - dst_region_x) + src_region_x, + (dst_clip_y - dst_region_y) + src_region_y, + 0, 0, + dst_clip_x, dst_clip_y, + dst_clip_w, dst_clip_h); + } + else +#endif + { + ptr = src_data + ((dst_clip_y - dst_region_y + src_region_y) * src_w) + (dst_clip_x - dst_region_x) + src_region_x; + if (mask) + { + mdx = (m_clip_x - dc->mask.x) + (m_clip_x - dst_clip_x); + mdy = (m_clip_y - dc->mask.y) + (m_clip_y - dst_clip_y); + mask += mdx + (mdy * maskobj->cache_entry.w); + } + 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, mask, dc->mul.col, dst_ptr, dst_clip_w); + } + ptr += src_w; + dst_ptr += dst_w; + if (mask) mask += maskobj->cache_entry.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/libraries/evas/src/lib/engines/common/evas_scale_smooth.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth.c new file mode 100644 index 0000000..d3aada6 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth.c @@ -0,0 +1,532 @@ +#include "evas_common.h" +#include "evas_scale_smooth.h" +#include "evas_blend_private.h" + +#define SCALE_CALC_X_POINTS(P, SW, DW, CX, CW) \ + P = alloca((CW + 1) * sizeof (int)); \ + scale_calc_x_points(P, SW, DW, CX, CW); + +#define SCALE_CALC_Y_POINTS(P, SRC, SW, SH, DH, CY, CH) \ + P = alloca((CH + 1) * sizeof (DATA32 *)); \ + scale_calc_y_points(P, SRC, SW, SH, DH, CY, CH); + +#define SCALE_CALC_A_POINTS(P, S, D, C, CC) \ + P = alloca(CC * sizeof (int)); \ + scale_calc_a_points(P, S, D, C, CC); + +static void scale_calc_y_points(DATA32 **p, DATA32 *src, int sw, int sh, int dh, int cy, int ch); +static void scale_calc_x_points(int *p, int sw, int dw, int cx, int cw); +static void scale_calc_a_points(int *p, int s, int d, int c, int cc); + +static void +scale_calc_y_points(DATA32** p, DATA32 *src, int sw, int sh, int dh, int cy, int ch) +{ + int i, val, inc; + if (sh > SCALE_SIZE_MAX) return; + val = 0; + inc = (sh << 16) / dh; + for (i = 0; i < dh; i++) + { + if ((i >= cy) && (i < (cy + ch))) + p[i - cy] = src + ((val >> 16) * sw); + val += inc; + } + if ((i >= cy) && (i < (cy + ch))) + p[i - cy] = p[i - cy - 1]; +} + +static void +scale_calc_x_points(int *p, int sw, int dw, int cx, int cw) +{ + int i, val, inc; + if (sw > SCALE_SIZE_MAX) return; + val = 0; + inc = (sw << 16) / dw; + for (i = 0; i < dw; i++) + { + if ((i >= cx) && (i < (cx + cw))) + p[i - cx] = val >> 16; + val += inc; + } + if ((i >= cx) && (i < (cx + cw))) + p[i - cx] = p[i - cx - 1]; +} + +static void +scale_calc_a_points(int *p, int s, int d, int c, int cc) +{ + int i, val, inc; + + if (s > SCALE_SIZE_MAX) return; + if (d >= s) + { + val = 0; + inc = (s << 16) / d; + for (i = 0; i < d; i++) + { + if ((i >= c) && (i < (c + cc))) + { + p[i - c] = (val >> 8) - ((val >> 8) & 0xffffff00); + if ((val >> 16) >= (s - 1)) p[i - c] = 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; + if ((i >= c) && (i < (c + cc))) + p[i - c] = ap | (Cp << 16); + val += inc; + } + } +} + +#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; + 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; + + /* NB: Dead assignments (reassigned to different values below) + 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; + + /* NB: Dead assignment (gets reassigned later) */ +// 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/libraries/evas/src/lib/engines/common/evas_scale_smooth.h b/libraries/evas/src/lib/engines/common/evas_scale_smooth.h new file mode 100644 index 0000000..63ced50 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth.h @@ -0,0 +1,19 @@ +#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/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler.c new file mode 100644 index 0000000..599bfda --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler.c @@ -0,0 +1,211 @@ +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_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; + + /* some maximum region sizes to avoid insane calc point tables */ + if (dst_clip_w > 65536) return; + if (dst_clip_h > 65536) return; + if (dst_region_w > (65536 * 1024)) return; + if (dst_region_h > (65536 * 1024)) return; + + /* figure out dst jump + * NB: Unused currently, so commented out */ +// 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/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_down.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_down.c new file mode 100644 index 0000000..357eb32 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_down.c @@ -0,0 +1,43 @@ +{ + DATA32 **ypoints; + int *xpoints; + int *xapoints, *xapp; + int *yapoints, *yapp; + DATA32 *buf, *src_data; + + RGBA_Gfx_Func func; + + src_data = src->image.data; + + /* some maximum region sizes to avoid insane calc point tables */ + SCALE_CALC_X_POINTS(xpoints, src_region_w, dst_region_w, dst_clip_x - dst_region_x, dst_clip_w); + SCALE_CALC_Y_POINTS(ypoints, src_data, src_w, src_region_h, dst_region_h, dst_clip_y - dst_region_y, dst_clip_h); + SCALE_CALC_A_POINTS(xapoints, src_region_w, dst_region_w, dst_clip_x - dst_region_x, dst_clip_w); + SCALE_CALC_A_POINTS(yapoints, src_region_h, dst_region_h, dst_clip_y - dst_region_y, dst_clip_h); + + /* 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" + } +} diff --git a/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx.c new file mode 100644 index 0000000..50b2e5c --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx.c @@ -0,0 +1,259 @@ +{ + 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 + (1 << 3)) >> 4), + ((r + (1 << 3)) >> 4), + ((g + (1 << 3)) >> 4), + ((b + (1 << 3)) >> 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 + (1 << 3)) >> 4), + ((g + (1 << 3)) >> 4), + ((b + (1 << 3)) >> 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 + (1 << 3)) >> 4), + ((g + (1 << 3)) >> 4), + ((b + (1 << 3)) >> 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/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c new file mode 100644 index 0000000..ab0c74e --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downx_downy.c @@ -0,0 +1,387 @@ +{ + 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 + (1 << 4)) >> 5), + ((r + (1 << 4)) >> 5), + ((g + (1 << 4)) >> 5), + ((b + (1 << 4)) >> 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 + (1 << 4)) >> 5), + ((g + (1 << 4)) >> 5), + ((b + (1 << 4)) >> 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 + (1 << 4)) >> 5), + ((g + (1 << 4)) >> 5), + ((b + (1 << 4)) >> 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/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downy.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downy.c new file mode 100644 index 0000000..4c5448e --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_downy.c @@ -0,0 +1,260 @@ +{ + 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 + (1 << 3)) >> 4), + ((r + (1 << 3)) >> 4), + ((g + (1 << 3)) >> 4), + ((b + (1 << 3)) >> 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 + (1 << 3)) >> 4), + ((g + (1 << 3)) >> 4), + ((b + (1 << 3)) >> 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 + (1 << 3)) >> 4), + ((g + (1 << 3)) >> 4), + ((b + (1 << 3)) >> 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/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c new file mode 100644 index 0000000..24529e5 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_noscale.c @@ -0,0 +1,62 @@ +{ + DATA32 *ptr; + RGBA_Gfx_Func func; + RGBA_Image *maskobj; + DATA8 *mask = NULL; +#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->mask.mask) + { + func = evas_common_gfx_func_composite_pixel_mask_span_get(NULL, NULL, dst_clip_w, dc->render_op); + maskobj = dc->mask.mask; + mask = maskobj->mask.mask; + } + else 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 (mask) + { + // mask += dst_clip_x - dc->mask.x; + // mask += (dst_clip_y - dc->mask.y) * maskobj->cache_entry.w; + while (dst_clip_h--) + { + +#ifdef EVAS_SLI + if (((ysli) % dc->sli.h) == dc->sli.y) +#endif + { + func(ptr, mask, dc->mul.col, dst_ptr, dst_clip_w); + } +#ifdef EVAS_SLI + ysli++; +#endif + ptr += src_w; + dst_ptr += dst_w; + mask += maskobj->cache_entry.w; + } + } + else + { + 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; + } + } +} + +/* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ diff --git a/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_up.c b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_up.c new file mode 100644 index 0000000..7327ac5 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_smooth_scaler_up.c @@ -0,0 +1,266 @@ +{ + 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 = NULL; + + /* check value to make overflow(only check value related with overflow) */ + if ((src_region_w > SCALE_SIZE_MAX) || + (src_region_h > SCALE_SIZE_MAX)) return; + + /* 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); + + 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/libraries/evas/src/lib/engines/common/evas_scale_span.c b/libraries/evas/src/lib/engines/common/evas_scale_span.c new file mode 100644 index 0000000..e0fefb2 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_span.c @@ -0,0 +1,653 @@ +#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 __UNUSED__, 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 > SCALE_SIZE_MAX) || (dst_len > SCALE_SIZE_MAX)) 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 > SCALE_SIZE_MAX) || (dst_len > SCALE_SIZE_MAX)) 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 __UNUSED__, 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 > SCALE_SIZE_MAX) || (dst_len > SCALE_SIZE_MAX)) 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 __UNUSED__, 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 > SCALE_SIZE_MAX) || (dst_len > SCALE_SIZE_MAX)) 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 __UNUSED__, 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 > SCALE_SIZE_MAX) || (dst_len > SCALE_SIZE_MAX)) 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 > SCALE_SIZE_MAX) || (dst_len > SCALE_SIZE_MAX)) 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/libraries/evas/src/lib/engines/common/evas_scale_span.h b/libraries/evas/src/lib/engines/common/evas_scale_span.h new file mode 100644 index 0000000..874c594 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_scale_span.h @@ -0,0 +1,14 @@ +#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/libraries/evas/src/lib/engines/common/evas_text_utils.c b/libraries/evas/src/lib/engines/common/evas_text_utils.c new file mode 100644 index 0000000..a00df91 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_text_utils.c @@ -0,0 +1,472 @@ +#include "evas_common.h" +#include "evas_font_private.h" +#include "evas_text_utils.h" +#include "language/evas_bidi_utils.h" +#include "language/evas_language_utils.h" +#include "evas_font_ot.h" + +void +evas_common_text_props_bidi_set(Evas_Text_Props *props, + Evas_BiDi_Paragraph_Props *bidi_par_props, size_t start) +{ +#ifdef BIDI_SUPPORT + props->bidi.dir = (evas_bidi_is_rtl_char( + bidi_par_props, + 0, + start)) ? EVAS_BIDI_DIRECTION_RTL : EVAS_BIDI_DIRECTION_LTR; +#else + (void) start; + (void) bidi_par_props; + props->bidi.dir = EVAS_BIDI_DIRECTION_LTR; +#endif +} + +void +evas_common_text_props_script_set(Evas_Text_Props *props, Evas_Script_Type scr) +{ + props->script = scr; +} + +void +evas_common_text_props_content_copy_and_ref(Evas_Text_Props *dst, + const Evas_Text_Props *src) +{ + memcpy(dst, src, sizeof(Evas_Text_Props)); + evas_common_text_props_content_ref(dst); +} + +void +evas_common_text_props_content_ref(Evas_Text_Props *props) +{ + /* No content in this case */ + if (!props->info) + return; + + props->info->refcount++; +} + +void +evas_common_text_props_content_unref(Evas_Text_Props *props) +{ + /* No content in this case */ + if (!props->info) + return; + + if (--(props->info->refcount) == 0) + { + if (props->info->glyph) + free(props->info->glyph); +#ifdef OT_SUPPORT + if (props->info->ot) + free(props->info->ot); +#endif + free(props->info); + props->info = NULL; + } +} + +static int +_evas_common_text_props_cluster_move(const Evas_Text_Props *props, int pos, + Eina_Bool right) +{ + int prop_pos = evas_common_text_props_index_find(props, pos); + if (!right && (prop_pos > 0)) + { +#ifdef OT_SUPPORT + return props->info->ot[props->start + prop_pos - 1].source_cluster - + props->text_offset; +#else + return props->start + prop_pos - 1 - props->text_offset; +#endif + } + else if (right && (prop_pos < (int) (props->len - 1))) + { +#ifdef OT_SUPPORT + return props->info->ot[props->start + prop_pos + 1].source_cluster - + props->text_offset; +#else + return props->start + prop_pos + 1 - props->text_offset; +#endif + } + + return pos; +} + +EAPI int +evas_common_text_props_cluster_next(const Evas_Text_Props *props, int pos) +{ + Eina_Bool right; + /* Move right if we are in a non-rtl text */ + right = (props->bidi.dir != EVAS_BIDI_DIRECTION_RTL); + return _evas_common_text_props_cluster_move(props, pos, right); +} + +EAPI int +evas_common_text_props_cluster_prev(const Evas_Text_Props *props, int pos) +{ + Eina_Bool right; + /* Move right if we are in an rtl text */ + right = (props->bidi.dir == EVAS_BIDI_DIRECTION_RTL); + return _evas_common_text_props_cluster_move(props, pos, right); +} + +/* Returns the index of the logical char in the props. */ +EAPI int +evas_common_text_props_index_find(const Evas_Text_Props *props, int _cutoff) +{ +#ifdef OT_SUPPORT + Evas_Font_OT_Info *ot_info; + int min = 0; + int max = props->len - 1; + int mid; + + _cutoff += props->text_offset; + ot_info = props->info->ot + props->start; + /* Should get us closer to the right place. */ + if ((min <= _cutoff) && (_cutoff <= max)) + mid = _cutoff; + else + mid = (min + max) / 2; + + if (props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + /* Monotonic in a descending order */ + do + { + if (_cutoff > (int) ot_info[mid].source_cluster) + max = mid - 1; + else if (_cutoff < (int) ot_info[mid].source_cluster) + min = mid + 1; + else + break; + + mid = (min + max) / 2; + } + while (min <= max); + } + else + { + /* Monotonic in an ascending order */ + do + { + if (_cutoff < (int) ot_info[mid].source_cluster) + max = mid - 1; + else if (_cutoff > (int) ot_info[mid].source_cluster) + min = mid + 1; + else + break; + + mid = (min + max) / 2; + } + while (min <= max); + } + + /* If we didn't find, abort */ + if (min > max) + return -1; + + ot_info += mid; + if (props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + /* Walk to the last one of the same cluster */ + for ( ; mid < (int) props->len ; mid++, ot_info++) + { + if (ot_info->source_cluster != (size_t) _cutoff) + break; + } + mid--; + } + else + { + /* Walk to the last one of the same cluster */ + for ( ; mid >= 0 ; mid--, ot_info--) + { + if (ot_info->source_cluster != (size_t) _cutoff) + break; + } + mid++; + } + + return mid; +#else + return _cutoff; + (void) props; +#endif +} + +/* Won't work in the middle of ligatures, assumes cutoff < len. + * Also won't work in the middle of indic words, should handle that in a + * smart way. */ +EAPI void +evas_common_text_props_split(Evas_Text_Props *base, + Evas_Text_Props *ext, int _cutoff) +{ + size_t cutoff; + + /* Translate text cutoff pos to string object cutoff point */ +#ifdef OT_SUPPORT + _cutoff = evas_common_text_props_index_find(base, _cutoff); + + if (_cutoff >= 0) + { + cutoff = (size_t) _cutoff; + } + else + { + ERR("Couldn't find the cutoff position. Is it inside a cluster?"); + return; + } +#else + cutoff = (size_t) _cutoff; +#endif + + evas_common_text_props_content_copy_and_ref(ext, base); + if (base->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + ext->start = base->start; + ext->len = cutoff + 1; + base->start = base->start + ext->len; + base->len = base->len - ext->len; + +#ifdef OT_SUPPORT + ext->text_offset = + ext->info->ot[ext->start + ext->len - 1].source_cluster; +#else + ext->text_offset = base->text_offset + base->len; +#endif + } + else + { + ext->start = base->start + cutoff; + ext->len = base->len - cutoff; + base->len = cutoff; + +#ifdef OT_SUPPORT + ext->text_offset = ext->info->ot[ext->start].source_cluster; +#else + ext->text_offset = base->text_offset + base->len; +#endif + } + ext->text_len = base->text_len - (ext->text_offset - base->text_offset); + base->text_len = (ext->text_offset - base->text_offset); +} + +/* Won't work in the middle of ligatures */ +EAPI void +evas_common_text_props_merge(Evas_Text_Props *item1, + const Evas_Text_Props *item2) +{ + if (item1->info != item2->info) + { + ERR("tried merge back items that weren't together in the first place."); + return; + } + if (item1->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + item1->start = item2->start; + } + + item1->len += item2->len; + item1->text_len += item2->text_len; +} + +EAPI Eina_Bool +evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text, + Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, + size_t par_pos, int len) +{ + RGBA_Font_Int *fi = (RGBA_Font_Int *) _fi; + + if (text_props->info) + { + evas_common_text_props_content_unref(text_props); + } + if (len == 0) + { + text_props->info = NULL; + text_props->start = text_props->len = text_props->text_offset = 0; + } + text_props->info = calloc(1, sizeof(Evas_Text_Props_Info)); + + text_props->font_instance = fi; + + evas_common_font_int_reload(fi); + if (fi->src->current_size != fi->size) + { + FTLOCK(); + FT_Activate_Size(fi->ft.size); + FTUNLOCK(); + fi->src->current_size = fi->size; + } + +#ifdef OT_SUPPORT + size_t char_index; + Evas_Font_Glyph_Info *gl_itr; + Evas_Coord pen_x = 0, adjust_x = 0; + (void) par_props; + (void) par_pos; + + evas_common_font_ot_populate_text_props(text, text_props, len); + + gl_itr = text_props->info->glyph; + for (char_index = 0 ; char_index < text_props->len ; char_index++) + { + FT_UInt idx; + RGBA_Font_Glyph *fg; + Eina_Bool is_replacement = EINA_FALSE; + /* If we got a malformed index, show the replacement char instead */ + if (gl_itr->index == 0) + { + gl_itr->index = evas_common_get_char_index(fi, REPLACEMENT_CHAR); + is_replacement = EINA_TRUE; + } + idx = gl_itr->index; + LKL(fi->ft_mutex); + fg = evas_common_font_int_cache_glyph_get(fi, idx); + if (!fg) + { + LKU(fi->ft_mutex); + continue; + } + LKU(fi->ft_mutex); + + gl_itr->x_bear = fg->glyph_out->left; + gl_itr->width = fg->glyph_out->bitmap.width; + /* text_props->info->glyph[char_index].advance = + * text_props->info->glyph[char_index].index = + * already done by the ot function */ + if (EVAS_FONT_CHARACTER_IS_INVISIBLE( + text[text_props->info->ot[char_index].source_cluster])) + { + gl_itr->index = 0; + /* Reduce the current advance */ + if (gl_itr > text_props->info->glyph) + { + adjust_x -= gl_itr->pen_after - (gl_itr - 1)->pen_after; + } + else + { + adjust_x -= gl_itr->pen_after; + } + } + else + { + if (is_replacement) + { + /* Update the advance accordingly */ + adjust_x += (pen_x + (fg->glyph->advance.x >> 16)) - + gl_itr->pen_after; + } + pen_x = gl_itr->pen_after; + } + gl_itr->pen_after += adjust_x; + + fi = text_props->font_instance; + gl_itr++; + } +#else + /* We are walking the string in visual ordering */ + Evas_Font_Glyph_Info *gl_itr; + Eina_Bool use_kerning; + FT_UInt prev_index; + FT_Face pface = NULL; + Evas_Coord pen_x = 0; + int adv_d, i; +#if !defined(OT_SUPPORT) && defined(BIDI_SUPPORT) + Eina_Unicode *base_str = NULL; + if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + text = base_str = eina_unicode_strndup(text, len); + evas_bidi_shape_string(base_str, par_props, par_pos, len); + } +#else + (void) par_props; + (void) par_pos; +#endif + + FTLOCK(); + use_kerning = FT_HAS_KERNING(fi->src->ft.face); + FTUNLOCK(); + prev_index = 0; + + i = len; + text_props->info->glyph = calloc(len, + sizeof(Evas_Font_Glyph_Info)); + + if (text_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + text += len - 1; + adv_d = -1; + } + else + { + adv_d = 1; + } + + gl_itr = text_props->info->glyph; + for ( ; i > 0 ; gl_itr++, text += adv_d, i--) + { + FT_UInt idx; + RGBA_Font_Glyph *fg; + int _gl, kern; + Evas_Coord adv; + _gl = *text; + if (_gl == 0) break; + + idx = evas_common_get_char_index(fi, _gl); + if (idx == 0) + { + idx = evas_common_get_char_index(fi, REPLACEMENT_CHAR); + } + + LKL(fi->ft_mutex); + fg = evas_common_font_int_cache_glyph_get(fi, idx); + if (!fg) + { + LKU(fi->ft_mutex); + continue; + } + kern = 0; + + if ((use_kerning) && (prev_index) && (idx) && + (pface == fi->src->ft.face)) + { + if (evas_common_font_query_kerning(fi, prev_index, idx, &kern)) + { + pen_x += kern; + (gl_itr - 1)->pen_after += + EVAS_FONT_ROUND_26_6_TO_INT(kern); + } + } + + pface = fi->src->ft.face; + LKU(fi->ft_mutex); + + gl_itr->index = idx; + gl_itr->x_bear = fg->glyph_out->left; + adv = fg->glyph->advance.x >> 10; + gl_itr->width = fg->glyph_out->bitmap.width; + + if (EVAS_FONT_CHARACTER_IS_INVISIBLE(_gl)) + { + gl_itr->index = 0; + } + else + { + pen_x += adv; + } + + gl_itr->pen_after = EVAS_FONT_ROUND_26_6_TO_INT(pen_x); + + prev_index = idx; + } + text_props->len = len; +# if !defined(OT_SUPPORT) && defined(BIDI_SUPPORT) + if (base_str) + free(base_str); +# endif +#endif + text_props->text_len = len; + text_props->info->refcount = 1; + return EINA_TRUE; +} diff --git a/libraries/evas/src/lib/engines/common/evas_text_utils.h b/libraries/evas/src/lib/engines/common/evas_text_utils.h new file mode 100644 index 0000000..7f1c802 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_text_utils.h @@ -0,0 +1,89 @@ +#ifndef _EVAS_TEXT_UTILS_H +# define _EVAS_TEXT_UTILS_H + +typedef struct _Evas_Text_Props Evas_Text_Props; +typedef struct _Evas_Text_Props_Info Evas_Text_Props_Info; +typedef struct _Evas_Font_Glyph_Info Evas_Font_Glyph_Info; + +# include "evas_font_ot.h" +# include "language/evas_bidi_utils.h" +# include "language/evas_language_utils.h" + +/* Used for showing "malformed" or missing chars */ +#define REPLACEMENT_CHAR 0xFFFD + +struct _Evas_Text_Props +{ + /* Start and len represent the start offset and the length in the + * glyphs_info and ot_data fields, they are both internal */ + size_t start; + size_t len; + size_t text_offset; /* The text offset from the start of the info */ + size_t text_len; /* The length of the original text */ + Evas_BiDi_Props bidi; + Evas_Script_Type script; + Evas_Text_Props_Info *info; + void *font_instance; +}; + +struct _Evas_Text_Props_Info +{ + unsigned int refcount; + Evas_Font_Glyph_Info *glyph; + Evas_Font_OT_Info *ot; +}; + +/* Sorted in visual order when created */ +struct _Evas_Font_Glyph_Info +{ + unsigned int index; /* Should conform to FT */ + Evas_Coord x_bear; +#if 0 + /* This one is rarely used, only in draw, in which we already get the glyph + * so it doesn't really save time. Leaving it here just so no one will + * add it thinking it was accidentally skipped */ + Evas_Coord y_bear; +#endif + Evas_Coord width; + Evas_Coord pen_after; +}; + + +void +evas_common_text_props_bidi_set(Evas_Text_Props *props, + Evas_BiDi_Paragraph_Props *bidi_par_props, size_t start); + +void +evas_common_text_props_script_set(Evas_Text_Props *props, Evas_Script_Type scr); + +EAPI Eina_Bool +evas_common_text_props_content_create(void *_fi, const Eina_Unicode *text, + Evas_Text_Props *text_props, const Evas_BiDi_Paragraph_Props *par_props, + size_t par_pos, int len); + +void +evas_common_text_props_content_copy_and_ref(Evas_Text_Props *dst, + const Evas_Text_Props *src); + +void +evas_common_text_props_content_ref(Evas_Text_Props *props); + +void +evas_common_text_props_content_unref(Evas_Text_Props *props); + +EAPI int +evas_common_text_props_cluster_next(const Evas_Text_Props *props, int pos); + +EAPI int +evas_common_text_props_cluster_prev(const Evas_Text_Props *props, int pos); + +EAPI int +evas_common_text_props_index_find(const Evas_Text_Props *props, int _cutoff); + +EAPI void +evas_common_text_props_split(Evas_Text_Props *base, Evas_Text_Props *ext, + int cutoff); +EAPI void +evas_common_text_props_merge(Evas_Text_Props *item1, const Evas_Text_Props *item2); + +#endif diff --git a/libraries/evas/src/lib/engines/common/evas_tiler.c b/libraries/evas/src/lib/engines/common/evas_tiler.c new file mode 100644 index 0000000..0bbe811 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/evas_tiler.c @@ -0,0 +1,1391 @@ +#include "evas_common.h" +#ifdef EVAS_RECT_SPLIT + +static inline void rect_list_node_pool_set_max(int max); +static inline void rect_list_node_pool_flush(void); +static inline list_node_t *rect_list_node_pool_get(void); +static inline void rect_list_node_pool_put(list_node_t *node); +static inline void rect_init(rect_t *r, int x, int y, int w, int h); +static inline void rect_list_append_node(list_t *rects, list_node_t *node); +static inline void rect_list_append(list_t *rects, const rect_t r); +static inline void rect_list_append_xywh(list_t *rects, int x, int y, int w, int h); +static inline void rect_list_concat(list_t *rects, list_t *other); +static inline list_node_t *rect_list_unlink_next(list_t *rects, list_node_t *parent_node); +static inline void rect_list_del_next(list_t *rects, list_node_t *parent_node); +static inline void rect_list_clear(list_t *rects); +static inline void rect_list_del_split_strict(list_t *rects, const rect_t del_r); +static inline void rect_list_add_split_strict(list_t *rects, list_node_t *node); +static inline list_node_t *rect_list_add_split_fuzzy(list_t *rects, list_node_t *node, int accepted_error); +static inline void rect_list_merge_rects(list_t *rects, list_t *to_merge, int accepted_error); +static inline void rect_list_add_split_fuzzy_and_merge(list_t *rects, list_node_t *node, int split_accepted_error, int merge_accepted_error); +static inline void rect_print(const rect_t r); +static inline void rect_list_print(const list_t rects); + +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 }; + +static inline void +rect_list_node_pool_set_max(int max) +{ + int diff; + + diff = list_node_pool.len - max; + for (; diff > 0 && list_node_pool.node; 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; +} + +static inline 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); + } +} + +static 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)); +} + +static 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); +} + +static 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; +} + +static inline void +rect_print(const rect_t r) +{ + INF("", r.left, r.top, r.width, r.height); +} + +static inline void +rect_list_print(const list_t rects) +{ + list_node_t *node; + int len; + + len = 0; + for (node = rects.head; node; node = node->next) len++; + + putchar('['); + for (node = rects.head; node; node = node->next) + { + rect_print(((rect_node_t *)node)->rect); + if (node->next) + { + putchar(','); + if (len < 4) putchar(' '); + else + { + putchar('\n'); + putchar(' '); + } + } + } + putchar(']'); +} + +static 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; + } +} + +static 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); +} + +static 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); +} + +static 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; +} + +static 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; +} + +static 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); +} + +static inline 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; */ + } +} + +static inline 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); +} + +static inline 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; +} + +static inline 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; */ + WRN("Should not get here!"); + 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; +} + +static inline 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) + { + 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); + } +} + +static inline 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 x, int y, int w, int h) +{ + rect_node_t *rn; +/* we dont need to do this fuzz stuff - it actually creates overdraw bugs + * when evas shouldnt draw at all. + 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); + //INF("ACCOUNTING: add_redraw: %4d,%4d %3dx%3d", 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) + 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; + // optimize a common case -> adding the exact same rect 2x in a row + if ((tb->prev_add.x == x) && (tb->prev_add.y == y) && + (tb->prev_add.w == w) && (tb->prev_add.h == h)) return 1; + tb->prev_add.x = x; tb->prev_add.y = y; + tb->prev_add.w = w; tb->prev_add.h = h; + tb->prev_del.w = 0; tb->prev_del.h = 0; + return _add_redraw(&tb->rects, 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; + +/* we dont need to do this fuzz stuff - it actually creates overdraw bugs + * when evas shouldnt draw at all. + x += 1; + y += 1; + x >>= 1; + y >>= 1; + w -= 1; + w >>= 1; + h -= 1; + h >>= 1; + + if ((w <= 0) || (h <= 0)) return 0; + */ + + // optimize a common case -> deleting the exact same rect 2x in a row + if ((tb->prev_del.x == x) && (tb->prev_del.y == y) && + (tb->prev_del.w == w) && (tb->prev_del.h == h)) return 1; + tb->prev_del.x = x; tb->prev_del.y = y; + tb->prev_del.w = w; tb->prev_del.h = h; + tb->prev_add.w = 0; tb->prev_add.h = 0; + rect_init(&r, 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 __UNUSED__, int x __UNUSED__, int y __UNUSED__, int w __UNUSED__, int h __UNUSED__, int dx __UNUSED__, int dy __UNUSED__, int alpha __UNUSED__) +{ +#ifdef EVAS_RECT_SPLIT +/* motion vector handling never has been used -> disable it + list_t lr = list_zeroed; + int num; + + num = _add_redraw(&lr, x, y, w, h); + num += _add_redraw(&lr, x + dx, y + dy, w, h); + while (lr.head) + { + 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; + */ + return 0; +#else +/* + 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) + tb->prev_add.x = tb->prev_add.y = tb->prev_add.w = tb->prev_add.h = 0; + tb->prev_del.x = tb->prev_del.y = tb->prev_del.w = tb->prev_del.h = 0; + 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; n = n->next) { + rect_t cur; + + cur = ((rect_node_t *)n)->rect; +/* disable fuzz - created bugs. + 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->x = cur.left; + r->y = cur.top; + r->w = cur.width; + r->h = cur.height; + + rects = (Tilebuf_Rect *)eina_inlist_append(EINA_INLIST_GET(rects), EINA_INLIST_GET(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 = eina_inlist_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 = (Tilebuf_Rect *)eina_inlist_remove(EINA_INLIST_GET(rects), EINA_INLIST_GET(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/libraries/evas/src/lib/engines/common/language/evas_bidi_utils.c b/libraries/evas/src/lib/engines/common/language/evas_bidi_utils.c new file mode 100644 index 0000000..9f7859b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/language/evas_bidi_utils.c @@ -0,0 +1,641 @@ +#include +#include + +#include "evas_common.h" +#include "evas_bidi_utils.h" + +#include "evas_font_private.h" + +#ifdef BIDI_SUPPORT +#include +/** + * @internal + * @addtogroup Evas_Utils + * + * @{ + */ +/** + * @internal + * @addtogroup Evas_BiDi + * + * @{ + */ + +/** + * @internal + * @def _SAFE_FREE(x) + * checks if x is not NULL, if it's not, it's freed and set to NULL. + */ +#define _SAFE_FREE(x) \ + do { \ + if (x) \ + { \ + free(x); \ + x = NULL; \ + } \ + } while(0) + +#if SIZEOF_FRIBIDICHAR != SIZEOF_EINA_UNICODE +# define EVAS_FRIBIDI_EINA_UNICODE_UNEQUAL +#endif + +#ifdef EVAS_FRIBIDI_EINA_UNICODE_UNEQUAL +/* Convert bidichar to eina_unicode assume both are valid pointers */ +static Eina_Unicode * +_evas_bidi_fribidichar_to_unicode(Eina_Unicode *dest, const FriBidiChar *src) +{ + Eina_Unicode *ret = dest; + + while (*src) + *dest++ = *src++; + *dest = 0; + return ret; +} + +/* Convert eina_unicode to bidi_char assume both are valid pointers */ +static FriBidiChar * +_evas_bidi_unicode_to_fribidichar(FriBidiChar *dest, const Eina_Unicode *src) +{ + FriBidiChar *ret = dest; + + while (*src) + *dest++ = *src++; + *dest = 0; + return ret; +} +#endif + +/** + * @internal + * Checks if the string has RTL characters. + * + * @param str The string to be checked + * @return #EINA_TRUE if true, #EINA_FALSE otherwise. + */ +Eina_Bool +evas_bidi_is_rtl_str(const Eina_Unicode *str) +{ + EvasBiDiCharType type; + + if (!str) + return EINA_FALSE; + + for ( ; *str ; str++) + { + type = fribidi_get_bidi_type((FriBidiChar) *str); + if (FRIBIDI_IS_LETTER(type) && FRIBIDI_IS_RTL(type)) + { + return EINA_TRUE; + } + } + return EINA_FALSE; +} + +/** + * @internal + * Shapes the string ustr according to the bidi properties. + * + * @param str The string to shape + * @param bidi_props the bidi props to shaped according. + * @param start the start of the string to shape (offset in bidi_props) + * @param len the length of th string. + * @return #EINA_TRUE on success, #EINA_FALSE otherwise. + */ +EAPI Eina_Bool +evas_bidi_shape_string(Eina_Unicode *eina_ustr, const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, size_t len) +{ + FriBidiChar *ustr, *base_ustr = NULL; + + if (!bidi_props) + return EINA_FALSE; + + /* The size of fribidichar is different than eina_unicode, convert */ +#ifdef EVAS_FRIBIDI_EINA_UNICODE_UNEQUAL + base_ustr = ustr = calloc(len + 1, sizeof(FriBidiChar)); + ustr = _evas_bidi_unicode_to_fribidichar(ustr, eina_ustr); +#else + (void) base_ustr; + ustr = (FriBidiChar *) eina_ustr; +#endif + + + EvasBiDiJoiningType *join_types = NULL; + join_types = (EvasBiDiJoiningType *) malloc(sizeof(EvasBiDiJoiningType) * len); + if (!join_types) + { + return EINA_FALSE; + } + fribidi_get_joining_types(ustr, len, join_types); + + fribidi_join_arabic(bidi_props->char_types + start, len, + bidi_props->embedding_levels + start, join_types); + + + /* Actually modify the string */ + fribidi_shape(FRIBIDI_FLAGS_DEFAULT | FRIBIDI_FLAGS_ARABIC, + bidi_props->embedding_levels + start, len, join_types, ustr); + + if (join_types) free(join_types); + + /* Convert back */ +#ifdef EVAS_FRIBIDI_EINA_UNICODE_UNEQUAL + eina_ustr = _evas_bidi_fribidichar_to_unicode(eina_ustr, ustr); + if (base_ustr) free(base_ustr); +#endif + return EINA_TRUE; +} + +/** + * @internal + * Return a -1 terminated array of the indexes of the delimiters (passed in + * delim) found in the string. This result should be used with par_props_get. + * + * @param str The string to parse + * @param delim a list of delimiters to work with. + * @return returns a -1 terminated array of indexes according to positions of the delimiters found. NULL if there were none. + */ +int * +evas_bidi_segment_idxs_get(const Eina_Unicode *str, const char *delim) +{ + Eina_Unicode *udelim; + const Eina_Unicode *str_base = str; + int *ret, *tmp_ret; + int ret_idx = 0, ret_len = 10; /* arbitrary choice */ + udelim = eina_unicode_utf8_to_unicode(delim, NULL); + ret = malloc(ret_len * sizeof(int)); + for ( ; *str ; str++) + { + const Eina_Unicode *del; + for (del = udelim ; *del ; del++) + { + if (*str == *del) + { + if (ret_idx >= ret_len) + { + /* arbitrary choice */ + ret_len += 20; + tmp_ret = realloc(ret, ret_len * sizeof(int)); + if (!tmp_ret) + { + free(ret); + return NULL; + } + } + ret[ret_idx++] = str - str_base; + break; + } + } + } + free(udelim); + + /* If no indexes were found return NULL */ + if (ret_idx == 0) + { + free(ret); + return NULL; + } + + ret[ret_idx] = -1; + tmp_ret = realloc(ret, (ret_idx + 1) * sizeof(int)); + + return (tmp_ret) ? tmp_ret : ret; +} + +/** + * @internal + * Allocates bidi properties according to ustr. First checks to see if the + * passed has rtl chars, if not, it returns NULL. + * + * Assumes all the segment_idxs are either -1 or legal, and > 0 indexes. + * Also assumes that the characters at the override points are of weak/neutral + * bidi type, otherwise unexpected results may occur. + * + * @param ustr The string to update according to. + * @param len The length of the string + * @param segment_idxs A -1 terminated array of points to start a new bidi analysis at (used for section high level bidi overrides). - NULL means none. + * @return returns allocated paragraph props on success, NULL otherwise. + */ +Evas_BiDi_Paragraph_Props * +evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len, + int *segment_idxs) +{ + Evas_BiDi_Paragraph_Props *bidi_props = NULL; + EvasBiDiCharType *char_types = NULL; + EvasBiDiLevel *embedding_levels = NULL; + const FriBidiChar *ustr; + FriBidiChar *base_ustr = NULL; + + if (!eina_ustr) + return NULL; + + + if (!evas_bidi_is_rtl_str(eina_ustr)) /* No need to handle bidi */ + { + len = -1; + goto cleanup; + } + + len = eina_unicode_strlen(eina_ustr); + /* The size of fribidichar s different than eina_unicode, convert */ +#ifdef EVAS_FRIBIDI_EINA_UNICODE_UNEQUAL + base_ustr = calloc(len + 1, sizeof(FriBidiChar)); + base_ustr = _evas_bidi_unicode_to_fribidichar(base_ustr, eina_ustr); + ustr = base_ustr; +#else + ustr = (const FriBidiChar *) eina_ustr; +#endif + + bidi_props = evas_bidi_paragraph_props_new(); + + /* Prep work for reordering */ + char_types = (EvasBiDiCharType *) malloc(sizeof(EvasBiDiCharType) * len); + if (!char_types) + { + len = -2; + goto cleanup; + } + fribidi_get_bidi_types(ustr, len, char_types); + + embedding_levels = (EvasBiDiLevel *)malloc(sizeof(EvasBiDiLevel) * len); + if (!embedding_levels) + { + len = -2; + goto cleanup; + } + + if (segment_idxs) + { + size_t pos = 0; + int *itr; + EvasBiDiLevel base_level = 0; + EvasBiDiParType direction; + + for (itr = segment_idxs ; *itr > 0 ; itr++) + { + direction = EVAS_BIDI_PARAGRAPH_NEUTRAL; + if (!fribidi_get_par_embedding_levels(char_types + pos, + *itr - pos, + &direction, + embedding_levels + pos)) + { + len = -2; + goto cleanup; + } + + /* Only on the first run */ + if (itr == segment_idxs) + { + bidi_props->direction = direction; + /* adjust base_level to be 1 for rtl paragraphs, and 0 for + * ltr paragraphs. */ + base_level = + EVAS_BIDI_PARAGRAPH_DIRECTION_IS_RTL(bidi_props) ? 1 : 0; + } + + /* We want those chars at the override points to be on the base + * level and we also remove -2 cause we later increment them, + * just for simpler code paths */ + embedding_levels[*itr] = base_level - 2; + pos = *itr + 1; + } + + direction = EVAS_BIDI_PARAGRAPH_NEUTRAL; + if (!fribidi_get_par_embedding_levels(char_types + pos, + len - pos, + &direction, + embedding_levels + pos)) + { + len = -2; + goto cleanup; + } + + /* Increment all levels by 2 to emulate embedding. */ + { + EvasBiDiLevel *bitr = embedding_levels, *end; + end = bitr + len; + for ( ; bitr < end ; bitr++) + { + *bitr += 2; + } + } + } + else + { + if (!fribidi_get_par_embedding_levels(char_types, len, + &bidi_props->direction, embedding_levels)) + { + len = -2; + goto cleanup; + } + } + + + /* clean up */ + if (bidi_props->embedding_levels) + { + free(bidi_props->embedding_levels); + } + bidi_props->embedding_levels = embedding_levels; + + /* clean up */ + + if (bidi_props->char_types) + { + free(bidi_props->char_types); + } + bidi_props->char_types = char_types; + + if (base_ustr) free(base_ustr); + + + return bidi_props; + +/* Cleanup */ +cleanup: + if (char_types) free(char_types); + if (embedding_levels) free(embedding_levels); + if (base_ustr) free(base_ustr); + if (bidi_props) evas_bidi_paragraph_props_unref(bidi_props); /* Clean up the bidi props */ + return NULL; +} + +/** + * @internal + * Copies dst to src and refs (doesn't copy) the paragraph props. + * + * @param src the props to copy + * @param dst the props to copy to. + */ +void +evas_bidi_props_copy_and_ref(const Evas_BiDi_Props *src, Evas_BiDi_Props *dst) +{ + dst->dir = src->dir; +} + +/** + * @internal + * Reorders ustr according to the bidi props. + * + * @param ustr the string to reorder. - Null is ok, will just populate the map. + * @param start the start of the line + * @param len the length of the line + * @param props the paragraph props to reorder according to + * @param _v_to_l The visual to logical map to populate - if NULL it won't populate it. + * @return #EINA_FALSE on success, #EINA_TRUE on error. + */ +Eina_Bool +evas_bidi_props_reorder_line(Eina_Unicode *eina_ustr, size_t start, size_t len, const Evas_BiDi_Paragraph_Props *props, EvasBiDiStrIndex **_v_to_l) +{ + EvasBiDiStrIndex *v_to_l = NULL; + FriBidiChar *ustr = NULL, *base_ustr = NULL; + + if (!props) + return EINA_FALSE; + + if (eina_ustr) + { + /* The size of fribidichar is different than eina_unicode, convert */ +#ifdef EVAS_FRIBIDI_EINA_UNICODE_UNEQUAL + base_ustr = ustr = calloc(len + 1, sizeof(FriBidiChar)); + ustr = _evas_bidi_unicode_to_fribidichar(ustr, eina_ustr); +#else + ustr = (FriBidiChar *) eina_ustr; +#endif + } + + + if (_v_to_l) { + size_t i; + v_to_l = *_v_to_l = calloc(len, sizeof(EvasBiDiStrIndex)); + if (!v_to_l) + { + goto error; + } + /* init the array for fribidi */ + for (i = 0 ; i < len ; i++) + { + v_to_l[i] = i; + } + } + + { + EvasBiDiLevel *emb_lvl; + emb_lvl = malloc((start + len) * sizeof(EvasBiDiLevel)); + memcpy(emb_lvl, props->embedding_levels, + (start + len) * sizeof(EvasBiDiLevel)); + /* We pass v_to_l - start, because fribidi assumes start is the offset + * from the start of v_to_l as well, not just the props. */ + if (!fribidi_reorder_line (FRIBIDI_FLAGS_DEFAULT, props->char_types, + len, start, props->direction, emb_lvl, ustr, v_to_l - start)) + { + free(emb_lvl); + goto error; + } + free(emb_lvl); + } + + + /* The size of fribidichar is different than eina_unicode, convert */ +#ifdef EVAS_FRIBIDI_EINA_UNICODE_UNEQUAL + _evas_bidi_fribidichar_to_unicode(eina_ustr, base_ustr); + free(base_ustr); +#endif + return EINA_FALSE; +/* ERROR HANDLING */ +error: + if (base_ustr) free(base_ustr); + _SAFE_FREE(v_to_l); + return EINA_TRUE; +} + +/** + * @internal + * Returns the end of the current run of text + * + * @param bidi_props the paragraph properties + * @param start where to start looking from + * @param len the length of the string + * @return the position of the end of the run (offset from + * bidi_props->props->start), 0 when there is no end (i.e all the text) + */ +int +evas_bidi_end_of_run_get(const Evas_BiDi_Paragraph_Props *bidi_props, + size_t start, int len) +{ + EvasBiDiLevel *i; + EvasBiDiLevel base; + + if (!bidi_props || (len <= 0)) + return 0; + + i = bidi_props->embedding_levels + start; + base = *i; + for ( ; (len > 0) && (base == *i) ; len--, i++) + ; + + if (len == 0) + { + return 0; + } + return i - (bidi_props->embedding_levels + start); +} + +/** + * @internal + * Returns the visual string index from the logical string index. + * + * @param v_to_l the visual to logical map + * @param len the length of the map. + * @param position the position to convert. + * @return on success the visual position, on failure the same position. + */ +EvasBiDiStrIndex +evas_bidi_position_logical_to_visual(EvasBiDiStrIndex *v_to_l, int len, EvasBiDiStrIndex position) +{ + int i; + EvasBiDiStrIndex *ind; + if (position >= len || !v_to_l) + return position; + + for (i = 0, ind = v_to_l ; i < len ; i++, ind++) + { + if (*ind == position) + { + return i; + } + } + return position; +} + +/** + * @internal + * Returns the reversed pos of the index. + * + * @param dir the direction of the string + * @param len the length of the map. + * @param position the position to convert. + * @return on success the visual position, on failure the same position. + */ +EvasBiDiStrIndex +evas_bidi_position_reverse(const Evas_BiDi_Props *props, int len, EvasBiDiStrIndex position) +{ + if (!props || position >= len) + return position; + + return (props->dir == EVAS_BIDI_DIRECTION_RTL) ? (len - 1) - position : position; +} + +/** + * @internal + * Checks if the char is rtl oriented. I.e even a neutral char can become rtl + * if surrounded by rtl chars. + * + * @param bidi_props The bidi paragraph properties + * @param start the base position + * @param index the offset from the base position. + * @return #EINA_TRUE if true, #EINA_FALSE otherwise. + */ +Eina_Bool +evas_bidi_is_rtl_char(const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, EvasBiDiStrIndex ind) +{ + if(!bidi_props || ind < 0) + return EINA_FALSE; + return (FRIBIDI_IS_RTL( + bidi_props->embedding_levels[ind + start])) + ? EINA_TRUE : EINA_FALSE; +} + +Evas_BiDi_Paragraph_Props * +evas_bidi_paragraph_props_new(void) +{ + Evas_BiDi_Paragraph_Props *ret; + ret = calloc(1, sizeof(Evas_BiDi_Paragraph_Props)); + ret->direction = EVAS_BIDI_PARAGRAPH_NEUTRAL; + ret->refcount = 1; + + return ret; +} + +/** + * @internal + * Refs the bidi props. + * + * @param bidi_props the props to ref. + */ +Evas_BiDi_Paragraph_Props * +evas_bidi_paragraph_props_ref(Evas_BiDi_Paragraph_Props *bidi_props) +{ + if (!bidi_props) return NULL; + BIDILOCK(); + + bidi_props->refcount++; + BIDIUNLOCK(); + return bidi_props; +} + +/** + * @internal + * Unrefs and potentially frees the props. + * + * @param bidi_props the properties to unref + */ +void +evas_bidi_paragraph_props_unref(Evas_BiDi_Paragraph_Props *bidi_props) +{ + if (!bidi_props) return; + BIDILOCK(); + + if (--bidi_props->refcount == 0) + { + evas_bidi_paragraph_props_clean(bidi_props); + free(bidi_props); + } + BIDIUNLOCK(); +} + + +/** + * @internal + * Cleans the paragraph properties. + * + * @param bidi_props the properties to clean. + */ +void +evas_bidi_paragraph_props_clean(Evas_BiDi_Paragraph_Props *bidi_props) +{ + _SAFE_FREE(bidi_props->embedding_levels); + _SAFE_FREE(bidi_props->char_types); +} + +/** + * @internal + * Cleans the bidi properties. + * + * @param bidi_props the properties to clean. + */ +void +evas_bidi_props_clean(Evas_BiDi_Props *bidi_props) +{ + if (!bidi_props) return; + bidi_props->dir = EVAS_BIDI_DIRECTION_NEUTRAL; +} +/** + * @} + */ +/** + * @} + */ +#endif + +#if 0 +/* Good for debugging */ +static void +dump_levels(Eina_Unicode *ustr, EvasBiDiLevel *emb) +{ + for ( ; *ustr ; ustr++, emb++) + { + printf("%lc %d\n", *ustr, *emb); + } +} +#endif + diff --git a/libraries/evas/src/lib/engines/common/language/evas_bidi_utils.h b/libraries/evas/src/lib/engines/common/language/evas_bidi_utils.h new file mode 100644 index 0000000..f1a374b --- /dev/null +++ b/libraries/evas/src/lib/engines/common/language/evas_bidi_utils.h @@ -0,0 +1,157 @@ +#ifndef _EVAS_BIDI_UTILS +#define _EVAS_BIDI_UTILS + +/** + * @internal + * @addtogroup Evas_Utils + * + * @{ + */ +/** + * @internal + * @defgroup Evas_BiDi Evas BiDi utility functions + * + * This set of functions and types helps evas handle BiDi strings correctly. + * @todo Document types, structures and macros. + * + * @{ + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_FRIBIDI +# define USE_FRIBIDI +# define BIDI_SUPPORT +#endif + +#include + +#ifdef USE_FRIBIDI +# include +#endif + +/* abstract fribidi - we statically define sizes here because otherwise we would + * have to ifdef everywhere (because function decorations may change with/without + * bidi support) + * These types should only be passed as pointers! i.e do not directely use any of + * these types in function declarations. Defining as void should help ensuring that. + */ + +/* Evas_BiDi_Direction is defined in evas.h */ + +#ifdef USE_FRIBIDI +# define _EVAS_BIDI_TYPEDEF(type) \ + typedef FriBidi ## type EvasBiDi ## type +#else +# define _EVAS_BIDI_TYPEDEF(type) \ + typedef void EvasBiDi ## type +#endif + +#if 0 /* We are using Eina_Unicode instead */ +_EVAS_BIDI_TYPEDEF(Char); +#endif +_EVAS_BIDI_TYPEDEF(CharType); +_EVAS_BIDI_TYPEDEF(ParType); +_EVAS_BIDI_TYPEDEF(StrIndex); +_EVAS_BIDI_TYPEDEF(Level); +_EVAS_BIDI_TYPEDEF(JoiningType); + +typedef struct _Evas_BiDi_Paragraph_Props Evas_BiDi_Paragraph_Props; +typedef struct _Evas_BiDi_Props Evas_BiDi_Props; + +/* This structure defines a set of properties of a BiDi string. In case of a + * non-bidi string, all values should be NULL. + * To check if a structure describes a bidi string or not, use the macro + * EVAS_BIDI_IS_BIDI_PROP. RTL-only strings are also treated as bidi ATM. + */ +struct _Evas_BiDi_Paragraph_Props { + EvasBiDiCharType *char_types; /* BiDi char types */ + EvasBiDiLevel *embedding_levels; /* BiDi embedding levels */ + int refcount; /* The number of references to this object */ +#ifdef USE_FRIBIDI + EvasBiDiParType direction; +#endif +}; + +#include "Evas.h" +struct _Evas_BiDi_Props +{ + Evas_BiDi_Direction dir; +}; + + + +#ifdef USE_FRIBIDI + +#define EVAS_BIDI_PARAGRAPH_NEUTRAL FRIBIDI_PAR_ON +#define EVAS_BIDI_PARAGRAPH_LTR FRIBIDI_PAR_LTR +#define EVAS_BIDI_PARAGRAPH_RTL FRIBIDI_PAR_RTL +#define EVAS_BIDI_PARAGRAPH_WLTR FRIBIDI_PAR_WLTR +#define EVAS_BIDI_PARAGRAPH_WRTL FRIBIDI_PAR_WRTL + +#define EVAS_BIDI_PARAGRAPH_DIRECTION_IS_RTL(x) \ + (((x) && \ + ((x->direction == EVAS_BIDI_PARAGRAPH_RTL) || \ + (x->direction == EVAS_BIDI_PARAGRAPH_WRTL))) ? \ + EINA_TRUE : EINA_FALSE) + + +# define evas_bidi_position_visual_to_logical(list, position) \ + (list) ? list[position] : position; + +EvasBiDiStrIndex +evas_bidi_position_logical_to_visual(EvasBiDiStrIndex *v_to_l, int len, EvasBiDiStrIndex position); + +EvasBiDiStrIndex +evas_bidi_position_reverse(const Evas_BiDi_Props *props, int len, EvasBiDiStrIndex position); + +Eina_Bool +evas_bidi_is_rtl_str(const Eina_Unicode *str); + +Eina_Bool +evas_bidi_is_rtl_char(const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, EvasBiDiStrIndex index); + +int +evas_bidi_end_of_run_get(const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, int len); + +Eina_Bool +evas_bidi_props_reorder_line(Eina_Unicode *eina_ustr, size_t start, size_t len, const Evas_BiDi_Paragraph_Props *props, EvasBiDiStrIndex **_v_to_l); + +Evas_BiDi_Paragraph_Props * +evas_bidi_paragraph_props_get(const Eina_Unicode *eina_ustr, size_t len, int *segment_idxs) EINA_ARG_NONNULL(1) EINA_MALLOC EINA_WARN_UNUSED_RESULT; + +void +evas_bidi_props_copy_and_ref(const Evas_BiDi_Props *src, Evas_BiDi_Props *dst); + +EAPI Eina_Bool +evas_bidi_shape_string(Eina_Unicode *eina_ustr, const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, size_t len); + +void +evas_bidi_props_clean(Evas_BiDi_Props *intl_props) EINA_ARG_NONNULL(1); + +void +evas_bidi_paragraph_props_clean(Evas_BiDi_Paragraph_Props *bidi_props) EINA_ARG_NONNULL(1); + +Evas_BiDi_Paragraph_Props * +evas_bidi_paragraph_props_ref(Evas_BiDi_Paragraph_Props *bidi_props) EINA_ARG_NONNULL(1); + +void +evas_bidi_paragraph_props_unref(Evas_BiDi_Paragraph_Props *bidi_props) EINA_ARG_NONNULL(1); + +Evas_BiDi_Paragraph_Props * +evas_bidi_paragraph_props_new(void) EINA_MALLOC EINA_WARN_UNUSED_RESULT; + +int * +evas_bidi_segment_idxs_get(const Eina_Unicode *str, const char *delim) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT EINA_MALLOC; + +#endif +/** + * @} + */ +/** + * @} + */ + +#endif + diff --git a/libraries/evas/src/lib/engines/common/language/evas_language_utils.c b/libraries/evas/src/lib/engines/common/language/evas_language_utils.c new file mode 100644 index 0000000..9c9b3e3 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/language/evas_language_utils.c @@ -0,0 +1,146 @@ +/** + * @internal + * @addtogroup Evas_Utils + * + * @{ + */ +/** + * @internal + * @defgroup Evas_Script Evas Script (language) utility functions + * + * This set of functions and types helps evas handle scripts correctly. + * @todo Document types, structures and macros. + * + * @{ + */ +#include + +#include "evas_language_utils.h" +#include "evas_bidi_utils.h" /* Used for splitting according to bidi */ +#include "../evas_font_ot.h" /* Used for harfbuzz info */ + +#ifdef USE_HARFBUZZ +# include +#endif + +#include "evas_script_table.h" + +static Evas_Script_Type +_evas_common_language_char_script_search(Eina_Unicode unicode) +{ + int min = 0; + int max = (sizeof(_evas_script_slow_table) / + sizeof(_evas_script_slow_table[0])) - 1; + int mid; + + do + { + mid = (min + max) / 2; + + if (unicode < _evas_script_slow_table[mid].start) + max = mid - 1; + else if (unicode >= _evas_script_slow_table[mid].start + + _evas_script_slow_table[mid].len) + min = mid + 1; + else + return _evas_script_slow_table[mid].script; + } + while (min <= max); + + return EVAS_SCRIPT_UNKNOWN; +} + +Evas_Script_Type +evas_common_language_char_script_get(Eina_Unicode unicode) +{ + if ((unicode >= 0) && (unicode < EVAS_SCRIPT_DIRECT_TABLE_LIMIT)) + return _evas_script_fast_table[unicode]; + else + return _evas_common_language_char_script_search(unicode); +} + +int +evas_common_language_script_end_of_run_get(const Eina_Unicode *str, + const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, int len) +{ + /* FIXME: Use the standard segmentation instead */ + Evas_Script_Type first = EVAS_SCRIPT_UNKNOWN; + int i; + for (i = 0 ; i < len ; i++, str++) + { + Evas_Script_Type tmp; + tmp = evas_common_language_char_script_get(*str); + /* Arabic is the first script in the array that's not + * common/inherited. */ + if ((first == EVAS_SCRIPT_UNKNOWN) && (tmp >= EVAS_SCRIPT_ARABIC)) + { + first = tmp; + continue; + } + if ((first != tmp) && (tmp >= EVAS_SCRIPT_ARABIC)) + { + break; + } + } +#ifdef BIDI_SUPPORT + { + int bidi_end; + bidi_end = evas_bidi_end_of_run_get(bidi_props, start, len); + if (bidi_end > 0) + { + i = (i < bidi_end) ? i : bidi_end; + } + } +#else + (void) bidi_props; + (void) start; +#endif + return (i < len) ? i : 0; +} + +Evas_Script_Type +evas_common_language_script_type_get(const Eina_Unicode *str, size_t len) +{ + Evas_Script_Type script = EVAS_SCRIPT_COMMON; + const Eina_Unicode *end = str + len; + /* Arabic is the first script in the array that's not a common/inherited */ + for ( ; str < end && ((script = evas_common_language_char_script_get(*str)) < EVAS_SCRIPT_ARABIC) ; str++) + ; + return script; +} + +const char * +evas_common_language_from_locale_get(void) +{ + static char lang[6]; /* FIXME: Maximum length I know about */ + if (*lang) return lang; + + const char *locale; + locale = getenv("LANG"); + if (locale && *locale) + { + char *itr; + strncpy(lang, locale, 5); + lang[5] = '\0'; + itr = lang; + while (*itr) + { + if (*itr == '_') + { + *itr = '\0'; + } + itr++; + } + return lang; + } + + return ""; +} + +/* + * @} + */ +/* + * @} + */ + diff --git a/libraries/evas/src/lib/engines/common/language/evas_language_utils.h b/libraries/evas/src/lib/engines/common/language/evas_language_utils.h new file mode 100644 index 0000000..fa795ec --- /dev/null +++ b/libraries/evas/src/lib/engines/common/language/evas_language_utils.h @@ -0,0 +1,132 @@ +#ifndef _EVAS_LANGUAGE_UTILS +#define _EVAS_LANGUAGE_UTILS + +#include +#include "evas_bidi_utils.h" + +/* Unicode Script property */ +typedef enum +{ + EVAS_SCRIPT_COMMON = 0, /* Zyyy */ + EVAS_SCRIPT_INHERITED, /* Qaai */ + EVAS_SCRIPT_ARABIC, /* Arab */ + EVAS_SCRIPT_ARMENIAN, /* Armn */ + EVAS_SCRIPT_BENGALI, /* Beng */ + EVAS_SCRIPT_BOPOMOFO, /* Bopo */ + EVAS_SCRIPT_CHEROKEE, /* Cher */ + EVAS_SCRIPT_COPTIC, /* Qaac */ + EVAS_SCRIPT_CYRILLIC, /* Cyrl (Cyrs) */ + EVAS_SCRIPT_DESERET, /* Dsrt */ + EVAS_SCRIPT_DEVANAGARI, /* Deva */ + EVAS_SCRIPT_ETHIOPIC, /* Ethi */ + EVAS_SCRIPT_GEORGIAN, /* Geor (Geon, Geoa) */ + EVAS_SCRIPT_GOTHIC, /* Goth */ + EVAS_SCRIPT_GREEK, /* Grek */ + EVAS_SCRIPT_GUJARATI, /* Gujr */ + EVAS_SCRIPT_GURMUKHI, /* Guru */ + EVAS_SCRIPT_HAN, /* Hani */ + EVAS_SCRIPT_HANGUL, /* Hang */ + EVAS_SCRIPT_HEBREW, /* Hebr */ + EVAS_SCRIPT_HIRAGANA, /* Hira */ + EVAS_SCRIPT_KANNADA, /* Knda */ + EVAS_SCRIPT_KATAKANA, /* Kana */ + EVAS_SCRIPT_KHMER, /* Khmr */ + EVAS_SCRIPT_LAO, /* Laoo */ + EVAS_SCRIPT_LATIN, /* Latn (Latf, Latg) */ + EVAS_SCRIPT_MALAYALAM, /* Mlym */ + EVAS_SCRIPT_MONGOLIAN, /* Mong */ + EVAS_SCRIPT_MYANMAR, /* Mymr */ + EVAS_SCRIPT_OGHAM, /* Ogam */ + EVAS_SCRIPT_OLD_ITALIC, /* Ital */ + EVAS_SCRIPT_ORIYA, /* Orya */ + EVAS_SCRIPT_RUNIC, /* Runr */ + EVAS_SCRIPT_SINHALA, /* Sinh */ + EVAS_SCRIPT_SYRIAC, /* Syrc (Syrj, Syrn, Syre) */ + EVAS_SCRIPT_TAMIL, /* Taml */ + EVAS_SCRIPT_TELUGU, /* Telu */ + EVAS_SCRIPT_THAANA, /* Thaa */ + EVAS_SCRIPT_THAI, /* Thai */ + EVAS_SCRIPT_TIBETAN, /* Tibt */ + EVAS_SCRIPT_CANADIAN_ABORIGINAL, /* Cans */ + EVAS_SCRIPT_YI, /* Yiii */ + EVAS_SCRIPT_TAGALOG, /* Tglg */ + EVAS_SCRIPT_HANUNOO, /* Hano */ + EVAS_SCRIPT_BUHID, /* Buhd */ + EVAS_SCRIPT_TAGBANWA, /* Tagb */ + + /* Unicode-4.0 additions */ + EVAS_SCRIPT_BRAILLE, /* Brai */ + EVAS_SCRIPT_CYPRIOT, /* Cprt */ + EVAS_SCRIPT_LIMBU, /* Limb */ + EVAS_SCRIPT_OSMANYA, /* Osma */ + EVAS_SCRIPT_SHAVIAN, /* Shaw */ + EVAS_SCRIPT_LINEAR_B, /* Linb */ + EVAS_SCRIPT_TAI_LE, /* Tale */ + EVAS_SCRIPT_UGARITIC, /* Ugar */ + + /* Unicode-4.1 additions */ + EVAS_SCRIPT_NEW_TAI_LUE, /* Talu */ + EVAS_SCRIPT_BUGINESE, /* Bugi */ + EVAS_SCRIPT_GLAGOLITIC, /* Glag */ + EVAS_SCRIPT_TIFINAGH, /* Tfng */ + EVAS_SCRIPT_SYLOTI_NAGRI, /* Sylo */ + EVAS_SCRIPT_OLD_PERSIAN, /* Xpeo */ + EVAS_SCRIPT_KHAROSHTHI, /* Khar */ + + /* Unicode-5.0 additions */ + EVAS_SCRIPT_UNKNOWN, /* Zzzz */ + EVAS_SCRIPT_BALINESE, /* Bali */ + EVAS_SCRIPT_CUNEIFORM, /* Xsux */ + EVAS_SCRIPT_PHOENICIAN, /* Phnx */ + EVAS_SCRIPT_PHAGS_PA, /* Phag */ + EVAS_SCRIPT_NKO, /* Nkoo */ + + /* Unicode-5.1 additions */ + EVAS_SCRIPT_KAYAH_LI, /* Kali */ + EVAS_SCRIPT_LEPCHA, /* Lepc */ + EVAS_SCRIPT_REJANG, /* Rjng */ + EVAS_SCRIPT_SUNDANESE, /* Sund */ + EVAS_SCRIPT_SAURASHTRA, /* Saur */ + EVAS_SCRIPT_CHAM, /* Cham */ + EVAS_SCRIPT_OL_CHIKI, /* Olck */ + EVAS_SCRIPT_VAI, /* Vaii */ + EVAS_SCRIPT_CARIAN, /* Cari */ + EVAS_SCRIPT_LYCIAN, /* Lyci */ + EVAS_SCRIPT_LYDIAN, /* Lydi */ + + /* Unicode-5.2 additions */ + EVAS_SCRIPT_AVESTAN, /* Avst */ + EVAS_SCRIPT_BAMUM, /* Bamu */ + EVAS_SCRIPT_EGYPTIAN_HIEROGLYPHS, /* Egyp */ + EVAS_SCRIPT_IMPERIAL_ARAMAIC, /* Armi */ + EVAS_SCRIPT_INSCRIPTIONAL_PAHLAVI, /* Phli */ + EVAS_SCRIPT_INSCRIPTIONAL_PARTHIAN, /* Prti */ + EVAS_SCRIPT_JAVANESE, /* Java */ + EVAS_SCRIPT_KAITHI, /* Kthi */ + EVAS_SCRIPT_LISU, /* Lisu */ + EVAS_SCRIPT_MEETEI_MAYEK, /* Mtei */ + EVAS_SCRIPT_OLD_SOUTH_ARABIAN, /* Sarb */ + EVAS_SCRIPT_OLD_TURKIC, /* Orkh */ + EVAS_SCRIPT_SAMARITAN, /* Samr */ + EVAS_SCRIPT_TAI_THAM, /* Lana */ + EVAS_SCRIPT_TAI_VIET, /* Tavt */ + + /* Unicode-6.0 additions */ + EVAS_SCRIPT_BATAK, /* Batk */ + EVAS_SCRIPT_BRAHMI, /* Brah */ + EVAS_SCRIPT_MANDAIC, /* Mand */ +} Evas_Script_Type; + +int +evas_common_language_script_end_of_run_get(const Eina_Unicode *str, const Evas_BiDi_Paragraph_Props *bidi_props, size_t start, int len); + +Evas_Script_Type +evas_common_language_script_type_get(const Eina_Unicode *str, size_t len); + +Evas_Script_Type +evas_common_language_char_script_get(Eina_Unicode unicode); + +const char * +evas_common_language_from_locale_get(void); +#endif + diff --git a/libraries/evas/src/lib/engines/common/language/evas_script_table.h b/libraries/evas/src/lib/engines/common/language/evas_script_table.h new file mode 100644 index 0000000..dd77db0 --- /dev/null +++ b/libraries/evas/src/lib/engines/common/language/evas_script_table.h @@ -0,0 +1,3087 @@ +/* evas_script_table.h: Mostly based on output by gen-script-table.pl + * which is available in glib's tools. + * + * NOTICE: This is temporary and will only stay here until there will be + * a nice "UNICODE DATA" library to use. From my understanding it's already + * being worked on. + * + * Date: Sun May 1 15:48:56 2011 + * Source: Scripts-6.0.0.txt + * + * Do not edit. + */ + +#define EVAS_SCRIPT_DIRECT_TABLE_LIMIT 8192 + +static const +Eina_Unicode _evas_script_fast_table[EVAS_SCRIPT_DIRECT_TABLE_LIMIT] = { + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_BOPOMOFO, + EVAS_SCRIPT_BOPOMOFO, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, + EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, + EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, + EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, + EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, EVAS_SCRIPT_COPTIC, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_ARMENIAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_HEBREW, + EVAS_SCRIPT_HEBREW, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, EVAS_SCRIPT_SYRIAC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, EVAS_SCRIPT_ARABIC, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, + EVAS_SCRIPT_THAANA, EVAS_SCRIPT_THAANA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, EVAS_SCRIPT_NKO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, + EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_SAMARITAN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_MANDAIC, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_MANDAIC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, + EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_DEVANAGARI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, EVAS_SCRIPT_BENGALI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, + EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_GURMUKHI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_GUJARATI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GUJARATI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, + EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_ORIYA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_TAMIL, + EVAS_SCRIPT_TAMIL, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, + EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_TELUGU, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KANNADA, EVAS_SCRIPT_KANNADA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, EVAS_SCRIPT_MALAYALAM, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, EVAS_SCRIPT_SINHALA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, EVAS_SCRIPT_THAI, + EVAS_SCRIPT_THAI, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LAO, EVAS_SCRIPT_LAO, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_TIBETAN, EVAS_SCRIPT_TIBETAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, + EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_MYANMAR, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_GEORGIAN, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_GEORGIAN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, EVAS_SCRIPT_HANGUL, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, + EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_ETHIOPIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, EVAS_SCRIPT_CHEROKEE, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, + EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_OGHAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_RUNIC, + EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_RUNIC, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAGALOG, + EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, + EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, + EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, + EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, + EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, + EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_TAGALOG, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, + EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, + EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, + EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, + EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, + EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, + EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_HANUNOO, + EVAS_SCRIPT_HANUNOO, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, + EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, + EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, + EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, + EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, + EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, + EVAS_SCRIPT_BUHID, EVAS_SCRIPT_BUHID, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAGBANWA, + EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, + EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, + EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, + EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_TAGBANWA, + EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAGBANWA, + EVAS_SCRIPT_TAGBANWA, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, EVAS_SCRIPT_MONGOLIAN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, EVAS_SCRIPT_CANADIAN_ABORIGINAL, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, EVAS_SCRIPT_LIMBU, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_TAI_LE, + EVAS_SCRIPT_TAI_LE, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_NEW_TAI_LUE, EVAS_SCRIPT_NEW_TAI_LUE, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, + EVAS_SCRIPT_KHMER, EVAS_SCRIPT_KHMER, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BUGINESE, + EVAS_SCRIPT_BUGINESE, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, + EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_TAI_THAM, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, + EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_BALINESE, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, EVAS_SCRIPT_SUNDANESE, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, EVAS_SCRIPT_BATAK, + EVAS_SCRIPT_BATAK, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, EVAS_SCRIPT_LEPCHA, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, EVAS_SCRIPT_OL_CHIKI, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, EVAS_SCRIPT_COMMON, + EVAS_SCRIPT_COMMON, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_CYRILLIC, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_CYRILLIC, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, EVAS_SCRIPT_INHERITED, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, EVAS_SCRIPT_LATIN, + EVAS_SCRIPT_LATIN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_UNKNOWN, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_UNKNOWN, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, EVAS_SCRIPT_GREEK, + EVAS_SCRIPT_GREEK, EVAS_SCRIPT_UNKNOWN, +}; + +static const struct { + Eina_Unicode start; + short len; + Evas_Script_Type script; +} _evas_script_slow_table[] = { + { 0x2000, 12, EVAS_SCRIPT_COMMON }, + { 0x200c, 2, EVAS_SCRIPT_INHERITED }, + { 0x200e, 87, EVAS_SCRIPT_COMMON }, + { 0x206a, 7, EVAS_SCRIPT_COMMON }, + { 0x2071, 1, EVAS_SCRIPT_LATIN }, + { 0x2074, 11, EVAS_SCRIPT_COMMON }, + { 0x207f, 1, EVAS_SCRIPT_LATIN }, + { 0x2080, 15, EVAS_SCRIPT_COMMON }, + { 0x2090, 13, EVAS_SCRIPT_LATIN }, + { 0x20a0, 26, EVAS_SCRIPT_COMMON }, + { 0x20d0, 33, EVAS_SCRIPT_INHERITED }, + { 0x2100, 38, EVAS_SCRIPT_COMMON }, + { 0x2126, 1, EVAS_SCRIPT_GREEK }, + { 0x2127, 3, EVAS_SCRIPT_COMMON }, + { 0x212a, 2, EVAS_SCRIPT_LATIN }, + { 0x212c, 6, EVAS_SCRIPT_COMMON }, + { 0x2132, 1, EVAS_SCRIPT_LATIN }, + { 0x2133, 27, EVAS_SCRIPT_COMMON }, + { 0x214e, 1, EVAS_SCRIPT_LATIN }, + { 0x214f, 17, EVAS_SCRIPT_COMMON }, + { 0x2160, 41, EVAS_SCRIPT_LATIN }, + { 0x2189, 1, EVAS_SCRIPT_COMMON }, + { 0x2190, 612, EVAS_SCRIPT_COMMON }, + { 0x2400, 39, EVAS_SCRIPT_COMMON }, + { 0x2440, 11, EVAS_SCRIPT_COMMON }, + { 0x2460, 672, EVAS_SCRIPT_COMMON }, + { 0x2701, 202, EVAS_SCRIPT_COMMON }, + { 0x27cc, 1, EVAS_SCRIPT_COMMON }, + { 0x27ce, 50, EVAS_SCRIPT_COMMON }, + { 0x2800, 256, EVAS_SCRIPT_BRAILLE }, + { 0x2900, 589, EVAS_SCRIPT_COMMON }, + { 0x2b50, 10, EVAS_SCRIPT_COMMON }, + { 0x2c00, 47, EVAS_SCRIPT_GLAGOLITIC }, + { 0x2c30, 47, EVAS_SCRIPT_GLAGOLITIC }, + { 0x2c60, 32, EVAS_SCRIPT_LATIN }, + { 0x2c80, 114, EVAS_SCRIPT_COPTIC }, + { 0x2cf9, 7, EVAS_SCRIPT_COPTIC }, + { 0x2d00, 38, EVAS_SCRIPT_GEORGIAN }, + { 0x2d30, 54, EVAS_SCRIPT_TIFINAGH }, + { 0x2d6f, 2, EVAS_SCRIPT_TIFINAGH }, + { 0x2d7f, 1, EVAS_SCRIPT_TIFINAGH }, + { 0x2d80, 23, EVAS_SCRIPT_ETHIOPIC }, + { 0x2da0, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2da8, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2db0, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2db8, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2dc0, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2dc8, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2dd0, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2dd8, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0x2de0, 32, EVAS_SCRIPT_CYRILLIC }, + { 0x2e00, 50, EVAS_SCRIPT_COMMON }, + { 0x2e80, 26, EVAS_SCRIPT_HAN }, + { 0x2e9b, 89, EVAS_SCRIPT_HAN }, + { 0x2f00, 214, EVAS_SCRIPT_HAN }, + { 0x2ff0, 12, EVAS_SCRIPT_COMMON }, + { 0x3000, 5, EVAS_SCRIPT_COMMON }, + { 0x3005, 1, EVAS_SCRIPT_HAN }, + { 0x3006, 1, EVAS_SCRIPT_COMMON }, + { 0x3007, 1, EVAS_SCRIPT_HAN }, + { 0x3008, 25, EVAS_SCRIPT_COMMON }, + { 0x3021, 9, EVAS_SCRIPT_HAN }, + { 0x302a, 4, EVAS_SCRIPT_INHERITED }, + { 0x302e, 2, EVAS_SCRIPT_HANGUL }, + { 0x3030, 8, EVAS_SCRIPT_COMMON }, + { 0x3038, 4, EVAS_SCRIPT_HAN }, + { 0x303c, 4, EVAS_SCRIPT_COMMON }, + { 0x3041, 86, EVAS_SCRIPT_HIRAGANA }, + { 0x3099, 2, EVAS_SCRIPT_INHERITED }, + { 0x309b, 2, EVAS_SCRIPT_COMMON }, + { 0x309d, 3, EVAS_SCRIPT_HIRAGANA }, + { 0x30a0, 1, EVAS_SCRIPT_COMMON }, + { 0x30a1, 90, EVAS_SCRIPT_KATAKANA }, + { 0x30fb, 2, EVAS_SCRIPT_COMMON }, + { 0x30fd, 3, EVAS_SCRIPT_KATAKANA }, + { 0x3105, 41, EVAS_SCRIPT_BOPOMOFO }, + { 0x3131, 94, EVAS_SCRIPT_HANGUL }, + { 0x3190, 16, EVAS_SCRIPT_COMMON }, + { 0x31a0, 27, EVAS_SCRIPT_BOPOMOFO }, + { 0x31c0, 36, EVAS_SCRIPT_COMMON }, + { 0x31f0, 16, EVAS_SCRIPT_KATAKANA }, + { 0x3200, 31, EVAS_SCRIPT_HANGUL }, + { 0x3220, 64, EVAS_SCRIPT_COMMON }, + { 0x3260, 31, EVAS_SCRIPT_HANGUL }, + { 0x327f, 81, EVAS_SCRIPT_COMMON }, + { 0x32d0, 47, EVAS_SCRIPT_KATAKANA }, + { 0x3300, 88, EVAS_SCRIPT_KATAKANA }, + { 0x3358, 168, EVAS_SCRIPT_COMMON }, + { 0x3400, 6582, EVAS_SCRIPT_HAN }, + { 0x4dc0, 64, EVAS_SCRIPT_COMMON }, + { 0x4e00, 20940, EVAS_SCRIPT_HAN }, + { 0xa000, 1165, EVAS_SCRIPT_YI }, + { 0xa490, 55, EVAS_SCRIPT_YI }, + { 0xa4d0, 48, EVAS_SCRIPT_LISU }, + { 0xa500, 300, EVAS_SCRIPT_VAI }, + { 0xa640, 52, EVAS_SCRIPT_CYRILLIC }, + { 0xa67c, 28, EVAS_SCRIPT_CYRILLIC }, + { 0xa6a0, 88, EVAS_SCRIPT_BAMUM }, + { 0xa700, 34, EVAS_SCRIPT_COMMON }, + { 0xa722, 102, EVAS_SCRIPT_LATIN }, + { 0xa788, 3, EVAS_SCRIPT_COMMON }, + { 0xa78b, 4, EVAS_SCRIPT_LATIN }, + { 0xa790, 2, EVAS_SCRIPT_LATIN }, + { 0xa7a0, 10, EVAS_SCRIPT_LATIN }, + { 0xa7fa, 6, EVAS_SCRIPT_LATIN }, + { 0xa800, 44, EVAS_SCRIPT_SYLOTI_NAGRI }, + { 0xa830, 10, EVAS_SCRIPT_COMMON }, + { 0xa840, 56, EVAS_SCRIPT_PHAGS_PA }, + { 0xa880, 69, EVAS_SCRIPT_SAURASHTRA }, + { 0xa8ce, 12, EVAS_SCRIPT_SAURASHTRA }, + { 0xa8e0, 28, EVAS_SCRIPT_DEVANAGARI }, + { 0xa900, 48, EVAS_SCRIPT_KAYAH_LI }, + { 0xa930, 36, EVAS_SCRIPT_REJANG }, + { 0xa95f, 1, EVAS_SCRIPT_REJANG }, + { 0xa960, 29, EVAS_SCRIPT_HANGUL }, + { 0xa980, 78, EVAS_SCRIPT_JAVANESE }, + { 0xa9cf, 11, EVAS_SCRIPT_JAVANESE }, + { 0xa9de, 2, EVAS_SCRIPT_JAVANESE }, + { 0xaa00, 55, EVAS_SCRIPT_CHAM }, + { 0xaa40, 14, EVAS_SCRIPT_CHAM }, + { 0xaa50, 10, EVAS_SCRIPT_CHAM }, + { 0xaa5c, 4, EVAS_SCRIPT_CHAM }, + { 0xaa60, 28, EVAS_SCRIPT_MYANMAR }, + { 0xaa80, 67, EVAS_SCRIPT_TAI_VIET }, + { 0xaadb, 5, EVAS_SCRIPT_TAI_VIET }, + { 0xab01, 6, EVAS_SCRIPT_ETHIOPIC }, + { 0xab09, 6, EVAS_SCRIPT_ETHIOPIC }, + { 0xab11, 6, EVAS_SCRIPT_ETHIOPIC }, + { 0xab20, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0xab28, 7, EVAS_SCRIPT_ETHIOPIC }, + { 0xabc0, 46, EVAS_SCRIPT_MEETEI_MAYEK }, + { 0xabf0, 10, EVAS_SCRIPT_MEETEI_MAYEK }, + { 0xac00, 11172, EVAS_SCRIPT_HANGUL }, + { 0xd7b0, 23, EVAS_SCRIPT_HANGUL }, + { 0xd7cb, 49, EVAS_SCRIPT_HANGUL }, + { 0xf900, 302, EVAS_SCRIPT_HAN }, + { 0xfa30, 62, EVAS_SCRIPT_HAN }, + { 0xfa70, 106, EVAS_SCRIPT_HAN }, + { 0xfb00, 7, EVAS_SCRIPT_LATIN }, + { 0xfb13, 5, EVAS_SCRIPT_ARMENIAN }, + { 0xfb1d, 26, EVAS_SCRIPT_HEBREW }, + { 0xfb38, 5, EVAS_SCRIPT_HEBREW }, + { 0xfb3e, 1, EVAS_SCRIPT_HEBREW }, + { 0xfb40, 2, EVAS_SCRIPT_HEBREW }, + { 0xfb43, 2, EVAS_SCRIPT_HEBREW }, + { 0xfb46, 10, EVAS_SCRIPT_HEBREW }, + { 0xfb50, 114, EVAS_SCRIPT_ARABIC }, + { 0xfbd3, 363, EVAS_SCRIPT_ARABIC }, + { 0xfd3e, 2, EVAS_SCRIPT_COMMON }, + { 0xfd50, 64, EVAS_SCRIPT_ARABIC }, + { 0xfd92, 54, EVAS_SCRIPT_ARABIC }, + { 0xfdf0, 13, EVAS_SCRIPT_ARABIC }, + { 0xfdfd, 1, EVAS_SCRIPT_COMMON }, + { 0xfe00, 16, EVAS_SCRIPT_INHERITED }, + { 0xfe10, 10, EVAS_SCRIPT_COMMON }, + { 0xfe20, 7, EVAS_SCRIPT_INHERITED }, + { 0xfe30, 35, EVAS_SCRIPT_COMMON }, + { 0xfe54, 19, EVAS_SCRIPT_COMMON }, + { 0xfe68, 4, EVAS_SCRIPT_COMMON }, + { 0xfe70, 5, EVAS_SCRIPT_ARABIC }, + { 0xfe76, 135, EVAS_SCRIPT_ARABIC }, + { 0xfeff, 1, EVAS_SCRIPT_COMMON }, + { 0xff01, 32, EVAS_SCRIPT_COMMON }, + { 0xff21, 26, EVAS_SCRIPT_LATIN }, + { 0xff3b, 6, EVAS_SCRIPT_COMMON }, + { 0xff41, 26, EVAS_SCRIPT_LATIN }, + { 0xff5b, 11, EVAS_SCRIPT_COMMON }, + { 0xff66, 10, EVAS_SCRIPT_KATAKANA }, + { 0xff70, 1, EVAS_SCRIPT_COMMON }, + { 0xff71, 45, EVAS_SCRIPT_KATAKANA }, + { 0xff9e, 2, EVAS_SCRIPT_COMMON }, + { 0xffa0, 31, EVAS_SCRIPT_HANGUL }, + { 0xffc2, 6, EVAS_SCRIPT_HANGUL }, + { 0xffca, 6, EVAS_SCRIPT_HANGUL }, + { 0xffd2, 6, EVAS_SCRIPT_HANGUL }, + { 0xffda, 3, EVAS_SCRIPT_HANGUL }, + { 0xffe0, 7, EVAS_SCRIPT_COMMON }, + { 0xffe8, 7, EVAS_SCRIPT_COMMON }, + { 0xfff9, 5, EVAS_SCRIPT_COMMON }, + { 0x10000, 12, EVAS_SCRIPT_LINEAR_B }, + { 0x1000d, 26, EVAS_SCRIPT_LINEAR_B }, + { 0x10028, 19, EVAS_SCRIPT_LINEAR_B }, + { 0x1003c, 2, EVAS_SCRIPT_LINEAR_B }, + { 0x1003f, 15, EVAS_SCRIPT_LINEAR_B }, + { 0x10050, 14, EVAS_SCRIPT_LINEAR_B }, + { 0x10080, 123, EVAS_SCRIPT_LINEAR_B }, + { 0x10100, 3, EVAS_SCRIPT_COMMON }, + { 0x10107, 45, EVAS_SCRIPT_COMMON }, + { 0x10137, 9, EVAS_SCRIPT_COMMON }, + { 0x10140, 75, EVAS_SCRIPT_GREEK }, + { 0x10190, 12, EVAS_SCRIPT_COMMON }, + { 0x101d0, 45, EVAS_SCRIPT_COMMON }, + { 0x101fd, 1, EVAS_SCRIPT_INHERITED }, + { 0x10280, 29, EVAS_SCRIPT_LYCIAN }, + { 0x102a0, 49, EVAS_SCRIPT_CARIAN }, + { 0x10300, 31, EVAS_SCRIPT_OLD_ITALIC }, + { 0x10320, 4, EVAS_SCRIPT_OLD_ITALIC }, + { 0x10330, 27, EVAS_SCRIPT_GOTHIC }, + { 0x10380, 30, EVAS_SCRIPT_UGARITIC }, + { 0x1039f, 1, EVAS_SCRIPT_UGARITIC }, + { 0x103a0, 36, EVAS_SCRIPT_OLD_PERSIAN }, + { 0x103c8, 14, EVAS_SCRIPT_OLD_PERSIAN }, + { 0x10400, 80, EVAS_SCRIPT_DESERET }, + { 0x10450, 48, EVAS_SCRIPT_SHAVIAN }, + { 0x10480, 30, EVAS_SCRIPT_OSMANYA }, + { 0x104a0, 10, EVAS_SCRIPT_OSMANYA }, + { 0x10800, 6, EVAS_SCRIPT_CYPRIOT }, + { 0x10808, 1, EVAS_SCRIPT_CYPRIOT }, + { 0x1080a, 44, EVAS_SCRIPT_CYPRIOT }, + { 0x10837, 2, EVAS_SCRIPT_CYPRIOT }, + { 0x1083c, 1, EVAS_SCRIPT_CYPRIOT }, + { 0x1083f, 1, EVAS_SCRIPT_CYPRIOT }, + { 0x10840, 22, EVAS_SCRIPT_IMPERIAL_ARAMAIC }, + { 0x10857, 9, EVAS_SCRIPT_IMPERIAL_ARAMAIC }, + { 0x10900, 28, EVAS_SCRIPT_PHOENICIAN }, + { 0x1091f, 1, EVAS_SCRIPT_PHOENICIAN }, + { 0x10920, 26, EVAS_SCRIPT_LYDIAN }, + { 0x1093f, 1, EVAS_SCRIPT_LYDIAN }, + { 0x10a00, 4, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a05, 2, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a0c, 8, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a15, 3, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a19, 27, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a38, 3, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a3f, 9, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a50, 9, EVAS_SCRIPT_KHAROSHTHI }, + { 0x10a60, 32, EVAS_SCRIPT_OLD_SOUTH_ARABIAN }, + { 0x10b00, 54, EVAS_SCRIPT_AVESTAN }, + { 0x10b39, 7, EVAS_SCRIPT_AVESTAN }, + { 0x10b40, 22, EVAS_SCRIPT_INSCRIPTIONAL_PARTHIAN }, + { 0x10b58, 8, EVAS_SCRIPT_INSCRIPTIONAL_PARTHIAN }, + { 0x10b60, 19, EVAS_SCRIPT_INSCRIPTIONAL_PAHLAVI }, + { 0x10b78, 8, EVAS_SCRIPT_INSCRIPTIONAL_PAHLAVI }, + { 0x10c00, 73, EVAS_SCRIPT_OLD_TURKIC }, + { 0x10e60, 31, EVAS_SCRIPT_ARABIC }, + { 0x11000, 78, EVAS_SCRIPT_BRAHMI }, + { 0x11052, 30, EVAS_SCRIPT_BRAHMI }, + { 0x11080, 66, EVAS_SCRIPT_KAITHI }, + { 0x12000, 879, EVAS_SCRIPT_CUNEIFORM }, + { 0x12400, 99, EVAS_SCRIPT_CUNEIFORM }, + { 0x12470, 4, EVAS_SCRIPT_CUNEIFORM }, + { 0x13000, 1071, EVAS_SCRIPT_EGYPTIAN_HIEROGLYPHS }, + { 0x16800, 569, EVAS_SCRIPT_BAMUM }, + { 0x1b000, 1, EVAS_SCRIPT_KATAKANA }, + { 0x1b001, 1, EVAS_SCRIPT_HIRAGANA }, + { 0x1d000, 246, EVAS_SCRIPT_COMMON }, + { 0x1d100, 39, EVAS_SCRIPT_COMMON }, + { 0x1d129, 62, EVAS_SCRIPT_COMMON }, + { 0x1d167, 3, EVAS_SCRIPT_INHERITED }, + { 0x1d16a, 17, EVAS_SCRIPT_COMMON }, + { 0x1d17b, 8, EVAS_SCRIPT_INHERITED }, + { 0x1d183, 2, EVAS_SCRIPT_COMMON }, + { 0x1d185, 7, EVAS_SCRIPT_INHERITED }, + { 0x1d18c, 30, EVAS_SCRIPT_COMMON }, + { 0x1d1aa, 4, EVAS_SCRIPT_INHERITED }, + { 0x1d1ae, 48, EVAS_SCRIPT_COMMON }, + { 0x1d200, 70, EVAS_SCRIPT_GREEK }, + { 0x1d300, 87, EVAS_SCRIPT_COMMON }, + { 0x1d360, 18, EVAS_SCRIPT_COMMON }, + { 0x1d400, 85, EVAS_SCRIPT_COMMON }, + { 0x1d456, 71, EVAS_SCRIPT_COMMON }, + { 0x1d49e, 2, EVAS_SCRIPT_COMMON }, + { 0x1d4a2, 1, EVAS_SCRIPT_COMMON }, + { 0x1d4a5, 2, EVAS_SCRIPT_COMMON }, + { 0x1d4a9, 4, EVAS_SCRIPT_COMMON }, + { 0x1d4ae, 12, EVAS_SCRIPT_COMMON }, + { 0x1d4bb, 1, EVAS_SCRIPT_COMMON }, + { 0x1d4bd, 7, EVAS_SCRIPT_COMMON }, + { 0x1d4c5, 65, EVAS_SCRIPT_COMMON }, + { 0x1d507, 4, EVAS_SCRIPT_COMMON }, + { 0x1d50d, 8, EVAS_SCRIPT_COMMON }, + { 0x1d516, 7, EVAS_SCRIPT_COMMON }, + { 0x1d51e, 28, EVAS_SCRIPT_COMMON }, + { 0x1d53b, 4, EVAS_SCRIPT_COMMON }, + { 0x1d540, 5, EVAS_SCRIPT_COMMON }, + { 0x1d546, 1, EVAS_SCRIPT_COMMON }, + { 0x1d54a, 7, EVAS_SCRIPT_COMMON }, + { 0x1d552, 340, EVAS_SCRIPT_COMMON }, + { 0x1d6a8, 292, EVAS_SCRIPT_COMMON }, + { 0x1d7ce, 50, EVAS_SCRIPT_COMMON }, + { 0x1f000, 44, EVAS_SCRIPT_COMMON }, + { 0x1f030, 100, EVAS_SCRIPT_COMMON }, + { 0x1f0a0, 15, EVAS_SCRIPT_COMMON }, + { 0x1f0b1, 14, EVAS_SCRIPT_COMMON }, + { 0x1f0c1, 15, EVAS_SCRIPT_COMMON }, + { 0x1f0d1, 15, EVAS_SCRIPT_COMMON }, + { 0x1f100, 11, EVAS_SCRIPT_COMMON }, + { 0x1f110, 31, EVAS_SCRIPT_COMMON }, + { 0x1f130, 58, EVAS_SCRIPT_COMMON }, + { 0x1f170, 43, EVAS_SCRIPT_COMMON }, + { 0x1f1e6, 26, EVAS_SCRIPT_COMMON }, + { 0x1f200, 1, EVAS_SCRIPT_HIRAGANA }, + { 0x1f201, 2, EVAS_SCRIPT_COMMON }, + { 0x1f210, 43, EVAS_SCRIPT_COMMON }, + { 0x1f240, 9, EVAS_SCRIPT_COMMON }, + { 0x1f250, 2, EVAS_SCRIPT_COMMON }, + { 0x1f300, 33, EVAS_SCRIPT_COMMON }, + { 0x1f330, 6, EVAS_SCRIPT_COMMON }, + { 0x1f337, 70, EVAS_SCRIPT_COMMON }, + { 0x1f380, 20, EVAS_SCRIPT_COMMON }, + { 0x1f3a0, 37, EVAS_SCRIPT_COMMON }, + { 0x1f3c6, 5, EVAS_SCRIPT_COMMON }, + { 0x1f3e0, 17, EVAS_SCRIPT_COMMON }, + { 0x1f400, 63, EVAS_SCRIPT_COMMON }, + { 0x1f440, 1, EVAS_SCRIPT_COMMON }, + { 0x1f442, 182, EVAS_SCRIPT_COMMON }, + { 0x1f4f9, 4, EVAS_SCRIPT_COMMON }, + { 0x1f500, 62, EVAS_SCRIPT_COMMON }, + { 0x1f550, 24, EVAS_SCRIPT_COMMON }, + { 0x1f5fb, 5, EVAS_SCRIPT_COMMON }, + { 0x1f601, 16, EVAS_SCRIPT_COMMON }, + { 0x1f612, 3, EVAS_SCRIPT_COMMON }, + { 0x1f616, 1, EVAS_SCRIPT_COMMON }, + { 0x1f618, 1, EVAS_SCRIPT_COMMON }, + { 0x1f61a, 1, EVAS_SCRIPT_COMMON }, + { 0x1f61c, 3, EVAS_SCRIPT_COMMON }, + { 0x1f620, 6, EVAS_SCRIPT_COMMON }, + { 0x1f628, 4, EVAS_SCRIPT_COMMON }, + { 0x1f62d, 1, EVAS_SCRIPT_COMMON }, + { 0x1f630, 4, EVAS_SCRIPT_COMMON }, + { 0x1f635, 12, EVAS_SCRIPT_COMMON }, + { 0x1f645, 11, EVAS_SCRIPT_COMMON }, + { 0x1f680, 70, EVAS_SCRIPT_COMMON }, + { 0x1f700, 116, EVAS_SCRIPT_COMMON }, + { 0x20000, 42711, EVAS_SCRIPT_HAN }, + { 0x2a700, 4149, EVAS_SCRIPT_HAN }, + { 0x2b740, 222, EVAS_SCRIPT_HAN }, + { 0x2f800, 542, EVAS_SCRIPT_HAN }, + { 0xe0001, 1, EVAS_SCRIPT_COMMON }, + { 0xe0020, 96, EVAS_SCRIPT_COMMON }, + { 0xe0100, 240, EVAS_SCRIPT_INHERITED }, +}; -- cgit v1.1