aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2015-02-26 15:36:09 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2015-02-27 13:06:09 +0900
commitfab0d7f9d391fc4e85cbc021c3ea1a79323aa5bf (patch)
tree9d153b2a941a45dbce042a1d2d83b14577b79259
parentEvas masking: Add fast path for image-only masks in GL. (diff)
downloadefl-fab0d7f9d391fc4e85cbc021c3ea1a79323aa5bf.tar.gz
Evas masking: Simplify previous commit
Call object's function to get the private engine_data (here, the image object). Thanks Dongyeon for your patch which inspired me to do that instead of forcing pre_render.
-rw-r--r--src/lib/evas/canvas/evas_object_image.c21
-rw-r--r--src/lib/evas/canvas/evas_render.c13
-rw-r--r--src/lib/evas/include/evas_private.h2
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_context.c15
4 files changed, 15 insertions, 36 deletions
diff --git a/src/lib/evas/canvas/evas_object_image.c b/src/lib/evas/canvas/evas_object_image.c
index 2faf393578..63f777f04a 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -3541,18 +3541,6 @@ state_write:
}
}
-static inline void
-_image_mask_image_set(Evas_Object_Protected_Data *obj, Eina_Bool smooth, void *image)
-{
- if ((obj->mask->image != image) || (obj->mask->smooth_scale != smooth))
- {
- EINA_COW_WRITE_BEGIN(evas_object_mask_cow, obj->mask, Evas_Object_Mask_Data, mask)
- mask->image = image;
- mask->smooth_scale = smooth;
- EINA_COW_WRITE_END(evas_object_mask_cow, obj->mask, mask);
- }
-}
-
static void
evas_object_image_render_pre(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj,
@@ -3573,15 +3561,6 @@ evas_object_image_render_pre(Evas_Object *eo_obj,
if ((o->cur->fill.w < 1) || (o->cur->fill.h < 1)) return;
- /* plain mask images */
- if (obj->mask->is_mask && !o->cur->scene && !o->cur->source)
- {
- DBG("Setting image pointer in mask data.");
- _image_mask_image_set(obj, o->cur->smooth_scale, o->engine_data);
- }
- else
- _image_mask_image_set(obj, EINA_FALSE, NULL);
-
/* if someone is clipping this obj - go calculate the clipper */
if (obj->cur->clipper)
{
diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c
index 27c9ef9cc1..c0a9e17e7b 100644
--- a/src/lib/evas/canvas/evas_render.c
+++ b/src/lib/evas/canvas/evas_render.c
@@ -368,10 +368,7 @@ _evas_render_phase1_direct(Evas_Public_Data *e,
{
/* is image clipper */
if (_evas_render_object_changed_get(obj))
- {
- obj->func->render_pre(obj->object, obj, obj->private_data);
- _evas_mask_redraw_set(e, obj);
- }
+ _evas_mask_redraw_set(e, obj);
}
}
for (i = 0; i < render_objects->count; i++)
@@ -1827,13 +1824,15 @@ evas_render_mask_subrender(Evas_Public_Data *evas,
EINA_COW_WRITE_BEGIN(evas_object_mask_cow, mask->mask, Evas_Object_Mask_Data, mdata)
mdata->redraw = EINA_FALSE;
- if (is_image && !prev_mask && mdata->image && ENFN->image_scaled_update)
+ if (is_image && !prev_mask && mask->func->engine_data_get &&
+ ENFN->image_scaled_update)
{
/* Fast path (for GL) that avoids creating a map surface, render the
* scaled image in it, when the shaders can just scale on the fly. */
+ Eina_Bool smooth = evas_object_image_smooth_scale_get(mask->object);
+ void *original = mask->func->engine_data_get(mask->object);
void *scaled = ENFN->image_scaled_update
- (ENDT, mdata->surface, mdata->image, w, h,
- mdata->smooth_scale, EINA_TRUE, EVAS_COLORSPACE_GRY8);
+ (ENDT, mdata->surface, original, w, h, smooth, EINA_TRUE, EVAS_COLORSPACE_GRY8);
if (scaled)
{
done = EINA_TRUE;
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index f71d26e74e..e01eb38e83 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -911,12 +911,10 @@ struct _Evas_Object_3D_Data
struct _Evas_Object_Mask_Data
{
void *surface;
- void *image; // original image
int w, h;
Eina_Bool is_mask : 1;
Eina_Bool redraw : 1;
Eina_Bool is_alpha : 1;
- Eina_Bool smooth_scale : 1;
};
struct _Evas_Object_Protected_State
diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c b/src/modules/evas/engines/gl_common/evas_gl_context.c
index 04f248f92b..2c756db999 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_context.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_context.c
@@ -1586,7 +1586,8 @@ evas_gl_common_context_rectangle_push(Evas_Engine_GL_Context *gc,
int x, int y, int w, int h,
int r, int g, int b, int a,
Evas_GL_Texture *mtex,
- double mx, double my, double mw, double mh, Eina_Bool mask_smooth)
+ double mx, double my, double mw, double mh,
+ Eina_Bool mask_smooth)
{
Eina_Bool blend = EINA_FALSE;
Evas_GL_Shader shader = SHADER_RECT;
@@ -1632,6 +1633,7 @@ again:
gc->pipe[pn].array.use_texa = 0;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.use_texm = !!mtex;
+ gc->pipe[pn].array.mask_smooth = mask_smooth;
}
else
{
@@ -1646,6 +1648,7 @@ again:
&& (gc->pipe[i].shader.blend == blend)
&& (gc->pipe[i].shader.render_op == gc->dc->render_op)
&& (gc->pipe[i].shader.clip == 0)
+ // todo: save & compare mask_smooth
)
{
found = 1;
@@ -1684,6 +1687,7 @@ again:
gc->pipe[pn].array.use_texa = 0;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.use_texm = !!mtex;
+ gc->pipe[pn].array.mask_smooth = mask_smooth;
}
}
#else
@@ -1720,6 +1724,7 @@ again:
gc->pipe[pn].array.use_texa = 0;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.use_texm = !!mtex;
+ gc->pipe[pn].array.mask_smooth = mask_smooth;
#endif
pipe_region_expand(gc, pn, x, y, w, h);
@@ -3192,11 +3197,9 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
}
else if (gc->pipe[i].array.use_texa && (gc->pipe[i].region.type == RTYPE_MAP))
{
- /* FIXME:
- * This is a workaround as we hijack some tex ids
- * (namely tex_coordm, tex_coorda and tex_sample) for map masking.
- * These masking shaders should definitely use uniforms.
- */
+ /* For map masking, we (ab)use 3 texture vertex pointers
+ * (namely tex_coordm, tex_coorda and tex_sample).
+ * We could probably pack them into an array or something. */
glEnableVertexAttribArray(SHAD_TEXA);
glVertexAttribPointer(SHAD_TEXA, 2, GL_FLOAT, GL_FALSE, 0, (void *)texa_ptr);
}