+static void
+_preloaded(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event __UNUSED__)
+{
+ Smart_Data *sd = data;
+
+ sd->preloading = EINA_FALSE;
+ if (obj == sd->obj)
+ {
+ if (sd->show)
+ evas_object_show(sd->obj);
+ }
+ if (sd->prev) evas_object_del(sd->prev);
+ sd->prev = NULL;
+}
+
+static void
+_els_smart_icon_file_helper(Evas_Object *obj)
+{
+ Smart_Data *sd;
+ Evas_Object *pclip;
+
+ sd = evas_object_smart_data_get(obj);
+ /* smart code here */
+ /* NOTE: Do not merge upstream for the if (sd->edje) { } statements
+ But wonder whether the edje resource icons have no problem. */
+ if (!sd->edje) goto out;
+
+ if (sd->prev) evas_object_del(sd->prev);
+ pclip = evas_object_clip_get(sd->obj);
+ if (sd->obj) sd->prev = sd->obj;
+ sd->obj = evas_object_image_add(evas_object_evas_get(obj));
+ evas_object_image_load_orientation_set(sd->obj, EINA_TRUE);
+ evas_object_event_callback_add(sd->obj, EVAS_CALLBACK_IMAGE_PRELOADED,
+ _preloaded, sd);
+ evas_object_smart_member_add(sd->obj, obj);
+ if (sd->prev) evas_object_smart_member_add(sd->prev, obj);
+ evas_object_image_scale_hint_set(sd->obj, EVAS_IMAGE_SCALE_HINT_STATIC);
+ evas_object_clip_set(sd->obj, pclip);
+
+ sd->edje = EINA_FALSE;
+out:
+
+ if (!sd->size)
+ evas_object_image_load_size_set(sd->obj, sd->size, sd->size);
+}
+
+Eina_Bool
+_els_smart_icon_memfile_set(Evas_Object *obj, const void *img, size_t size, const char *format, const char *key)
+{
+ Smart_Data *sd;
+
+ sd = evas_object_smart_data_get(obj);
+ if (!sd) return EINA_FALSE;
+ _els_smart_icon_file_helper(obj);
+
+ evas_object_image_memfile_set(sd->obj, (void*)img, size, (char*)format, (char*)key);
+ sd->preloading = EINA_TRUE;
+ sd->show = EINA_TRUE;
+ evas_object_hide(sd->obj);
+ evas_object_image_preload(sd->obj, EINA_FALSE);
+ if (evas_object_image_load_error_get(sd->obj) != EVAS_LOAD_ERROR_NONE)
+ {
+ ERR("Things are going bad for some random " FMT_SIZE_T " byte chunk of memory (%p)", size, sd->obj);
+ return EINA_FALSE;
+ }
+ _smart_reconfigure(sd);
+ return EINA_TRUE;
+}
+