The other way to go about it is to just use cairo. I don't think that it will give a speed improvement but it might be worth a try. I figure you are trying to scale the png first and then draw it in a widget. Once the image is sized it shouldn't be a problem to draw quickly.
Eric //gcc -Wall big_png1.c -o big_png1 `pkg-config gtk+-3.0 --cflags --libs` #include<gtk/gtk.h> static gboolean da_drawing(GtkWidget *da, cairo_t *cr, cairo_surface_t *surface); static void save_png(); static cairo_surface_t *get_and_scale_png(); int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Big PNG"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 500, 500); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); GTimer *timer=g_timer_new(); save_png(); g_print("Save Time %f\n", g_timer_elapsed(timer, NULL)); g_timer_start(timer); cairo_surface_t *surface=get_and_scale_png(); g_print("Get Time %f\n", g_timer_elapsed(timer, NULL)); g_timer_destroy(timer); GtkWidget *da=gtk_drawing_area_new(); gtk_widget_set_size_request(da, 10000, 10000); gtk_widget_set_hexpand(da, TRUE); gtk_widget_set_vexpand(da, TRUE); g_signal_connect(da, "draw", G_CALLBACK(da_drawing), surface); GtkWidget *scroll=gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(scroll), da); GtkWidget *grid=gtk_grid_new(); gtk_grid_attach(GTK_GRID(grid), scroll, 0, 0, 1, 1); gtk_container_add(GTK_CONTAINER(window), grid); gtk_widget_show_all(window); gtk_main(); cairo_surface_destroy(surface); return 0; } static gboolean da_drawing(GtkWidget *da, cairo_t *cr, cairo_surface_t *surface) { GTimer *timer=g_timer_new(); cairo_set_source_surface(cr, surface, 0.0, 0.0); cairo_paint(cr); g_print("Draw Time %f\n", g_timer_elapsed(timer, NULL)); g_timer_destroy(timer); return FALSE; } static void save_png() { gdouble width=5000.0; gdouble height=5000.0; cairo_surface_t *surface=cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr=cairo_create(surface); //Paint the green background. cairo_set_source_rgba(cr, 0.0, 1.0, 0.0, 1.0); cairo_paint(cr); cairo_set_source_rgba(cr, 1.0, 0.0, 1.0, 1.0); cairo_set_line_width(cr, 80.0); cairo_rectangle(cr, 0.0, 0.0, width, height); cairo_stroke(cr); cairo_surface_write_to_png(surface, "big.png"); cairo_destroy(cr); cairo_surface_destroy(surface); } static cairo_surface_t *get_and_scale_png() { //The 5,000x5,000 surface. cairo_surface_t *surface=cairo_image_surface_create_from_png("big.png"); //Scale to 1/10 of width and height. cairo_surface_t *surface2=cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 500.0, 500.0); cairo_t *cr2=cairo_create(surface2); cairo_scale(cr2, 1.0/10.0, 1.0/10.0); cairo_set_source_surface(cr2, surface, 0.0, 0.0); cairo_pattern_set_filter(cairo_get_source(cr2), CAIRO_FILTER_FAST); cairo_paint(cr2); cairo_destroy(cr2); cairo_surface_destroy(surface); return surface2; } _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list