il->requested_width = 0;
il->requested_height = 0;
+ il->actual_width = 0;
+ il->actual_height = 0;
il->shrunk = FALSE;
il->can_destroy = TRUE;
return FALSE;
}
+static gboolean image_loader_emit_size_cb(gpointer data)
+{
+ gint width, height;
+ ImageLoader *il = data;
+ g_mutex_lock(il->data_mutex);
+ width = il->actual_width;
+ height = il->actual_height;
+ g_mutex_unlock(il->data_mutex);
+ g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height);
+ return FALSE;
+}
+
+
/* DONE and ERROR are emited only once, thus they can have normal priority
PERCENT and AREA_READY should be processed ASAP
*/
g_idle_add_full(G_PRIORITY_HIGH, image_loader_emit_percent_cb, il, NULL);
}
+static void image_loader_emit_size(ImageLoader *il)
+{
+ g_idle_add_full(G_PRIORITY_HIGH, image_loader_emit_size_cb, il, NULL);
+}
+
/* this function expects that il->data_mutex is locked by caller */
static void image_loader_emit_area_ready(ImageLoader *il, guint x, guint y, guint w, guint h)
{
gint n;
g_mutex_lock(il->data_mutex);
+ il->actual_width = width;
+ il->actual_height = height;
if (il->requested_width < 1 || il->requested_height < 1)
{
g_mutex_unlock(il->data_mutex);
- g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height);
+ image_loader_emit_size(il);
return;
}
g_mutex_unlock(il->data_mutex);
if (!scale)
{
- g_signal_emit(il, signals[SIGNAL_SIZE], 0, width, height);
+ image_loader_emit_size(il);
return;
}
if (nw < 1) nw = 1;
}
+ il->actual_width = nw;
+ il->actual_height = nh;
il->backend.set_size(loader, nw, nh);
il->shrunk = TRUE;
}
- g_mutex_unlock(il->data_mutex);
- g_signal_emit(il, signals[SIGNAL_SIZE], 0, nw, nh);
+ g_mutex_unlock(il->data_mutex);
+ image_loader_emit_size(il);
}
static void image_loader_stop_loader(ImageLoader *il)