summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHermet Park <hermetpark@gmail.com>2019-12-06 15:22:56 +0900
committerHermet Park <hermetpark@gmail.com>2019-12-06 15:31:30 +0900
commit19ef1555268e99cfb6ab07521d81519ada251617 (patch)
treef00252ec04eee40ad2b8c83e8b6c45932c40e35a
parent562ae738ccafbe1d876cc1a90de79fe97ad3ba79 (diff)
downloadefl-19ef1555268e99cfb6ab07521d81519ada251617.tar.gz
vg ector: Call a pair of ector begin/end for ector buffer drawing.
While we render vector drawing on ector,it uses ector buffers for subsequent compositions. In this sequence, it switches ector buffer with a composition target, while resuing the global ector context. Previously, it trickly switched ector buffer, it broke the ector begin/end pair. Now, it needs to recover global ector buffer once the composition finished. Thus ector buffer need to return the current pixels information for this.
-rw-r--r--src/lib/ector/ector_buffer.eo10
-rw-r--r--src/lib/ector/ector_surface.eo6
-rw-r--r--src/lib/ector/software/ector_software_buffer.c11
-rw-r--r--src/lib/ector/software/ector_software_buffer_base.eo1
-rw-r--r--src/lib/ector/software/ector_software_surface.c9
-rw-r--r--src/lib/ector/software/ector_software_surface.eo2
-rw-r--r--src/lib/evas/canvas/efl_canvas_vg_object.c18
-rw-r--r--src/lib/evas/include/evas_private.h2
-rw-r--r--src/modules/evas/engines/gl_generic/evas_engine.c4
9 files changed, 51 insertions, 12 deletions
diff --git a/src/lib/ector/ector_buffer.eo b/src/lib/ector/ector_buffer.eo
index a2e2253b73..a4a73b9b1a 100644
--- a/src/lib/ector/ector_buffer.eo
+++ b/src/lib/ector/ector_buffer.eo
@@ -81,6 +81,16 @@ mixin @beta Ector.Buffer
}
return: bool; [[True if pixels_set was successful]]
}
+ pixels_get @pure_virtual {
+ [[Gets the source pixels for the current buffer]]
+ params {
+ @out pixels: void_ptr; [[Returns buffer pixel pointer]]
+ @out width: int; [[Returns buffer width]]
+ @out height: int; [[Returns buffer height]]
+ @out stride: int; [[Returns buffer stride size]]
+ }
+ return: bool; [[True if returned pixels is writable]]
+ }
@property flags {
[[The capabilities of this buffer]]
get {}
diff --git a/src/lib/ector/ector_surface.eo b/src/lib/ector/ector_surface.eo
index 67a4813368..7d7defd3e9 100644
--- a/src/lib/ector/ector_surface.eo
+++ b/src/lib/ector/ector_surface.eo
@@ -5,10 +5,10 @@ mixin @beta Ector.Surface extends Ector.Buffer
c_prefix: ector_surface;
data: null;
methods {
- @property reference_point {
+ @property reference_point @pure_virtual {
[[This defines where (0,0) is in pixel coordinates inside the surface]]
- set @pure_virtual {
- }
+ set {}
+ get {}
values {
x: int; [[X coordinate for reference point]]
y: int; [[Y coordinate for reference point]]
diff --git a/src/lib/ector/software/ector_software_buffer.c b/src/lib/ector/software/ector_software_buffer.c
index df7fc27d1f..d6de02f4e7 100644
--- a/src/lib/ector/software/ector_software_buffer.c
+++ b/src/lib/ector/software/ector_software_buffer.c
@@ -64,6 +64,17 @@ _ector_software_buffer_base_pixels_clear(Eo *obj EINA_UNUSED, Ector_Software_Buf
}
EOLIAN static Eina_Bool
+_ector_software_buffer_base_ector_buffer_pixels_get(Eo *obj, Ector_Software_Buffer_Base_Data *pd,
+ void **pixels, int* width, int* height, int* stride)
+{
+ if (*pixels) *pixels = pd->pixels.u8;
+ if (*width) *width = pd->generic->w;
+ if (*height) *height = pd->generic->h;
+ if (*stride) *stride = pd->stride;
+ return pd->writable;
+}
+
+EOLIAN static Eina_Bool
_ector_software_buffer_base_ector_buffer_pixels_set(Eo *obj, Ector_Software_Buffer_Base_Data *pd,
void *pixels, int width, int height, int stride,
Efl_Gfx_Colorspace cspace, Eina_Bool writable)
diff --git a/src/lib/ector/software/ector_software_buffer_base.eo b/src/lib/ector/software/ector_software_buffer_base.eo
index 8cb576ef0a..39ad47ccac 100644
--- a/src/lib/ector/software/ector_software_buffer_base.eo
+++ b/src/lib/ector/software/ector_software_buffer_base.eo
@@ -10,6 +10,7 @@ mixin @beta Ector.Software.Buffer.Base extends Ector.Buffer
implements {
Ector.Buffer.flags { get; }
Ector.Buffer.pixels_set;
+ Ector.Buffer.pixels_get;
Ector.Buffer.map;
Ector.Buffer.unmap;
}
diff --git a/src/lib/ector/software/ector_software_surface.c b/src/lib/ector/software/ector_software_surface.c
index 40dbe67e69..ba64445ba3 100644
--- a/src/lib/ector/software/ector_software_surface.c
+++ b/src/lib/ector/software/ector_software_surface.c
@@ -239,6 +239,15 @@ _ector_software_surface_efl_object_destructor(Eo *obj, Ector_Software_Surface_Da
}
static void
+_ector_software_surface_ector_surface_reference_point_get(const Eo *obj EINA_UNUSED,
+ Ector_Software_Surface_Data *pd,
+ int* x, int* y)
+{
+ if (x) *x = pd->x;
+ if (y) *y = pd->y;
+}
+
+static void
_ector_software_surface_ector_surface_reference_point_set(Eo *obj EINA_UNUSED,
Ector_Software_Surface_Data *pd,
int x, int y)
diff --git a/src/lib/ector/software/ector_software_surface.eo b/src/lib/ector/software/ector_software_surface.eo
index 62126401b8..5836951f73 100644
--- a/src/lib/ector/software/ector_software_surface.eo
+++ b/src/lib/ector/software/ector_software_surface.eo
@@ -5,7 +5,7 @@ class @beta Ector.Software.Surface extends Ector.Software.Buffer implements Ecto
methods {}
implements {
Ector.Surface.renderer_factory_new;
- Ector.Surface.reference_point { set; }
+ Ector.Surface.reference_point { set; get; }
Ector.Surface.draw_image;
Efl.Object.destructor;
Efl.Object.constructor;
diff --git a/src/lib/evas/canvas/efl_canvas_vg_object.c b/src/lib/evas/canvas/efl_canvas_vg_object.c
index d0b3a242c1..8dea4e9b40 100644
--- a/src/lib/evas/canvas/efl_canvas_vg_object.c
+++ b/src/lib/evas/canvas/efl_canvas_vg_object.c
@@ -440,6 +440,15 @@ _evas_vg_render(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd,
memset(cd->blend.pixels, 0, cd->blend.length);
}
+ //For recovery context
+ int px, py, pw, ph, pstride;
+ void *ppixels;
+ ector_buffer_size_get(ector, &pw, &ph);
+ ector_buffer_pixels_get(ector, &ppixels, &px, &ph, &pstride);
+ Efl_Gfx_Colorspace pcspace = ector_buffer_cspace_get(ector);
+ ector_surface_reference_point_get(ector, &px, &py);
+ ERR("buffer = %p, %d %d %d %d, stride = %d, color = %d", ppixels, px,py, pw, ph, pstride, pcspace);
+
// Buffer change
ector_buffer_pixels_set(ector, cd->blend.pixels,
w, h, cd->blend.stride,
@@ -450,8 +459,9 @@ _evas_vg_render(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd,
EINA_LIST_FOREACH(cd->children, l, child)
_evas_vg_render(obj, pd, engine, output, context, child, clips, w, h, ector, do_async);
- // Re-set original surface
- ENFN->ector_begin(engine, output, context, ector, 0, 0, EINA_FALSE, do_async);
+ // Recover original surface
+ ector_buffer_pixels_set(ector, ppixels, pw, ph, pstride, pcspace, EINA_TRUE);
+ ector_surface_reference_point_set(ector, px, py);
// Draw buffer to original surface.(Ector_Surface)
ector_surface_draw_image(ector, cd->blend.buffer, 0, 0, alpha);
@@ -501,12 +511,10 @@ _render_to_buffer(Evas_Object_Protected_Data *obj, Efl_Canvas_Vg_Object_Data *pd
evas_common_draw_context_set_color(context, 255, 255, 255, 255);
//ector begin - end for drawing composite images.
- //ENFN->ector_begin(engine, buffer, context, ector, 0, 0, EINA_FALSE, EINA_FALSE);
_evas_vg_render_pre(obj, root, engine, buffer, context, ector, NULL, 255, NULL, 0);
- //ENFN->ector_end(engine, buffer, context, ector, EINA_FALSE);
//Actual content drawing
- ENFN->ector_begin(engine, buffer, context, ector, 0, 0, EINA_TRUE, do_async);
+ ENFN->ector_begin(engine, buffer, context, ector, 0, 0, do_async);
//draw on buffer
_evas_vg_render(obj, pd,
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index 391d816f96..20a04959f8 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1514,7 +1514,7 @@ struct _Evas_Func
void (*ector_destroy) (void *engine, Ector_Surface *surface);
Ector_Buffer *(*ector_buffer_wrap) (void *engine, Evas *e, void *engine_image);
Ector_Buffer *(*ector_buffer_new) (void *engine, Evas *e, int width, int height, Efl_Gfx_Colorspace cspace, Ector_Buffer_Flag flags);
- void (*ector_begin) (void *engine, void *output, void *context, Ector_Surface *ector, int x, int y, Eina_Bool clear, Eina_Bool do_async);
+ void (*ector_begin) (void *engine, void *output, void *context, Ector_Surface *ector, int x, int y, Eina_Bool do_async);
void (*ector_renderer_draw) (void *engine, void *output, void *context, Ector_Renderer *r, Eina_Array *clips, Eina_Bool do_async);
void (*ector_end) (void *engine, void *output, void *context, Ector_Surface *ector, Eina_Bool do_async);
diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c
index 2ca2d5b634..045323b680 100644
--- a/src/modules/evas/engines/gl_generic/evas_engine.c
+++ b/src/modules/evas/engines/gl_generic/evas_engine.c
@@ -2715,7 +2715,7 @@ eng_ector_surface_cache_drop(void *engine, void *key)
static void
eng_ector_begin(void *engine, void *surface,
void *context EINA_UNUSED, Ector_Surface *ector,
- int x, int y, Eina_Bool clear, Eina_Bool do_async EINA_UNUSED)
+ int x, int y, Eina_Bool do_async EINA_UNUSED)
{
if (use_gl)
{
@@ -2732,7 +2732,7 @@ eng_ector_begin(void *engine, void *surface,
eng_image_stride_get(engine, glim, &stride);
eng_image_size_get(engine, glim, &w, &h);
- if (clear) memset(pixels, 0, stride * h);
+ memset(pixels, 0, stride * h);
// it just uses the software backend to draw for now
ector_buffer_pixels_set(ector, pixels, w, h, stride, EFL_GFX_COLORSPACE_ARGB8888, EINA_TRUE);