Revision: 1125
          http://geeqie.svn.sourceforge.net/geeqie/?rev=1125&view=rev
Author:   nadvornik
Date:     2008-09-01 19:18:32 +0000 (Mon, 01 Sep 2008)

Log Message:
-----------
improved pixbuf draw priority control

Modified Paths:
--------------
    trunk/src/pixbuf-renderer.c
    trunk/src/pixbuf-renderer.h

Modified: trunk/src/pixbuf-renderer.c
===================================================================
--- trunk/src/pixbuf-renderer.c 2008-09-01 17:29:07 UTC (rev 1124)
+++ trunk/src/pixbuf-renderer.c 2008-09-01 19:18:32 UTC (rev 1125)
@@ -221,6 +221,7 @@
 static void pr_signals_connect(PixbufRenderer *pr);
 static void pr_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer 
data);
 static void pixbuf_renderer_paint(PixbufRenderer *pr, GdkRectangle *area);
+static gint pr_queue_draw_idle_cb(gpointer data);
 
 
 /*
@@ -2688,12 +2689,72 @@
  *-------------------------------------------------------------------
  */
 
+static gint pr_get_queued_area(GList *work)
+{
+       gint area = 0;
+       
+       while (work) 
+               {
+               QueueData *qd = work->data;
+               area += qd->w * qd->h;
+               work = work->next;
+               }
+       return area;
+}
+
+
+static gint pr_queue_schedule_next_draw(PixbufRenderer *pr, gboolean force_set)
+{
+       gfloat percent;
+       gint visible_area = pr->vis_width * pr->vis_height;
+       
+       if (!pr->loading)
+               {
+               /* 2pass prio */ 
+               DEBUG_2("redraw priority 2pass\n");
+               pr->draw_idle_id = g_idle_add_full(G_PRIORITY_HIGH_IDLE, 
pr_queue_draw_idle_cb, pr, NULL);
+               return FALSE;
+               }
+       
+       if (visible_area == 0)
+               {
+               /* not known yet */
+               percent = 100.0;
+               }
+       else
+               {
+               percent = 100.0 * pr_get_queued_area(pr->draw_queue) / 
visible_area;
+               }
+       
+       if (percent > 10.0)
+               {
+               /* we have enough data for starting intensive redrawing */
+               DEBUG_2("redraw priority high %f\n", percent);
+               pr->draw_idle_id = g_idle_add_full(GDK_PRIORITY_REDRAW, 
pr_queue_draw_idle_cb, pr, NULL);
+               return FALSE;
+               }
+       
+       if (percent < 1.0 || force_set)
+               {
+               /* queue is (almost) empty, wait  50 ms*/
+               DEBUG_2("redraw priority wait %f\n", percent);
+               pr->draw_idle_id = g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, 
50, pr_queue_draw_idle_cb, pr, NULL);
+               return FALSE;
+               }
+       
+       /* keep the same priority as before */
+       DEBUG_2("redraw priority no change %f\n", percent);
+       return TRUE;
+}
+               
+
 static gint pr_queue_draw_idle_cb(gpointer data)
 {
        PixbufRenderer *pr = data;
        QueueData *qd;
        gint fast;
 
+
        if ((!pr->pixbuf && !pr->source_tiles_enabled) ||
            (!pr->draw_queue && !pr->draw_queue_2pass) ||
            pr->draw_idle_id == -1)
@@ -2715,10 +2776,7 @@
                        {
                        /* still loading, wait till done (also drops the higher 
priority) */
 
-                       pr->draw_idle_id = 
g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
-                                                          
pr_queue_draw_idle_cb, pr, NULL);
-                       pr->draw_idle_high = FALSE;
-                       return FALSE;
+                       return pr_queue_schedule_next_draw(pr, FALSE);
                        }
 
                qd = pr->draw_queue_2pass->data;
@@ -2779,7 +2837,7 @@
                return FALSE;
                }
 
-       return TRUE;
+               return pr_queue_schedule_next_draw(pr, FALSE);
 }
 
 static void pr_queue_list_free(GList *list)
@@ -2967,12 +3025,10 @@
        if (w < 1 || h < 1) return;
 
        if (pr_queue_to_tiles(pr, nx, ny, w, h, clamp, render, new_data, 
only_existing) &&
-           ((!pr->draw_queue && !pr->draw_queue_2pass) || pr->draw_idle_id == 
-1 || !pr->draw_idle_high))
+           ((!pr->draw_queue && !pr->draw_queue_2pass) || pr->draw_idle_id == 
-1))
                {
                if (pr->draw_idle_id != -1) g_source_remove(pr->draw_idle_id);
-               pr->draw_idle_id = g_idle_add_full(GDK_PRIORITY_REDRAW,
-                                                  pr_queue_draw_idle_cb, pr, 
NULL);
-               pr->draw_idle_high = TRUE;
+               pr_queue_schedule_next_draw(pr, TRUE);
                }
 }
 

Modified: trunk/src/pixbuf-renderer.h
===================================================================
--- trunk/src/pixbuf-renderer.h 2008-09-01 17:29:07 UTC (rev 1124)
+++ trunk/src/pixbuf-renderer.h 2008-09-01 19:18:32 UTC (rev 1125)
@@ -109,7 +109,6 @@
        GList *draw_queue_2pass;/* list when 2 pass is enabled */
 
        gint draw_idle_id;
-       gint draw_idle_high;    /* current idle_id has high priority */
 
        gboolean in_drag;
        gint drag_last_x;


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Geeqie-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geeqie-svn

Reply via email to