add ability to dump engine coontents (if engine supports it). this means
authorraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 12 Apr 2010 08:23:53 +0000 (08:23 +0000)
committerraster <raster@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 12 Apr 2010 08:23:53 +0000 (08:23 +0000)
unload images it has loaded from disk, unload fonts, and more. dump dump dump!

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@47947 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

20 files changed:
src/lib/Evas.h
src/lib/cache/evas_cache.h
src/lib/cache/evas_cache_image.c
src/lib/canvas/evas_map.c
src/lib/canvas/evas_object_textblock.c
src/lib/canvas/evas_render.c
src/lib/engines/common/evas_font.h
src/lib/engines/common/evas_font_load.c
src/lib/engines/common/evas_font_main.c
src/lib/engines/common/evas_image.h
src/lib/engines/common/evas_image_main.c
src/lib/include/evas_private.h
src/modules/engines/gl_common/evas_gl_common.h
src/modules/engines/gl_common/evas_gl_image.c
src/modules/engines/gl_glew/evas_engine.c
src/modules/engines/gl_sdl/evas_engine.c
src/modules/engines/gl_x11/evas_engine.c
src/modules/engines/software_16/evas_engine.c
src/modules/engines/software_generic/evas_engine.c
src/modules/engines/xrender_x11/evas_engine.c

index dc943ad..8628b0e 100644 (file)
@@ -640,7 +640,7 @@ extern "C" {
    EAPI void              evas_render                       (Evas *e) EINA_ARG_NONNULL(1);
    EAPI void              evas_norender                     (Evas *e) EINA_ARG_NONNULL(1);
    EAPI void              evas_render_idle_flush            (Evas *e) EINA_ARG_NONNULL(1);
-
+   EAPI void              evas_render_dump                  (Evas *e) EINA_ARG_NONNULL(1);
 
 /**
  * @defgroup Evas_Output_Method Render Engine Functions
index eda4294..462d35a 100644 (file)
@@ -128,7 +128,9 @@ EAPI void                     evas_cache_image_set(Evas_Cache_Image *cache, int
 EAPI Image_Entry*             evas_cache_image_alone(Image_Entry *im);
 EAPI Image_Entry*             evas_cache_image_dirty(Image_Entry *im, int x, int y, int w, int h);
 EAPI void                     evas_cache_image_load_data(Image_Entry *im);
+EAPI void                     evas_cache_image_unload_data(Image_Entry *im);
 EAPI Eina_Bool                evas_cache_image_is_loaded(Image_Entry *im);
+EAPI void                     evas_cache_image_unload_all(Evas_Cache_Image *cache);
 EAPI void                     evas_cache_image_surface_alloc(Image_Entry *im, int w, int h);
 EAPI DATA32*                  evas_cache_image_pixels(Image_Entry *im);
 EAPI Image_Entry*             evas_cache_image_copied_data(Evas_Cache_Image *cache, int w, int h, DATA32 *image_data, int alpha, int cspace);
index 7c34c52..05deabb 100644 (file)
@@ -1179,13 +1179,56 @@ evas_cache_image_load_data(Image_Entry *im)
 #endif
 }
 
+EAPI void
+evas_cache_image_unload_data(Image_Entry *im)
+{
+   Evas_Cache_Image *cache;
+
+   assert(im);
+   assert(im->cache);
+   cache = im->cache;
+
+#ifdef BUILD_ASYNC_PRELOAD
+   LKL(im->lock);
+#endif
+   if ((!im->flags.loaded) || (!im->file) || 
+       (!im->info.module) || (im->flags.dirty))
+     {
+#ifdef BUILD_ASYNC_PRELOAD
+        LKU(im->lock);
+#endif
+       return;
+     }
+   cache->func.destructor(im);
+   
+#ifdef BUILD_ASYNC_PRELOAD
+   LKU(im->lock);
+#endif
+}
+
+static Eina_Bool
+_evas_cache_image_unload_cb(__UNUSED__ const Eina_Hash *hash, __UNUSED__ const void *key, void *data, __UNUSED__ void *fdata)
+{
+   evas_cache_image_unload_data(data);
+   return EINA_TRUE;
+}
+
+EAPI void
+evas_cache_image_unload_all(Evas_Cache_Image *cache)
+{
+   Image_Entry *im;
+
+   EINA_INLIST_FOREACH(cache->lru, im) evas_cache_image_unload_data(im);
+   EINA_INLIST_FOREACH(cache->lru_nodata, im) evas_cache_image_unload_data(im);
+   eina_hash_foreach(cache->activ, _evas_cache_image_unload_cb, NULL);
+   eina_hash_foreach(cache->inactiv, _evas_cache_image_unload_cb, NULL);
+}
+
 EAPI Eina_Bool
 evas_cache_image_is_loaded(Image_Entry *im)
 {
   assert(im); 
-
-  if (im->flags.loaded)
-    return EINA_TRUE;
+  if (im->flags.loaded) return EINA_TRUE;
   return EINA_FALSE;
 }
 
index c922dfb..54cbd3d 100644 (file)
@@ -111,8 +111,14 @@ _evas_map_dup(const Evas_Map *orig)
 }
 
 static inline void
-_evas_map_free(Evas_Map *m)
+_evas_map_free(Evas_Object *obj, Evas_Map *m)
 {
+   if (obj)
+     {
+        if (m->surface)
+          obj->layer->evas->engine.func->image_map_surface_free
+          (obj->layer->evas->engine.data.output, m->surface);
+     }
    free(m);
 }
 
@@ -417,11 +423,11 @@ evas_object_map_set(Evas_Object *obj, const Evas_Map *map)
              obj->prev.geometry = obj->cur.map->normal_geometry;
              if (!obj->prev.map)
                {
-                 _evas_map_free(obj->cur.map);
+                 _evas_map_free(obj, obj->cur.map);
                   obj->cur.map = NULL;
                   return;
                }
-             _evas_map_free(obj->cur.map);
+             _evas_map_free(obj, obj->cur.map);
              obj->cur.map = NULL;
              if (!obj->cur.usemap) _evas_map_calc_geom_change(obj);
              else _evas_map_calc_map_geometry(obj);
@@ -593,7 +599,7 @@ EAPI void
 evas_map_free(Evas_Map *m)
 {
    if (!m) return;
-   _evas_map_free(m);
+   _evas_map_free(NULL, m);
 }
 
 /**
index ee29301..bc982ad 100644 (file)
@@ -96,6 +96,8 @@ struct _Evas_Object_Textblock_Format
    int                  tabstops;
    int                  linesize;
    double               linerelsize;
+   int                  linegap;
+   double               linerelgap;
    unsigned char        style;
    unsigned char        wrap_word : 1;
    unsigned char        wrap_char : 1;
@@ -778,6 +780,8 @@ static const char *stylestr = NULL;
 static const char *tabstopsstr = NULL;
 static const char *linesizestr = NULL;
 static const char *linerelsizestr = NULL;
+static const char *linegap = NULL;
+static const char *linerelgap = NULL;
 
 static void
 _format_command_init(void)
@@ -808,6 +812,8 @@ _format_command_init(void)
    tabstopsstr = eina_stringshare_add("tabstops");
    linesizestr = eina_stringshare_add("linesize");
    linerelsizestr = eina_stringshare_add("linerelsize");
+   linegap = eina_stringshare_add("linegap");
+   linerelgap = eina_stringshare_add("linerelgap");
 }
 
 static void
@@ -839,6 +845,8 @@ _format_command_shutdown(void)
    eina_stringshare_del(tabstopsstr);
    eina_stringshare_del(linesizestr);
    eina_stringshare_del(linerelsizestr);
+   eina_stringshare_del(linegap);
+   eina_stringshare_del(linerelgap);
 }
 
 static void
@@ -1114,6 +1122,27 @@ _format_command(Evas_Object *obj, Evas_Object_Textblock_Format *fmt, const char
               }
           }
      }
+   else if (cmd == linegap)
+     {
+        fmt->linegap = atoi(tmp_param);
+        fmt->linerelgap = 0.0;
+     }
+   else if (cmd == linerelgap)
+     {
+       char *endptr = NULL;
+       double val = strtod(tmp_param, &endptr);
+       if (endptr)
+         {
+            while (*endptr && _is_white(*endptr))
+              endptr++;
+            if (*endptr == '%')
+              {
+                 fmt->linerelgap = val / 100.0;
+                 fmt->linegap = 0;
+                 if (fmt->linerelgap < 0.0) fmt->linerelgap = 0.0;
+              }
+          }
+     }
 
    if (new_font)
      {
@@ -1313,6 +1342,8 @@ _layout_format_ascent_descent_adjust(Ctxt *c, Evas_Object_Textblock_Format *fmt)
              descent = ((ascent + descent) * fmt->linerelsize) - (ascent * fmt->linerelsize);
              ascent = ascent * fmt->linerelsize;
           }
+        c->maxdescent += fmt->linegap;
+        c->maxdescent += ((ascent + descent) * fmt->linerelgap);
        if (c->maxascent < ascent) c->maxascent = ascent;
        if (c->maxdescent < descent) c->maxdescent = descent;
      }
@@ -1351,6 +1382,8 @@ _layout_format_push(Ctxt *c, Evas_Object_Textblock_Format *fmt)
        fmt->tabstops = 32;
         fmt->linesize = 0;
         fmt->linerelsize = 0.0;
+        fmt->linegap = 0;
+        fmt->linerelgap = 0.0;
      }
    return fmt;
 }
index e8b9b87..926e34b 100644 (file)
@@ -1249,11 +1249,13 @@ evas_norender(Evas *e)
 }
 
 /**
- * Make the canvas discard internally cached data used for renderization
+ * Make the canvas discard internally cached data used for rendering.
  *
  * @param e The given canvas pointer.
  *
  * This function flushes the arrays of delete, active and render objects.
+ * Other things it may also discard are: shared memory segments,
+ * temporary scratch buffers, cached data to avoid re-compute of that data etc.
  *
  * @ingroup Evas_Canvas
  */
@@ -1279,6 +1281,60 @@ evas_render_idle_flush(Evas *e)
    e->invalidate = 1;
 }
 
+/**
+ * Make the canvas discard as much data as possible used by the engine at
+ * runtime.
+ *
+ * @param e The given canvas pointer.
+ *
+ * This function will unload images, delete textures and much more, where
+ * possible. You may also want to call evas_render_idle_flush() immediately
+ * prior to this to perhaps discard a little more, though evas_render_dump()
+ * should implicitly delete most of what evas_render_idle_flush() might
+ * discard too.
+ *
+ * @ingroup Evas_Canvas
+ */
+static void
+_evas_render_dump_map_surfaces(Evas_Object *obj)
+{
+   if ((obj->cur.map) && obj->cur.map->surface)
+     {
+        obj->layer->evas->engine.func->image_map_surface_free
+          (obj->layer->evas->engine.data.output, obj->cur.map->surface);
+        obj->cur.map->surface = NULL;
+     }
+   
+   if (obj->smart.smart)
+     {
+        Evas_Object *obj2;
+        
+        EINA_INLIST_FOREACH(evas_object_smart_members_get_direct(obj), obj2)
+          _evas_render_dump_map_surfaces(obj2);
+     }
+}
+
+EAPI void
+evas_render_dump(Evas *e)
+{
+   Evas_Layer *lay;
+   
+   MAGIC_CHECK(e, Evas, MAGIC_EVAS);
+   return;
+   MAGIC_CHECK_END();
+
+   EINA_INLIST_FOREACH(e->layers, lay)
+     {
+        Evas_Object *obj;
+
+        EINA_INLIST_FOREACH(lay->objects, obj)
+          _evas_render_dump_map_surfaces(obj);
+     }
+   if ((e->engine.func) && (e->engine.func->output_dump) &&
+       (e->engine.data.output))
+     e->engine.func->output_dump(e->engine.data.output);
+}
+
 void
 evas_render_invalidate(Evas *e)
 {
index 1e15d2a..e776fe4 100644 (file)
@@ -10,7 +10,8 @@
 
 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);
index 15889f4..4e7e5c4 100644 (file)
@@ -17,8 +17,9 @@ static Eina_Hash * fonts_src = NULL;
 static Eina_Hash * fonts = NULL;
 static Eina_List * fonts_lru = NULL;
 
-static Eina_Bool font_modify_cache_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
-static Eina_Bool font_flush_free_glyph_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
+//static Eina_Bool font_modify_cache_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
+//static Eina_Bool font_flush_free_glyph_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata);
+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__,
@@ -51,8 +52,7 @@ _evas_common_font_source_free(RGBA_Font_Source *fs)
    if (fs->name) eina_stringshare_del(fs->name);
    free(fs);
 }
-
-
+/*
 static Eina_Bool
 font_flush_free_glyph_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
@@ -60,7 +60,7 @@ font_flush_free_glyph_cb(const Eina_Hash *hash, const void *key, void *data, voi
 
    fg = data;
    FT_Done_Glyph(fg->glyph);
-   /* extension calls */
+   // extension calls
    if (fg->ext_dat_free) fg->ext_dat_free(fg->ext_dat);
    free(fg);
    return 1;
@@ -68,7 +68,7 @@ font_flush_free_glyph_cb(const Eina_Hash *hash, const void *key, void *data, voi
    key = 0;
    fdata = 0;
 }
-
+*/
 static void
 _evas_common_font_int_free(RGBA_Font_Int *fi)
 {
@@ -76,10 +76,11 @@ _evas_common_font_int_free(RGBA_Font_Int *fi)
 
    evas_common_font_int_modify_cache_by(fi, -1);
 
+   _evas_common_font_int_clear(fi);
 //   eina_hash_foreach(fi->glyphs, font_flush_free_glyph_cb, NULL);
 //   eina_hash_free(fi->glyphs);
 
-  eina_hash_free(fi->kerning);
+   eina_hash_free(fi->kerning);
 //   eina_hash_free(fi->indexes);
 
 #ifdef HAVE_PTHREAD
@@ -90,7 +91,7 @@ _evas_common_font_int_free(RGBA_Font_Int *fi)
 
    if (fi->references == 0)
      fonts_lru = eina_list_remove(fonts_lru, fi);
-
+   
    if (fi->fash) fi->fash->freeme(fi->fash);
    free(fi);
 }
@@ -651,6 +652,59 @@ evas_common_font_memory_hinting_add(RGBA_Font *fn, const char *name, int size, c
    return fn;
 }
 
+static void
+_evas_common_font_int_clear(RGBA_Font_Int *fi)
+{
+   int i, j;
+   
+   LKL(fi->ft_mutex);
+   if (!fi->fash)
+     {
+        LKU(fi->ft_mutex);
+        return;
+     }
+   
+   evas_common_font_int_modify_cache_by(fi, -1);
+   
+   for (j = 0; j <= 0xff; j++) // fixme: to do > 65k
+     {
+        Fash_Glyph_Map *fmap = fi->fash->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;
+   LKU(fi->ft_mutex);
+}
+
+static Eina_Bool
+_evas_common_font_all_clear_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+{
+   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);
+}
+
+/*
 static Eina_Bool
 font_modify_cache_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
 {
@@ -661,12 +715,12 @@ font_modify_cache_cb(const Eina_Hash *hash, const void *key, void *data, void *f
    dir = fdata;
    font_cache_usage += (*dir) *
      ((fg->glyph_out->bitmap.width * fg->glyph_out->bitmap.rows) +
-      sizeof(RGBA_Font_Glyph) + sizeof(Eina_List) + 400); /* fudge values */
+      sizeof(RGBA_Font_Glyph) + sizeof(Eina_List) + 400); // fudge values
    return 1;
    hash = 0;
    key = 0;
 }
-
+*/
 /* 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
@@ -675,7 +729,28 @@ EAPI void
 evas_common_font_int_modify_cache_by(RGBA_Font_Int *fi, int dir)
 {
    int sz_hash = 0;
-
+   int i, j;
+   
+   if (fi->fash)
+     {
+        for (j = 0; j <= 0xff; j++) // fixme: to do > 65k
+          {
+             Fash_Glyph_Map *fmap = fi->fash->bucket[j];
+             if (fmap)
+               {
+                  for (i = 0; i <= 0xff; i++)
+                    {
+                       RGBA_Font_Glyph *fg = fmap->item[i];
+                       if ((fg) && (fg != (void *)(-1)))
+                         sz_hash += 
+                         sizeof(RGBA_Font_Glyph) + sizeof(Eina_List) + 
+                         (fg->glyph_out->bitmap.width * 
+                          fg->glyph_out->bitmap.rows) + 
+                         400;
+                    }
+               }
+          }
+     }
 //   if (fi->glyphs) sz_hash = eina_hash_population(fi->glyphs);
 //   eina_hash_foreach(fi->glyphs, font_modify_cache_cb, &dir);
    font_cache_usage += dir * (sizeof(RGBA_Font) + sz_hash +
index 0638d51..26570c9 100644 (file)
@@ -39,6 +39,12 @@ evas_common_font_shutdown(void)
    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)
 {
index c8b75cf..24e52b6 100644 (file)
@@ -5,6 +5,8 @@
 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);
index 3fc6367..0b580ba 100644 (file)
@@ -125,6 +125,13 @@ evas_common_image_shutdown(void)
    evas_common_scalecache_shutdown();
 }
 
+EAPI void
+evas_common_image_image_all_unload(void)
+{
+   evas_common_rgba_image_scalecache_flush();
+   evas_cache_image_unload_all(eci);
+}
+
 static Image_Entry *
 _evas_common_rgba_image_new(void)
 {
@@ -174,10 +181,12 @@ evas_common_rgba_image_unload(Image_Entry *ie)
    RGBA_Image   *im = (RGBA_Image *) ie;
 
    evas_cache_image_preload_cancel(ie, NULL);
-   
+
    if (!ie->flags.loaded) return;
    if ((!ie->info.module) && (!ie->data1)) return;
    if (!ie->file) return;
+   
+   evas_common_rgba_image_scalecache_dirty(ie);
 
    ie->flags.loaded = 0;
 
@@ -274,8 +283,9 @@ _evas_common_rgba_image_surface_delete(Image_Entry *ie)
 }
 
 static void
-_evas_common_rgba_image_unload(Image_Entry* im __UNUSED__)
+_evas_common_rgba_image_unload(Image_Entry *im)
 {
+   evas_common_rgba_image_unload(im);
 }
 
 static void
index 934258d..f0478c7 100644 (file)
@@ -581,6 +581,7 @@ struct _Evas_Func
    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_idle_flush)               (void *data);
+   void (*output_dump)                     (void *data);
 
    void *(*context_new)                    (void *data);
    Eina_Bool (*canvas_alpha_get)           (void *data, void *context);
index ce4fc1c..f268d94 100644 (file)
@@ -338,6 +338,8 @@ void              evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA
 Evas_GL_Texture  *evas_gl_common_texture_yuv_new(Evas_GL_Context *gc, DATA8 **rows, int w, int h);
 void              evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, int w, int h);
 
+void              evas_gl_common_image_all_unload(Evas_GL_Context *gc);
+
 Evas_GL_Image    *evas_gl_common_image_load(Evas_GL_Context *gc, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error);
 Evas_GL_Image    *evas_gl_common_image_new_from_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace);
 Evas_GL_Image    *evas_gl_common_image_new_from_copied_data(Evas_GL_Context *gc, int w, int h, DATA32 *data, int alpha, int cspace);
index 6dad8ba..b1ec6f1 100644 (file)
@@ -1,5 +1,19 @@
 #include "evas_gl_private.h"
 
+void
+evas_gl_common_image_all_unload(Evas_GL_Context *gc)
+{
+   Eina_List *l;
+   Evas_GL_Image *im;
+   
+   EINA_LIST_FOREACH(gc->shared->images, l, im)
+     {
+        if (im->im) evas_cache_image_unload_data(&im->im->cache_entry);
+        if (im->tex) evas_gl_common_texture_free(im->tex);
+        im->tex = NULL;
+     }
+}
+
 Evas_GL_Image *
 evas_gl_common_image_load(Evas_GL_Context *gc, const char *file, const char *key, Evas_Image_Load_Opts *lo, int *error)
 {
@@ -330,11 +344,18 @@ _evas_gl_common_image_update(Evas_GL_Context *gc, Evas_GL_Image *im)
    switch (im->cs.space)
      {
       case EVAS_COLORSPACE_ARGB8888:
-        evas_cache_image_load_data(&im->im->cache_entry);
        if ((im->tex) && (im->dirty))
-          evas_gl_common_texture_update(im->tex, im->im);
+          {
+             evas_cache_image_load_data(&im->im->cache_entry);
+             evas_gl_common_texture_update(im->tex, im->im);
+             evas_cache_image_unload_data(&im->im->cache_entry);
+          }
        if (!im->tex)
-         im->tex = evas_gl_common_texture_new(gc, im->im);
+          {
+             evas_cache_image_load_data(&im->im->cache_entry);
+             im->tex = evas_gl_common_texture_new(gc, im->im);
+             evas_cache_image_unload_data(&im->im->cache_entry);
+          }
         im->dirty = 0;
         if (!im->tex) return;
        break;
index ebc24c8..1fabf66 100644 (file)
@@ -259,6 +259,17 @@ eng_output_idle_flush(void *data __UNUSED__)
 }
 
 static void
+eng_output_dump(void *data __UNUSED__)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   evas_gl_common_image_all_unload(re->window->gl_context);
+}
+
+static void
 eng_context_cutout_add(void *data __UNUSED__, void *context, int x, int y, int w, int h)
 {
    evas_common_draw_context_add_cutout(context, x, y, w, h);
@@ -1042,6 +1053,7 @@ module_open(Evas_Module *em)
    ORD(context_cutout_clear);
    ORD(output_flush);
    ORD(output_idle_flush);
+   ORD(output_dump);
    ORD(rectangle_draw);
    ORD(line_draw);
    ORD(polygon_point_add);
index c9e8088..bfbb120 100644 (file)
@@ -254,9 +254,20 @@ eng_output_flush(void *data)
 static void
 eng_output_idle_flush(void *data)
 {
-//   Render_Engine *re;
-//
-//   re = (Render_Engine *)data;
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_dump(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   evas_gl_common_image_all_unload(re->gl_context);
 }
 
 static void
@@ -1230,6 +1241,7 @@ module_open(Evas_Module *em)
    ORD(context_cutout_clear);
    ORD(output_flush);
    ORD(output_idle_flush);
+   ORD(output_dump);
    ORD(rectangle_draw);
    ORD(line_draw);
    ORD(polygon_point_add);
index 96210a6..9e6504f 100644 (file)
@@ -551,9 +551,20 @@ eng_output_flush(void *data)
 static void
 eng_output_idle_flush(void *data)
 {
-//   Render_Engine *re;
-//
-//   re = (Render_Engine *)data;
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+}
+
+static void
+eng_output_dump(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   evas_gl_common_image_all_unload(re->win->gl_context);
 }
 
 static void
@@ -1903,6 +1914,7 @@ module_open(Evas_Module *em)
    ORD(context_cutout_clear);
    ORD(output_flush);
    ORD(output_idle_flush);
+   ORD(output_dump);
    ORD(rectangle_draw);
    ORD(line_draw);
    ORD(polygon_point_add);
index 3f6cf3c..64c354a 100644 (file)
@@ -38,6 +38,13 @@ int _evas_soft16_log_dom = -1;
   WRN("NOT_IMPLEMENTED: %s() at %s:%d",                                \
            __FUNCTION__, __FILE__, __LINE__)
 
+static void
+eng_output_dump(void *data __UNUSED__)
+{
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+}
+
 static void *
 eng_context_new(void *data __UNUSED__)
 {
@@ -883,6 +890,7 @@ static Evas_Func func =
      NULL,
      NULL,
      NULL,
+     eng_output_dump,
      /* draw context virtual methods */
      eng_context_new,
      eng_canvas_alpha_get,
index c9c5345..fa4ce00 100644 (file)
  */
 static int cpunum = 0;
 static int _evas_soft_gen_log_dom = -1;
+
+static void
+eng_output_dump(void *data __UNUSED__)
+{
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+}
+
 static void *
 eng_context_new(void *data __UNUSED__)
 {
@@ -1057,6 +1065,7 @@ static Evas_Func func =
      NULL,
      NULL,
      NULL,
+     eng_output_dump,
      /* draw context virtual methods */
      eng_context_new,
      eng_canvas_alpha_get,
index 4cc1a55..59ce748 100644 (file)
@@ -687,6 +687,17 @@ eng_output_idle_flush(void *data)
 }
 
 static void
+eng_output_dump(void *data)
+{
+   Render_Engine *re;
+
+   re = (Render_Engine *)data;
+   evas_common_image_image_all_unload();
+   evas_common_font_font_all_unload();
+   // FIXME: kill pixmaps too - but... xrender engine is dead... no? :):)
+}
+
+static void
 eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h)
 {
    Render_Engine *re;
@@ -1485,6 +1496,7 @@ module_open(Evas_Module *em)
    ORD(output_redraws_next_update_push);
    ORD(output_flush);
    ORD(output_idle_flush);
+   ORD(output_dump);
    ORD(rectangle_draw);
    ORD(line_draw);
    ORD(polygon_draw);