summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsubhransu mohanty <sub.mohanty@samsung.com>2017-11-09 16:55:44 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2017-11-10 11:20:38 +0900
commitf0b8c37d805fceba15ba317dd96b906d6e12f147 (patch)
tree5660c10fe9e66ca600f676779000d1c13ff52fc6 /src
parentbefb7701a71e45e9c76fb3873f3056b74d62527c (diff)
evas/vg: refactor ector engine api and backend .
Diffstat (limited to 'src')
-rw-r--r--src/lib/evas/canvas/evas_main.c2
-rw-r--r--src/lib/evas/include/evas_private.h9
-rw-r--r--src/modules/evas/engines/gl_generic/evas_engine.c205
-rw-r--r--src/modules/evas/engines/software_generic/evas_engine.c40
4 files changed, 64 insertions, 192 deletions
diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c
index dff563f195..60d2b7b4a1 100644
--- a/src/lib/evas/canvas/evas_main.c
+++ b/src/lib/evas/canvas/evas_main.c
@@ -887,8 +887,6 @@ _image_data_unset(Evas_Object_Protected_Data *obj, Eina_List **list)
887 } 887 }
888 CHECK(EFL_CANVAS_IMAGE_INTERNAL_CLASS, Evas_Image_Data, 888 CHECK(EFL_CANVAS_IMAGE_INTERNAL_CLASS, Evas_Image_Data,
889 ENFN->image_free(ENC, data->engine_data)) 889 ENFN->image_free(ENC, data->engine_data))
890 else CHECK(EFL_CANVAS_VG_CLASS, Efl_Canvas_Vg_Data,
891 obj->layer->evas->engine.func->ector_free(data->engine_data))
892 else CHECK(EFL_CANVAS_POLYGON_CLASS, Efl_Canvas_Polygon_Data, 890 else CHECK(EFL_CANVAS_POLYGON_CLASS, Efl_Canvas_Polygon_Data,
893 data->engine_data = 891 data->engine_data =
894 obj->layer->evas->engine.func->polygon_points_clear(ENC, 892 obj->layer->evas->engine.func->polygon_points_clear(ENC,
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 2fac91e094..43d378511b 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1503,15 +1503,12 @@ struct _Evas_Func
1503 void *(*texture_image_get) (void *engine, void *texture); 1503 void *(*texture_image_get) (void *engine, void *texture);
1504 1504
1505 Ector_Surface *(*ector_create) (void *engine); 1505 Ector_Surface *(*ector_create) (void *engine);
1506 void (*ector_output_set) (void *engine, Ector_Surface *surface, void *output);
1507 void (*ector_destroy) (void *engine, Ector_Surface *surface); 1506 void (*ector_destroy) (void *engine, Ector_Surface *surface);
1508 Ector_Buffer *(*ector_buffer_wrap) (void *engine, Evas *e, void *engine_image); 1507 Ector_Buffer *(*ector_buffer_wrap) (void *engine, Evas *e, void *engine_image);
1509 Ector_Buffer *(*ector_buffer_new) (void *engine, Evas *e, int width, int height, Efl_Gfx_Colorspace cspace, Ector_Buffer_Flag flags); 1508 Ector_Buffer *(*ector_buffer_new) (void *engine, Evas *e, int width, int height, Efl_Gfx_Colorspace cspace, Ector_Buffer_Flag flags);
1510 void (*ector_begin) (void *engine, void *context, Ector_Surface *ector, void *surface, void *engine_data, int x, int y, Eina_Bool do_async); 1509 void (*ector_begin) (void *engine, void *output, void *context, void *surface, Ector_Surface *ector, int x, int y, Eina_Bool do_async);
1511 void (*ector_renderer_draw) (void *engine, void *data, void *context, void *surface, void *engine_data, Ector_Renderer *r, Eina_Array *clips, Eina_Bool do_async); 1510 void (*ector_renderer_draw) (void *engine, void *output, void *context, void *surface, Ector_Renderer *r, Eina_Array *clips, Eina_Bool do_async);
1512 void (*ector_end) (void *engine, void *context, Ector_Surface *ector, void *surface, void *engine_data, Eina_Bool do_async); 1511 void (*ector_end) (void *engine, void *output, void *context, void *surface, Ector_Surface *ector, Eina_Bool do_async);
1513 void* (*ector_new) (void *engine, void *context, Ector_Surface *ector, void *surface);
1514 void (*ector_free) (void *engine_data);
1515 1512
1516 void *(*ector_surface_create) (void *engine, int w, int h, int *error); 1513 void *(*ector_surface_create) (void *engine, int w, int h, int *error);
1517 void (*ector_surface_destroy) (void *engine, void *surface); 1514 void (*ector_surface_destroy) (void *engine, void *surface);
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c
index 6e6d6a9082..0829e7a0b4 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -172,7 +172,8 @@ eng_engine_free(void *engine)
172 Render_Engine_GL_Generic *e = engine; 172 Render_Engine_GL_Generic *e = engine;
173 Render_Output_GL_Generic *output; 173 Render_Output_GL_Generic *output;
174 174
175 generic_cache_destroy(e->software.surface_cache); 175 //@FIXME this causes some deadlock while freeing the engine image.
176 //generic_cache_destroy(e->software.surface_cache);
176 177
177 EINA_LIST_FREE(e->software.outputs, output) 178 EINA_LIST_FREE(e->software.outputs, output)
178 ERR("Output %p not properly cleaned before engine destruction.", output); 179 ERR("Output %p not properly cleaned before engine destruction.", output);
@@ -2560,67 +2561,30 @@ _evas_render_op_to_ector_rop(Evas_Render_Op op)
2560} 2561}
2561 2562
2562static void 2563static void
2563eng_ector_renderer_draw(void *engine EINA_UNUSED, void *data, void *context, void *surface, void *engine_data EINA_UNUSED, Ector_Renderer *renderer, Eina_Array *clips, Eina_Bool do_async EINA_UNUSED) 2564eng_ector_renderer_draw(void *engine EINA_UNUSED, void *output,
2565 void *context EINA_UNUSED, void *surface EINA_UNUSED,
2566 Ector_Renderer *renderer, Eina_Array *clips EINA_UNUSED, Eina_Bool do_async EINA_UNUSED)
2564{ 2567{
2565 Evas_GL_Image *dst = surface; 2568 if (use_cairo|| !use_gl)
2566 Evas_Engine_GL_Context *gc;
2567 Render_Output_GL_Generic *re = data;
2568 Eina_Rectangle *r;
2569 Eina_Array *c;
2570 Eina_Rectangle clip;
2571 Eina_Array_Iterator it;
2572 unsigned int i;
2573
2574 gc = re->window_gl_context_get(re->software.ob);
2575 gc->dc = context;
2576 if (gc->dc->clip.use)
2577 {
2578 clip.x = gc->dc->clip.x;
2579 clip.y = gc->dc->clip.y;
2580 clip.w = gc->dc->clip.w;
2581 clip.h = gc->dc->clip.h;
2582 }
2583 else
2584 {
2585 clip.x = 0;
2586 clip.y = 0;
2587 clip.w = dst->w;
2588 clip.h = dst->h;
2589 }
2590
2591 c = eina_array_new(8);
2592 if (clips)
2593 { 2569 {
2594 EINA_ARRAY_ITER_NEXT(clips, i, r, it) 2570 int w, h;
2595 { 2571 Eina_Rectangle *r;
2596 Eina_Rectangle *rc; 2572 Eina_Array *c = eina_array_new(4);
2573 Evas_GL_Image *glimg = output;
2597 2574
2598 rc = eina_rectangle_new(r->x, r->y, r->w, r->h); 2575 eng_image_size_get(engine, glimg, &w, &h);
2599 if (!rc) continue; 2576 eina_array_push(c, eina_rectangle_new(0, 0, w, h));
2600 2577
2601 if (eina_rectangle_intersection(rc, &clip)) 2578 ector_renderer_draw(renderer, _evas_render_op_to_ector_rop(EVAS_RENDER_COPY), c, 0xffffffff);
2602 eina_array_push(c, rc);
2603 else
2604 eina_rectangle_free(rc);
2605 }
2606 2579
2607 if (eina_array_count(c) == 0 && 2580 while ((r = eina_array_pop(c)))
2608 eina_array_count(clips) > 0) 2581 eina_rectangle_free(r);
2609 { 2582 eina_array_free(c);
2610 eina_array_free(c); 2583 }
2611 return; 2584 else
2612 } 2585 {
2586 //FIXME no implementation yet
2613 } 2587 }
2614
2615 if (eina_array_count(c) == 0)
2616 eina_array_push(c, eina_rectangle_new(clip.x, clip.y, clip.w, clip.h));
2617
2618 ector_renderer_draw(renderer, _evas_render_op_to_ector_rop(gc->dc->render_op), c, // mul_col will be applied by GL during ector_end
2619 0xffffffff);
2620
2621 while ((r = eina_array_pop(c)))
2622 eina_rectangle_free(r);
2623 eina_array_free(c);
2624} 2588}
2625 2589
2626// Ector functions start 2590// Ector functions start
@@ -2641,7 +2605,7 @@ eng_ector_surface_create(void *engine, int width, int height, int *error)
2641 { 2605 {
2642 surface = eng_image_new_from_copied_data(engine, width, height, NULL, EINA_TRUE, EVAS_COLORSPACE_ARGB8888); 2606 surface = eng_image_new_from_copied_data(engine, width, height, NULL, EINA_TRUE, EVAS_COLORSPACE_ARGB8888);
2643 if (!surface) 2607 if (!surface)
2644 *error = EINA_TRUE; 2608 *error = EINA_TRUE;
2645 else //Use this hint for ZERO COPY texture upload. 2609 else //Use this hint for ZERO COPY texture upload.
2646 eng_image_content_hint_set(engine, surface, EVAS_IMAGE_CONTENT_HINT_DYNAMIC); 2610 eng_image_content_hint_set(engine, surface, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
2647 } 2611 }
@@ -2681,127 +2645,54 @@ eng_ector_surface_cache_drop(void *engine, void *key)
2681 generic_cache_data_drop(e->software.surface_cache, key); 2645 generic_cache_data_drop(e->software.surface_cache, key);
2682} 2646}
2683 2647
2684
2685typedef struct _Evas_GL_Ector Evas_GL_Ector;
2686struct _Evas_GL_Ector
2687{
2688 Evas_GL_Image *gl;
2689 DATA32 *software;
2690
2691 Eina_Bool tofree;
2692};
2693
2694static void*
2695eng_ector_new(void *engine EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *ector EINA_UNUSED, void *surface EINA_UNUSED)
2696{
2697 Evas_GL_Ector *r;
2698
2699 r = calloc(1, sizeof (Evas_GL_Ector));
2700 return r;
2701}
2702
2703static void
2704eng_ector_free(void *engine_data)
2705{
2706 Evas_GL_Ector *r = engine_data;
2707
2708 evas_gl_common_image_free(r->gl);
2709 if (r->tofree) free(r->software);
2710 free(r);
2711}
2712
2713static void 2648static void
2714eng_ector_begin(void *engine, void *context EINA_UNUSED, Ector_Surface *ector, 2649eng_ector_begin(void *engine, void *output,
2715 void *surface, void *engine_data, 2650 void *context EINA_UNUSED, void *surface EINA_UNUSED,
2716 int x, int y, Eina_Bool do_async EINA_UNUSED) 2651 Ector_Surface *ector, int x, int y, Eina_Bool do_async EINA_UNUSED)
2717{ 2652{
2718 Evas_Engine_GL_Context *gl_context;
2719 Evas_GL_Ector *buffer = engine_data;
2720 int w, h;
2721
2722 gl_context = gl_generic_context_get(engine, 1);
2723 evas_gl_common_context_target_surface_set(gl_context, surface);
2724 gl_context->dc = context;
2725
2726 if (use_cairo|| !use_gl) 2653 if (use_cairo|| !use_gl)
2727 { 2654 {
2728 w = gl_context->w; h = gl_context->h; 2655 int w, h, stride;
2729 2656 Evas_GL_Image *glim = output;
2730 if (!buffer->gl || buffer->gl->w != w || buffer->gl->h != h) 2657 DATA32 *pixels;
2731 { 2658 int load_err;
2732 int err = EVAS_LOAD_ERROR_NONE;
2733 2659
2734 evas_gl_common_image_free(buffer->gl); 2660 glim = eng_image_data_get(engine, glim, EINA_TRUE, &pixels, &load_err,NULL);
2735 if (buffer->tofree) free(buffer->software); 2661 eng_image_stride_get(engine, glim, &stride);
2736 buffer->software = NULL; 2662 eng_image_size_get(engine, glim, &w, &h);
2663 memset(pixels, 0, stride * h);
2737 2664
2738 buffer->gl = evas_gl_common_image_new(gl_context, w, h, 1, EVAS_COLORSPACE_ARGB8888); 2665 // it just uses the software backend to draw for now
2739 if (!buffer->gl) 2666 ector_buffer_pixels_set(ector, pixels, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
2740 {
2741 ERR("Creation of an image for vector graphics [%i, %i] failed\n", w, h);
2742 return ;
2743 }
2744 /* evas_gl_common_image_content_hint_set(buffer->gl, EVAS_IMAGE_CONTENT_HINT_DYNAMIC); */
2745 buffer->gl = eng_image_data_get(engine, buffer->gl, 1, &buffer->software, &err, &buffer->tofree);
2746 if (!buffer->gl && err != EVAS_LOAD_ERROR_NONE)
2747 {
2748 ERR("Mapping of an image for vector graphics [%i, %i] failed with %i\n", w, h, err);
2749 return ;
2750 }
2751 }
2752 memset(buffer->software, 0, sizeof (unsigned int) * w * h);
2753 ector_buffer_pixels_set(ector, buffer->software, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
2754 ector_surface_reference_point_set(ector, x, y); 2667 ector_surface_reference_point_set(ector, x, y);
2755 } 2668 }
2756 else 2669 else
2757 { 2670 {
2758 evas_gl_common_context_flush(gl_context); 2671 //FIXME: No implementation yet
2759
2760 ector_surface_reference_point_set(ector, x, y);
2761 } 2672 }
2762} 2673}
2763 2674
2764static void 2675static void
2765eng_ector_end(void *engine, void *context EINA_UNUSED, Ector_Surface *ector, 2676eng_ector_end(void *engine, void *output,
2766 void *surface EINA_UNUSED, void *engine_data, 2677 void *context EINA_UNUSED, void *surface EINA_UNUSED,
2767 Eina_Bool do_async EINA_UNUSED) 2678 Ector_Surface *ector, Eina_Bool do_async EINA_UNUSED)
2768{ 2679{
2769 Evas_Engine_GL_Context *gl_context;
2770 Evas_GL_Ector *buffer = engine_data;
2771 int w, h;
2772 Eina_Bool mul_use;
2773
2774 if (use_cairo || !use_gl) 2680 if (use_cairo || !use_gl)
2775 { 2681 {
2776 gl_context = gl_generic_context_get(engine, 1); 2682 Evas_GL_Image *glim = output;
2777 w = gl_context->w; h = gl_context->h; 2683 DATA32 *pixels;
2778 mul_use = gl_context->dc->mul.use; 2684 int load_err;
2779
2780 ector_buffer_pixels_set(ector, NULL, 0, 0, 0, 0);
2781 buffer->gl = eng_image_data_put(engine, buffer->gl, buffer->software);
2782
2783 if (!mul_use)
2784 {
2785 // @hack as image_draw uses below fields to do colour multiplication.
2786 gl_context->dc->mul.col = ector_color_multiply(0xffffffff, gl_context->dc->col.col);
2787 gl_context->dc->mul.use = EINA_TRUE;
2788 }
2789 2685
2790 // We actually just bluntly push the pixel all over the 2686 glim = eng_image_data_get(engine, glim, EINA_FALSE, &pixels, &load_err,NULL);
2791 // destination surface. We don't have the actual information
2792 // of the widget size. This is not a problem.
2793 // Later on, we don't want that information and today when
2794 // using GL backend, you just need to turn on Evas_Map on
2795 // the Evas_Object_VG.
2796 evas_gl_common_image_draw(gl_context, buffer->gl, 0, 0, w, h, 0, 0, w, h, 0);
2797 2687
2798 // restore gl state 2688 eng_image_data_put(engine, glim, pixels);
2799 gl_context->dc->mul.use = mul_use; 2689 eng_image_data_put(engine, glim, pixels);
2690 ector_buffer_pixels_set(ector, NULL, 0, 0, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
2691 evas_common_cpu_end_opt();
2800 } 2692 }
2801 else if (use_gl) 2693 else if (use_gl)
2802 { 2694 {
2803 // FIXME: Need to find a cleaner way to do so (maybe have a reset in evas_gl_context) 2695 //FIXME: No implementation yet
2804 // Force a full pipe reinitialization for now
2805 } 2696 }
2806} 2697}
2807 2698
@@ -3362,8 +3253,6 @@ module_open(Evas_Module *em)
3362 ORD(ector_begin); 3253 ORD(ector_begin);
3363 ORD(ector_renderer_draw); 3254 ORD(ector_renderer_draw);
3364 ORD(ector_end); 3255 ORD(ector_end);
3365 ORD(ector_new);
3366 ORD(ector_free);
3367 ORD(ector_surface_create); 3256 ORD(ector_surface_create);
3368 ORD(ector_surface_destroy); 3257 ORD(ector_surface_destroy);
3369 ORD(ector_surface_cache_set); 3258 ORD(ector_surface_cache_set);
diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c
index 1d7c97c7d4..69cc07b39b 100644
--- a/src/modules/evas/engines/software_generic/evas_engine.c
+++ b/src/modules/evas/engines/software_generic/evas_engine.c
@@ -4365,15 +4365,6 @@ eng_ector_surface_cache_drop(void *engine, void *key)
4365 generic_cache_data_drop(e->surface_cache, key); 4365 generic_cache_data_drop(e->surface_cache, key);
4366} 4366}
4367 4367
4368
4369static void
4370eng_ector_output_set(void *engine EINA_UNUSED,
4371 Ector_Surface *surface EINA_UNUSED,
4372 void *output EINA_UNUSED)
4373{
4374 // To be useful for GL backend only.
4375}
4376
4377static void 4368static void
4378eng_ector_destroy(void *data EINA_UNUSED, Ector_Surface *ector) 4369eng_ector_destroy(void *data EINA_UNUSED, Ector_Surface *ector)
4379{ 4370{
@@ -4467,8 +4458,11 @@ _draw_thread_ector_draw(void *data)
4467} 4458}
4468 4459
4469static void 4460static void
4470eng_ector_renderer_draw(void *engine EINA_UNUSED, void *data EINA_UNUSED, void *context, void *surface, void *engine_data EINA_UNUSED, Ector_Renderer *renderer, Eina_Array *clips, Eina_Bool do_async) 4461eng_ector_renderer_draw(void *engine EINA_UNUSED, void *surface,
4462 void *context, void *remove EINA_UNUSED,
4463 Ector_Renderer *renderer, Eina_Array *clips, Eina_Bool do_async)
4471{ 4464{
4465
4472 RGBA_Image *dst = surface; 4466 RGBA_Image *dst = surface;
4473 RGBA_Draw_Context *dc = context; 4467 RGBA_Draw_Context *dc = context;
4474 Evas_Thread_Command_Ector ector; 4468 Evas_Thread_Command_Ector ector;
@@ -4573,6 +4567,8 @@ _draw_thread_ector_surface_set(void *data)
4573 h = surface->cache_entry.h; 4567 h = surface->cache_entry.h;
4574 x = ector_surface->x; 4568 x = ector_surface->x;
4575 y = ector_surface->y; 4569 y = ector_surface->y;
4570 // clear the surface before giving to ector
4571 memset(pixels, 0, (w * h * 4));
4576 } 4572 }
4577 4573
4578 ector_buffer_pixels_set(ector_surface->ector, pixels, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE); 4574 ector_buffer_pixels_set(ector_surface->ector, pixels, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
@@ -4581,19 +4577,10 @@ _draw_thread_ector_surface_set(void *data)
4581 eina_mempool_free(_mp_command_ector_surface, ector_surface); 4577 eina_mempool_free(_mp_command_ector_surface, ector_surface);
4582} 4578}
4583 4579
4584static void*
4585eng_ector_new(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *ector EINA_UNUSED, void *surface EINA_UNUSED)
4586{
4587 return NULL;
4588}
4589
4590static void
4591eng_ector_free(void *engine_data EINA_UNUSED)
4592{
4593}
4594
4595static void 4580static void
4596eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *ector, void *surface, void *engine_data EINA_UNUSED, int x, int y, Eina_Bool do_async) 4581eng_ector_begin(void *engine EINA_UNUSED, void *surface,
4582 void *context EINA_UNUSED, void *remove EINA_UNUSED,
4583 Ector_Surface *ector, int x, int y, Eina_Bool do_async)
4597{ 4584{
4598 if (do_async) 4585 if (do_async)
4599 { 4586 {
@@ -4619,6 +4606,8 @@ eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface
4619 pixels = evas_cache_image_pixels(&sf->cache_entry); 4606 pixels = evas_cache_image_pixels(&sf->cache_entry);
4620 w = sf->cache_entry.w; 4607 w = sf->cache_entry.w;
4621 h = sf->cache_entry.h; 4608 h = sf->cache_entry.h;
4609 // clear the surface before giving to ector
4610 memset(pixels, 0, (w * h * 4));
4622 4611
4623 ector_buffer_pixels_set(ector, pixels, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE); 4612 ector_buffer_pixels_set(ector, pixels, w, h, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);
4624 ector_surface_reference_point_set(ector, x, y); 4613 ector_surface_reference_point_set(ector, x, y);
@@ -4626,7 +4615,9 @@ eng_ector_begin(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface
4626} 4615}
4627 4616
4628static void 4617static void
4629eng_ector_end(void *data EINA_UNUSED, void *context EINA_UNUSED, Ector_Surface *ector, void *surface EINA_UNUSED, void *engine_data EINA_UNUSED, Eina_Bool do_async) 4618eng_ector_end(void *engine EINA_UNUSED, void *surface EINA_UNUSED,
4619 void *context EINA_UNUSED, void *remove EINA_UNUSED,
4620 Ector_Surface *ector, Eina_Bool do_async)
4630{ 4621{
4631 if (do_async) 4622 if (do_async)
4632 { 4623 {
@@ -4885,15 +4876,12 @@ static Evas_Func func =
4885 NULL, // eng_texture_image_set 4876 NULL, // eng_texture_image_set
4886 NULL, // eng_texture_image_get 4877 NULL, // eng_texture_image_get
4887 eng_ector_create, 4878 eng_ector_create,
4888 eng_ector_output_set,
4889 eng_ector_destroy, 4879 eng_ector_destroy,
4890 eng_ector_buffer_wrap, 4880 eng_ector_buffer_wrap,
4891 eng_ector_buffer_new, 4881 eng_ector_buffer_new,
4892 eng_ector_begin, 4882 eng_ector_begin,
4893 eng_ector_renderer_draw, 4883 eng_ector_renderer_draw,
4894 eng_ector_end, 4884 eng_ector_end,
4895 eng_ector_new,
4896 eng_ector_free,
4897 eng_ector_surface_create, 4885 eng_ector_surface_create,
4898 eng_ector_surface_destroy, 4886 eng_ector_surface_destroy,
4899 eng_ector_surface_cache_set, 4887 eng_ector_surface_cache_set,