mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 10:50:10 +00:00
Track last_surface properly
This commit is contained in:
parent
7f0e43c0fd
commit
60cf2d53eb
@ -993,6 +993,101 @@ _gdk_windowing_window_set_composited (GdkWindow *window,
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static guint dirty_flush_id = 0;
|
||||
|
||||
static void
|
||||
diff_surfaces (cairo_surface_t *surface,
|
||||
cairo_surface_t *old_surface)
|
||||
{
|
||||
guint8 *data, *old_data;
|
||||
guint8 *line, *old_line;
|
||||
int w, h, stride, old_stride;
|
||||
int x, y;
|
||||
|
||||
data = cairo_image_surface_get_data (surface);
|
||||
old_data = cairo_image_surface_get_data (old_surface);
|
||||
|
||||
w = cairo_image_surface_get_width (surface);
|
||||
h = cairo_image_surface_get_height (surface);
|
||||
|
||||
stride = cairo_image_surface_get_stride (surface);
|
||||
old_stride = cairo_image_surface_get_stride (old_surface);
|
||||
|
||||
for (y = 0; y < h; y++)
|
||||
{
|
||||
line = data;
|
||||
old_line = old_data;
|
||||
|
||||
for (x = 0; x < w; x++)
|
||||
{
|
||||
int j;
|
||||
for (j = 0; j < 4; j++)
|
||||
old_line[j] = line[j] - old_line[j];
|
||||
line += 4;
|
||||
old_line += 4;
|
||||
}
|
||||
|
||||
data += stride;
|
||||
old_data += old_stride;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
dirty_flush_idle (gpointer data)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
dirty_flush_id = 0;
|
||||
|
||||
for (l = all_windows; l != NULL; l = l->next)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = l->data;
|
||||
GdkDrawableImplBroadway *drawable_impl = GDK_DRAWABLE_IMPL_BROADWAY (impl);
|
||||
cairo_t *cr;
|
||||
|
||||
if (impl->dirty)
|
||||
{
|
||||
impl->dirty = FALSE;
|
||||
|
||||
if (impl->last_synced)
|
||||
{
|
||||
diff_surfaces (drawable_impl->surface,
|
||||
drawable_impl->last_surface);
|
||||
}
|
||||
|
||||
/* TODO: send data */
|
||||
|
||||
if (1)
|
||||
{
|
||||
static int nr = 0;
|
||||
char *filename;
|
||||
filename = g_strdup_printf ("frame-%d.png", nr++);
|
||||
g_print ("writing window %p surface %p, name %s\n", drawable_impl->wrapper, drawable_impl->surface, filename);
|
||||
cairo_surface_write_to_png (drawable_impl->surface, filename);
|
||||
g_free (filename);
|
||||
filename = g_strdup_printf ("frame-%d-old.png", nr++);
|
||||
g_print ("writing window %p surface %p, name %s\n", drawable_impl->wrapper, drawable_impl->last_surface, filename);
|
||||
cairo_surface_write_to_png (drawable_impl->last_surface, filename);
|
||||
g_free (filename);
|
||||
}
|
||||
|
||||
cr = cairo_create (drawable_impl->last_surface);
|
||||
cairo_set_source_surface (cr, drawable_impl->surface, 0, 0);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
impl->last_synced = TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;}
|
||||
|
||||
static void
|
||||
queue_dirty_flush (void)
|
||||
{
|
||||
if (dirty_flush_id == 0)
|
||||
dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_windowing_window_process_updates_recurse (GdkWindow *window,
|
||||
cairo_region_t *region)
|
||||
@ -1005,6 +1100,7 @@ _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
|
||||
private = (GdkWindowObject *)window;
|
||||
impl = GDK_WINDOW_IMPL_BROADWAY (private->impl);
|
||||
impl->dirty = TRUE;
|
||||
queue_dirty_flush ();
|
||||
}
|
||||
|
||||
void
|
||||
@ -1015,18 +1111,6 @@ _gdk_windowing_before_process_all_updates (void)
|
||||
void
|
||||
_gdk_windowing_after_process_all_updates (void)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = all_windows; l != NULL; l = l->next)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = l->data;
|
||||
|
||||
if (impl->dirty)
|
||||
{
|
||||
/* TODO: Flush dirty windows */
|
||||
impl->dirty = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@ -54,7 +54,7 @@ struct _GdkWindowImplBroadway
|
||||
|
||||
gint8 toplevel_window_type;
|
||||
gboolean dirty;
|
||||
|
||||
gboolean last_synced;
|
||||
};
|
||||
|
||||
struct _GdkWindowImplBroadwayClass
|
||||
|
Loading…
Reference in New Issue
Block a user