[maemo-commits] [maemo-commits] r19144 - projects/haf/branches/gtk+/temp-rgba/gdk
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Tue Aug 18 17:13:03 EEST 2009
- Previous message: [maemo-commits] r19143 - projects/haf/branches/gtk+
- Next message: [maemo-commits] r19145 - in projects/haf/branches/gtk+/temp-rgba: gdk gtk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: herzi Date: 2009-08-18 17:13:01 +0300 (Tue, 18 Aug 2009) New Revision: 19144 Modified: projects/haf/branches/gtk+/temp-rgba/gdk/gdkwindow.c Log: from gordon Modified: projects/haf/branches/gtk+/temp-rgba/gdk/gdkwindow.c =================================================================== --- projects/haf/branches/gtk+/temp-rgba/gdk/gdkwindow.c 2009-08-18 14:08:30 UTC (rev 19143) +++ projects/haf/branches/gtk+/temp-rgba/gdk/gdkwindow.c 2009-08-18 14:13:01 UTC (rev 19144) @@ -388,7 +388,7 @@ attributes->wclass != GDK_INPUT_ONLY && gdk_drawable_get_depth (window) == 32) { - gdk_window_set_composited (window, TRUE); + //gdk_window_set_composited (window, TRUE); gdk_window_set_auto_composite (window, TRUE); } #endif @@ -1065,6 +1065,38 @@ #include "x11/gdkx.h" #endif + +static void +dump_changes (GdkWindow *window) +{ + int width, height; + gdk_drawable_get_size (GDK_DRAWABLE (window), + &width, &height); + if (width<200 | height<60) + return; + + cairo_t* cr = gdk_cairo_create (window); + gint counter = 0; + for (counter = 0; counter < 1000; counter++) + { + gchar* png_name = g_strdup_printf ("/home/user/%d.png", counter); + + if (g_file_test (png_name, G_FILE_TEST_IS_REGULAR)) + { + g_free (png_name); + continue; + } + + g_message ("saving to %s\n", png_name); + cairo_surface_write_to_png (cairo_get_target (cr), + png_name); + g_free (png_name); + break; + } + cairo_destroy (cr); +} + + /** * gdk_window_begin_paint_region: * @window: a #GdkWindow @@ -1126,6 +1158,8 @@ if (GDK_WINDOW_DESTROYED (window)) return; + dump_changes(window); + if (GDK_IS_PAINTABLE (private->impl)) { GdkPaintableIface *iface = GDK_PAINTABLE_GET_IFACE (private->impl); @@ -1147,21 +1181,13 @@ MAX (clip_box.width, 1), MAX (clip_box.height, 1), -1); paint->surface = _gdk_drawable_ref_cairo_surface (paint->pixmap); -#ifdef MAEMO_CHANGES - if (gdk_drawable_get_depth (paint->pixmap) == 32) - { - cairo_t* cr = gdk_cairo_create (paint->pixmap); - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); - gdk_cairo_region (cr, paint->region); - cairo_clip (cr); - cairo_paint (cr); - cairo_destroy (cr); - } -#endif cairo_surface_set_device_offset (paint->surface, - paint->x_offset, - paint->y_offset); + /* TODO: Maybe we also subtract areas for non-composited windows from + * paint->region? */ + + for (list = private->paint_stack; list != NULL; list = list->next) { GdkWindowPaint *tmp_paint = list->data; @@ -1179,20 +1205,32 @@ } #ifdef MAEMO_CHANGES + /* If we are 32 bit, set the area that we are *not* rendering to + * to be transparent. This means when we blit it back, it won't + * overwrite what is already there. */ if (gdk_drawable_get_depth (window) == 32) { + GdkRegion *inverse = gdk_region_rectangle(&clip_box); + gdk_region_subtract(inverse, region); + + if (!gdk_region_empty(inverse)) + { cairo_t* cr = gdk_cairo_create (window); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.0); - gdk_cairo_region (cr, region); + gdk_cairo_region (cr, inverse); cairo_clip (cr); cairo_paint (cr); cairo_destroy (cr); } + + gdk_region_destroy(inverse); + } #endif #endif /* USE_BACKING_STORE */ } + /** * gdk_window_end_paint: * @window: a #GdkWindow @@ -1255,49 +1293,16 @@ gdk_gc_set_clip_region (tmp_gc, paint->region); gdk_gc_set_clip_origin (tmp_gc, - x_offset, - y_offset); - gdk_draw_drawable (private->impl, tmp_gc, paint->pixmap, - clip_box.x - paint->x_offset, - clip_box.y - paint->y_offset, - clip_box.x - x_offset, clip_box.y - y_offset, - clip_box.width, clip_box.height); - - if (private->redirect) - { - GdkWindowClipData data; - - setup_redirect_clip (window, tmp_gc, &data); -#ifndef MAEMO_CHANGES - gdk_draw_drawable (private->redirect->pixmap, tmp_gc, paint->pixmap, - clip_box.x - paint->x_offset, - clip_box.y - paint->y_offset, - clip_box.x + data.x_offset, - clip_box.y + data.y_offset, - clip_box.width, clip_box.height); -#else - cairo_t* cr = gdk_cairo_create (private->redirect->pixmap); - cairo_rectangle (cr, - clip_box.x + data.x_offset, - clip_box.y + data.y_offset, - clip_box.width, clip_box.height); - gdk_cairo_set_source_pixmap (cr, paint->pixmap, - clip_box.x - paint->x_offset, - clip_box.y - paint->y_offset); - cairo_fill (cr); - cairo_destroy (cr); -#endif - reset_redirect_clip (window, tmp_gc, &data); - } - #ifdef MAEMO_CHANGES -#if 1 - /* this is the code that works */ - cr = gdk_cairo_create (window); + /* compose subwindows onto this pixmap */ + cr = gdk_cairo_create (paint->pixmap); for (subwindow = gdk_window_peek_children (window); subwindow; subwindow = subwindow->next) { int x, y, w, h; + /* We should maybe ignore this here, or stuff probably won't appear? */ if (!gdk_window_get_auto_composite (subwindow->data)) continue; @@ -1312,22 +1317,30 @@ cairo_restore (cr); } cairo_destroy (cr); -#else - /* and this is the code that should be working according to timj */ - if (gdk_window_get_auto_composite (window)) + + /* finally paint the pixmap onto the window */ + gdk_draw_drawable (private->impl, tmp_gc, paint->pixmap, + clip_box.x - paint->x_offset, + clip_box.y - paint->y_offset, + clip_box.x, clip_box.y, + clip_box.width, clip_box.height); +#endif + + if (private->redirect) { - int x, y, w, h; + GdkWindowClipData data; - cr = gdk_cairo_create (gdk_window_get_parent (window)); - gdk_window_get_position (window, &x, &y); - gdk_window_get_size (window, &w, &h); - gdk_cairo_set_source_pixmap (cr, window, x, y); - cairo_rectangle (cr, x, y, w, h); - cairo_fill (cr); - cairo_destroy (cr); + setup_redirect_clip (window, tmp_gc, &data); + + gdk_draw_drawable (private->redirect->pixmap, tmp_gc, paint->pixmap, + clip_box.x - paint->x_offset, + clip_box.y - paint->y_offset, + clip_box.x + data.x_offset, + clip_box.y + data.y_offset, + clip_box.width, clip_box.height); + + reset_redirect_clip (window, tmp_gc, &data); } -#endif -#endif /* Reset clip region of the cached GdkGC */ gdk_gc_set_clip_region (tmp_gc, NULL); @@ -1367,6 +1380,8 @@ } #endif #endif /* USE_BACKING_STORE */ + + dump_changes(window); } static void @@ -4345,12 +4360,12 @@ if (private->auto_composite == auto_composite) return; - if (!private->composited && auto_composite) + /* if (!private->composited && auto_composite) { g_warning ("gdk_window_set_auto_composite called but " "window is not composited"); return; - } + }*/ private->auto_composite = auto_composite; }
- Previous message: [maemo-commits] r19143 - projects/haf/branches/gtk+
- Next message: [maemo-commits] r19145 - in projects/haf/branches/gtk+/temp-rgba: gdk gtk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]