Revert "FIXME: this can be rather slow and blocks until the size is known"
[geeqie.git] / src / image-load.cc
index 247ffc5..03582d1 100644 (file)
@@ -88,7 +88,7 @@ GType image_loader_get_type(void)
                        (GInstanceInitFunc)image_loader_init, /* instance_init */
                        NULL    /* value_table */
                        };
-               type = g_type_register_static(G_TYPE_OBJECT, "ImageLoaderType", &info, 0);
+               type = g_type_register_static(G_TYPE_OBJECT, "ImageLoaderType", &info, GTypeFlags(0));
                }
        return type;
 }
@@ -131,7 +131,7 @@ static void image_loader_init(GTypeInstance *instance, gpointer UNUSED(g_class))
 
 static void image_loader_class_init_wrapper(void *data, void *UNUSED(user_data))
 {
-       image_loader_class_init(data);
+       image_loader_class_init(static_cast<ImageLoaderClass *>(data));
 }
 
 static void image_loader_class_init(ImageLoaderClass *loader_class)
@@ -280,7 +280,7 @@ struct _ImageLoaderAreaParam {
 
 static gboolean image_loader_emit_area_ready_cb(gpointer data)
 {
-       ImageLoaderAreaParam *par = data;
+       ImageLoaderAreaParam *par = static_cast<ImageLoaderAreaParam *>(data);
        ImageLoader *il = par->il;
        guint x, y, w, h;
        g_mutex_lock(il->data_mutex);
@@ -299,21 +299,21 @@ static gboolean image_loader_emit_area_ready_cb(gpointer data)
 
 static gboolean image_loader_emit_done_cb(gpointer data)
 {
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
        g_signal_emit(il, signals[SIGNAL_DONE], 0);
        return FALSE;
 }
 
 static gboolean image_loader_emit_error_cb(gpointer data)
 {
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
        g_signal_emit(il, signals[SIGNAL_ERROR], 0);
        return FALSE;
 }
 
 static gboolean image_loader_emit_percent_cb(gpointer data)
 {
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
        g_signal_emit(il, signals[SIGNAL_PERCENT], 0, image_loader_get_percent(il));
        return FALSE;
 }
@@ -321,7 +321,7 @@ static gboolean image_loader_emit_percent_cb(gpointer data)
 static gboolean image_loader_emit_size_cb(gpointer data)
 {
        gint width, height;
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
        g_mutex_lock(il->data_mutex);
        width = il->actual_width;
        height = il->actual_height;
@@ -359,7 +359,7 @@ static ImageLoaderAreaParam *image_loader_queue_area_ready(ImageLoader *il, GLis
 {
        if (*list)
                {
-               ImageLoaderAreaParam *prev_par = (*list)->data;
+               ImageLoaderAreaParam *prev_par = static_cast<ImageLoaderAreaParam *>((*list)->data);
                if (prev_par->x == x && prev_par->w == w &&
                    prev_par->y + prev_par->h == y)
                        {
@@ -475,7 +475,7 @@ static void image_loader_area_updated_cb(gpointer UNUSED(loader),
                                 guint x, guint y, guint w, guint h,
                                 gpointer data)
 {
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
 
        if (!image_loader_get_pixbuf(il))
                {
@@ -499,7 +499,7 @@ static void image_loader_area_updated_cb(gpointer UNUSED(loader),
 
 static void image_loader_area_prepared_cb(gpointer loader, gpointer data)
 {
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
        GdkPixbuf *pb;
        guchar *pix;
        size_t h, rs;
@@ -531,7 +531,7 @@ static void image_loader_area_prepared_cb(gpointer loader, gpointer data)
 static void image_loader_size_cb(gpointer loader,
                                 gint width, gint height, gpointer data)
 {
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
        gchar **mime_types;
        gboolean scale = FALSE;
        gint n;
@@ -771,7 +771,7 @@ static void image_loader_setup_loader(ImageLoader *il)
        else
                image_loader_backend_set_default(&il->backend);
 
-       il->loader = il->backend.loader_new(image_loader_area_updated_cb, image_loader_size_cb, image_loader_area_prepared_cb, il);
+       il->loader = static_cast<void **>(il->backend.loader_new(image_loader_area_updated_cb, image_loader_size_cb, image_loader_area_prepared_cb, il));
 
 #ifdef HAVE_TIFF
        format = il->backend.get_format_name(il->loader);
@@ -1062,7 +1062,7 @@ static gboolean image_loader_setup_source(ImageLoader *il)
                        return FALSE;
                        }
 
-               il->mapped_file = mmap(0, il->bytes_total, PROT_READ|PROT_WRITE, MAP_PRIVATE, load_fd, 0);
+               il->mapped_file = static_cast<guchar *>(mmap(0, il->bytes_total, PROT_READ|PROT_WRITE, MAP_PRIVATE, load_fd, 0));
                close(load_fd);
                if (il->mapped_file == MAP_FAILED)
                        {
@@ -1137,7 +1137,7 @@ void image_loader_delay_area_ready(ImageLoader *il, gboolean enable)
 
                while (work)
                        {
-                       ImageLoaderAreaParam *par = work->data;
+                       ImageLoaderAreaParam *par = static_cast<ImageLoaderAreaParam *>(work->data);
                        work = work->next;
 
                        g_signal_emit(il, signals[SIGNAL_AREA_READY], 0, par->x, par->y, par->w, par->h);
@@ -1156,40 +1156,40 @@ void image_loader_delay_area_ready(ImageLoader *il, gboolean enable)
 /**************************************************************************************/
 /* execution via idle calls */
 
-static gboolean image_loader_idle_cb(gpointer data)
-{
-       gboolean ret = FALSE;
-       ImageLoader *il = data;
+//static gboolean image_loader_idle_cb(gpointer data)
+//{
+       //gboolean ret = FALSE;
+       //ImageLoader *il = static_cast<ImageLoader *>(data);
 
-       if (il->idle_id)
-               {
-               ret = image_loader_continue(il);
-               }
+       //if (il->idle_id)
+               //{
+               //ret = image_loader_continue(il);
+               //}
 
-       if (!ret)
-               {
-               image_loader_stop_source(il);
-               }
+       //if (!ret)
+               //{
+               //image_loader_stop_source(il);
+               //}
 
-       return ret;
-}
+       //return ret;
+//}
 
 
-static gboolean image_loader_start_idle(ImageLoader *il)
-{
-       gboolean ret;
+//static gboolean image_loader_start_idle(ImageLoader *il)
+//{
+       //gboolean ret;
 
-       if (!il) return FALSE;
+       //if (!il) return FALSE;
 
-       if (!il->fd) return FALSE;
+       //if (!il->fd) return FALSE;
 
-       if (!image_loader_setup_source(il)) return FALSE;
+       //if (!image_loader_setup_source(il)) return FALSE;
 
-       ret = image_loader_begin(il);
+       //ret = image_loader_begin(il);
 
-       if (ret && !il->done) il->idle_id = g_idle_add_full(il->idle_priority, image_loader_idle_cb, il, NULL);
-       return ret;
-}
+       //if (ret && !il->done) il->idle_id = g_idle_add_full(il->idle_priority, image_loader_idle_cb, il, NULL);
+       //return ret;
+//}
 
 /**************************************************************************************/
 /* execution via thread */
@@ -1230,7 +1230,7 @@ static void image_loader_thread_wait_high(void)
 
 static void image_loader_thread_run(gpointer data, gpointer UNUSED(user_data))
 {
-       ImageLoader *il = data;
+       ImageLoader *il = static_cast<ImageLoader *>(data);
        gboolean cont;
        gboolean err;
 
@@ -1429,27 +1429,32 @@ const gchar *image_loader_get_error(ImageLoader *il)
        return ret;
 }
 
+
+/**
+ *  @FIXME this can be rather slow and blocks until the size is known
+ */
 gboolean image_load_dimensions(FileData *fd, gint *width, gint *height)
 {
+       ImageLoader *il;
        gboolean success;
-       gint width_file = 0;
-       gint height_file = 0;
 
-       gdk_pixbuf_get_file_info(fd->path, &width_file, &height_file);
+       il = image_loader_new(fd);
 
-       if (width_file && height_file)
+       success = image_loader_start_idle(il);
+
+       if (success && il->pixbuf)
                {
-               *width = width_file;
-               *height = height_file;
-               success = TRUE;
+               if (width) *width = gdk_pixbuf_get_width(il->pixbuf);
+               if (height) *height = gdk_pixbuf_get_height(il->pixbuf);;
                }
        else
                {
-               *width = -1;
-               *height = -1;
-               success = FALSE;
+               if (width) *width = -1;
+               if (height) *height = -1;
                }
 
+       image_loader_free(il);
+
        return success;
 }
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */