mirror of https://github.com/GNOME/gimp.git
app: Make drawable updates happen at fixed framerate
This commit is contained in:
parent
547c92d0f6
commit
32aca3c8b6
|
@ -18,6 +18,7 @@
|
|||
#include "config.h"
|
||||
|
||||
#include <gegl.h>
|
||||
|
||||
#include <gegl-plugin.h>
|
||||
|
||||
#include "libgimpbase/gimpbase.h"
|
||||
|
@ -125,6 +126,8 @@ static void gimp_drawable_real_update (GimpDrawable *drawable,
|
|||
gint width,
|
||||
gint height);
|
||||
|
||||
static gboolean gimp_drawable_update_timeout (GimpDrawable *drawable);
|
||||
|
||||
static gint64 gimp_drawable_real_estimate_memsize (const GimpDrawable *drawable,
|
||||
gint width,
|
||||
gint height);
|
||||
|
@ -256,6 +259,14 @@ gimp_drawable_init (GimpDrawable *drawable)
|
|||
drawable->bytes = 0;
|
||||
drawable->type = -1;
|
||||
drawable->has_alpha = FALSE;
|
||||
|
||||
drawable->dirty_x1 = 0;
|
||||
drawable->dirty_y1 = 0;
|
||||
drawable->dirty_x2 = 0;
|
||||
drawable->dirty_y2 = 0;
|
||||
|
||||
drawable->update_count = 0;
|
||||
drawable->update_timeout = 0;
|
||||
}
|
||||
|
||||
/* sorry for the evil casts */
|
||||
|
@ -1197,8 +1208,36 @@ gimp_drawable_update (GimpDrawable *drawable,
|
|||
{
|
||||
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
|
||||
|
||||
g_signal_emit (drawable, gimp_drawable_signals[UPDATE], 0,
|
||||
x, y, width, height);
|
||||
if (drawable->update_timeout > 0)
|
||||
{
|
||||
|
||||
drawable->dirty_x1 = MIN (x, drawable->dirty_x1);
|
||||
drawable->dirty_y1 = MIN (y, drawable->dirty_y1);
|
||||
|
||||
drawable->dirty_x2 = MAX (x + width, drawable->dirty_x2);
|
||||
|
||||
drawable->dirty_y2 = MAX (y + height, drawable->dirty_y2);
|
||||
|
||||
drawable->update_count = drawable->update_count + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_signal_emit (drawable, gimp_drawable_signals[UPDATE], 0,
|
||||
x, y, width, height);
|
||||
|
||||
drawable->dirty_x1 = drawable->dirty_x2;
|
||||
drawable->dirty_y1 = drawable->dirty_y2;
|
||||
drawable->dirty_x2 = 0;
|
||||
drawable->dirty_y2 = 0;
|
||||
|
||||
drawable->update_count = 0;
|
||||
|
||||
drawable->update_timeout =
|
||||
g_timeout_add_full (G_PRIORITY_HIGH,
|
||||
40,
|
||||
(GSourceFunc) gimp_drawable_update_timeout,
|
||||
drawable, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1996,3 +2035,15 @@ gimp_drawable_detach_floating_sel (GimpDrawable *drawable,
|
|||
|
||||
gimp_image_set_floating_selection (image, NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gimp_drawable_update_timeout (GimpDrawable *drawable)
|
||||
{
|
||||
drawable->update_timeout = 0;
|
||||
|
||||
if (drawable->update_count > 0)
|
||||
gimp_drawable_update(drawable,
|
||||
drawable->dirty_x1, drawable->dirty_y1,
|
||||
drawable->dirty_x2 - drawable->dirty_x1, drawable->dirty_y2 - drawable->dirty_y1);
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
@ -41,6 +41,15 @@ struct _GimpDrawable
|
|||
GimpImageType type; /* type of drawable */
|
||||
gboolean has_alpha; /* drawable has alpha */
|
||||
|
||||
gint dirty_x1;
|
||||
gint dirty_y1;
|
||||
gint dirty_x2;
|
||||
gint dirty_y2;
|
||||
|
||||
guint update_timeout; /* update delay timeout ID */
|
||||
|
||||
guint update_count;
|
||||
|
||||
GimpDrawablePrivate *private;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue