cedric pushed a commit to branch master.
commit dce0fbcb848404b3f42fa23ff3979aaca6663132
Author: Cedric Bail <[email protected]>
Date: Mon Jul 15 19:11:06 2013 +0900
evas: let's get the pixels if the image is dirty, not only when we do
already have pixels.
---
src/lib/evas/canvas/evas_object_image.c | 165 +++++++++++++++++---------------
1 file changed, 86 insertions(+), 79 deletions(-)
diff --git a/src/lib/evas/canvas/evas_object_image.c
b/src/lib/evas/canvas/evas_object_image.c
index 627e6c5..84af7b1 100644
--- a/src/lib/evas/canvas/evas_object_image.c
+++ b/src/lib/evas/canvas/evas_object_image.c
@@ -3760,6 +3760,84 @@
evas_draw_image_map_async_check(Evas_Object_Protected_Data *obj,
}
}
+static void *
+evas_process_dirty_pixels(Evas_Object *eo_obj, Evas_Object_Protected_Data
*obj, Evas_Object_Image *o,
+ void *output, void *pixels)
+{
+ int direct_override = 0;
+ int direct_force_off = 0;
+
+ if (o->dirty_pixels)
+ {
+ if (o->pixels->func.get_pixels)
+ {
+ if (obj->layer->evas->engine.func->image_native_get)
+ {
+ Evas_Native_Surface *ns;
+ ns =
obj->layer->evas->engine.func->image_native_get(obj->layer->evas->engine.data.output,
o->engine_data);
+ if ( (ns) &&
+ (ns->type == EVAS_NATIVE_SURFACE_OPENGL) &&
+ (ns->data.opengl.texture_id) &&
+ (!ns->data.opengl.framebuffer_id) )
+ {
+ // Check if we can do direct rendering...
+ if
(obj->layer->evas->engine.func->gl_direct_override_get)
+
obj->layer->evas->engine.func->gl_direct_override_get(output, &direct_override,
&direct_force_off);
+ if ( (((obj->cur->geometry.w == o->cur->image.w) &&
+ (obj->cur->geometry.h == o->cur->image.h) &&
+ (obj->cur->color.r == 255) &&
+ (obj->cur->color.g == 255) &&
+ (obj->cur->color.b == 255) &&
+ (obj->cur->color.a == 255) &&
+ (!obj->map->cur.map) &&
+ (!o->cur->has_alpha)) ||
+ (direct_override)) &&
+ (!direct_force_off) )
+ {
+
+ if
(obj->layer->evas->engine.func->gl_get_pixels_set)
+ {
+
obj->layer->evas->engine.func->gl_get_pixels_set(output,
o->pixels->func.get_pixels, o->pixels->func.get_pixels_data, eo_obj);
+ }
+
+ o->direct_render = EINA_TRUE;
+ }
+ else
+ o->direct_render = EINA_FALSE;
+
+ }
+
+ if ( (ns) &&
+ (ns->type == EVAS_NATIVE_SURFACE_X11))
+ {
+ if (obj->layer->evas->engine.func->context_flush)
+ obj->layer->evas->engine.func->context_flush(output);
+ }
+ }
+
+ if (!o->direct_render)
+ o->pixels->func.get_pixels(o->pixels->func.get_pixels_data,
eo_obj);
+
+ o->engine_data = obj->layer->evas->engine.func->image_dirty_region
+ (obj->layer->evas->engine.data.output, o->engine_data,
+ 0, 0, o->cur->image.w, o->cur->image.h);
+ if (o->engine_data != pixels)
+ pixels = o->engine_data;
+ }
+ o->dirty_pixels = EINA_FALSE;
+ }
+ else
+ {
+ // Check if the it's not dirty but it has direct rendering
+ if (o->direct_render)
+ {
+ obj->layer->evas->engine.func->gl_get_pixels_set(output,
o->pixels->func.get_pixels, o->pixels->func.get_pixels_data, eo_obj);
+ }
+ }
+
+ return pixels;
+}
+
static void
evas_object_image_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj,
void *type_private_data,
void *output, void *context, void *surface, int x, int
y, Eina_Bool do_async)
@@ -3824,13 +3902,20 @@ evas_object_image_render(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj, v
obj->layer->evas->engine.func->context_render_op_set(output, context,
obj->cur->render_op);
+ // Clear out the pixel get stuff..
+ if (obj->layer->evas->engine.func->gl_get_pixels_set)
+ {
+ obj->layer->evas->engine.func->gl_get_pixels_set(output, NULL, NULL,
NULL);
+ }
+
Evas_Object_Protected_Data *source =
(o->cur->source ?
eo_data_scope_get(o->cur->source, EVAS_OBJ_CLASS):
NULL);
if (!o->cur->source)
{
- pixels = o->engine_data;
+ pixels = evas_process_dirty_pixels(eo_obj, obj, o, output,
o->engine_data);
+ /* pixels = o->engine_data; */
imagew = o->cur->image.w;
imageh = o->cur->image.h;
uvw = imagew;
@@ -3868,88 +3953,10 @@ evas_object_image_render(Evas_Object *eo_obj,
Evas_Object_Protected_Data *obj, v
o->proxyrendering = EINA_FALSE;
}
- // Clear out the pixel get stuff..
- if (obj->layer->evas->engine.func->gl_get_pixels_set)
- {
- obj->layer->evas->engine.func->gl_get_pixels_set(output, NULL, NULL,
NULL);
- }
-
if (pixels)
{
Evas_Coord idw, idh, idx, idy;
int ix, iy, iw, ih;
- int direct_override = 0;
- int direct_force_off = 0;
-
- if (o->dirty_pixels)
- {
- if (o->pixels->func.get_pixels)
- {
-
- if (obj->layer->evas->engine.func->image_native_get)
- {
- Evas_Native_Surface *ns;
- ns =
obj->layer->evas->engine.func->image_native_get(obj->layer->evas->engine.data.output,
o->engine_data);
- if ( (ns) &&
- (ns->type == EVAS_NATIVE_SURFACE_OPENGL) &&
- (ns->data.opengl.texture_id) &&
- (!ns->data.opengl.framebuffer_id) )
- {
-
- // Check if we can do direct rendering...
- if
(obj->layer->evas->engine.func->gl_direct_override_get)
-
obj->layer->evas->engine.func->gl_direct_override_get(output, &direct_override,
&direct_force_off);
- if ( (((obj->cur->geometry.w == o->cur->image.w) &&
- (obj->cur->geometry.h == o->cur->image.h) &&
- (obj->cur->color.r == 255) &&
- (obj->cur->color.g == 255) &&
- (obj->cur->color.b == 255) &&
- (obj->cur->color.a == 255) &&
- (!obj->map->cur.map) &&
- (!o->cur->has_alpha)) ||
- (direct_override)) &&
- (!direct_force_off) )
- {
-
- if
(obj->layer->evas->engine.func->gl_get_pixels_set)
- {
-
obj->layer->evas->engine.func->gl_get_pixels_set(output,
o->pixels->func.get_pixels, o->pixels->func.get_pixels_data, eo_obj);
- }
-
- o->direct_render = EINA_TRUE;
- }
- else
- o->direct_render = EINA_FALSE;
-
- }
-
- if ( (ns) &&
- (ns->type == EVAS_NATIVE_SURFACE_X11))
- {
- if (obj->layer->evas->engine.func->context_flush)
-
obj->layer->evas->engine.func->context_flush(output);
- }
- }
-
- if (!o->direct_render)
-
o->pixels->func.get_pixels(o->pixels->func.get_pixels_data, eo_obj);
-
- if (o->engine_data != pixels)
- pixels = o->engine_data;
- o->engine_data =
obj->layer->evas->engine.func->image_dirty_region
- (obj->layer->evas->engine.data.output, o->engine_data,
- 0, 0, o->cur->image.w, o->cur->image.h);
- }
- o->dirty_pixels = EINA_FALSE;
- }
- else
- {
- // Check if the it's not dirty but it has direct rendering
- if (o->direct_render)
- {
- obj->layer->evas->engine.func->gl_get_pixels_set(output,
o->pixels->func.get_pixels, o->pixels->func.get_pixels_data, eo_obj);
- }
- }
if ((obj->map->cur.map) && (obj->map->cur.map->count > 3) &&
(obj->map->cur.usemap))
{
--
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk