This takes 30 secs to render

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

This takes 30 secs to render

Gtk+ - Apps Dev mailing list


Is there any way to make this better?  The image loaded is 3.3MB PNG
                int nWidth = gdk_pixbuf_get_width(pImage), nHeight = gdk_pixbuf_get_height(pImage);
                gtk_widget_set_size_request(widget, nWidth, nHeight);
                gdk_cairo_set_source_pixbuf(cr, pImage, 0, 0);
                cairo_rectangle(cr, 0, 0, nWidth, nHeight);
                cairo_fill(cr);
                g_object_unref(pImage);

_______________________________________________
gtk-app-devel-list mailing list
[hidden email]
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Reply | Threaded
Open this post in threaded view
|

Re: This takes 30 secs to render

Gtk+ - Apps Dev mailing list

 
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
[hidden email]
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
Reply | Threaded
Open this post in threaded view
|

Re: This takes 30 secs to render

Lucky B.C
In reply to this post by Gtk+ - Apps Dev mailing list
Hi, Another way to render the image better than cairo did, using OpenGL
Area. You could find an example about it in gtk-demo.

On Fri, Jun 1, 2018 at 6:45 AM, Tarie Nosworthy via gtk-app-devel-list <
[hidden email]> wrote:

>
>
> Is there any way to make this better?  The image loaded is 3.3MB PNG
>                 int nWidth = gdk_pixbuf_get_width(pImage), nHeight =
> gdk_pixbuf_get_height(pImage);
>                 gtk_widget_set_size_request(widget, nWidth, nHeight);
>                 gdk_cairo_set_source_pixbuf(cr, pImage, 0, 0);
>                 cairo_rectangle(cr, 0, 0, nWidth, nHeight);
>                 cairo_fill(cr);
>                 g_object_unref(pImage);
>
> _______________________________________________
> gtk-app-devel-list mailing list
> [hidden email]
> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
_______________________________________________
gtk-app-devel-list mailing list
[hidden email]
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list