#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <gtk/gtk.h>

void recurse(int level) {
        struct timeval start, finish;
        GdkPixbufLoader* loader;
        FILE* f;
        guchar buf[65536];
        GError* error;
        size_t count;

        level++;

        printf(">>> level %d\n", level);

        loader = gdk_pixbuf_loader_new();

        if (!(f = fopen("/tmp/yu/dsc_4452.jpg", "r"))) {
                printf("file not found\n");
                exit(1);
        }
        count = fread(buf, 1, sizeof(buf), f);

        gettimeofday(&start, NULL);
        if (!gdk_pixbuf_loader_write(loader, buf, count, &error)) {
                printf("cannot write: %s\n", error->message);
                exit(1);
        }
        gettimeofday(&finish, NULL);  
        printf("writing 64k time: %.9f s\n", finish.tv_sec - start.tv_sec + (finish.tv_usec - start.tv_usec) / 1.e6);


        if (level < 5) {
                recurse(level);

                fclose(f);
                
                gettimeofday(&start, NULL);
                gdk_pixbuf_loader_close(loader, NULL);
                gettimeofday(&finish, NULL);  
                printf("closing time: %.9f s\n", finish.tv_sec - start.tv_sec + (finish.tv_usec - start.tv_usec) / 1.e6);

        } else {
                gettimeofday(&start, NULL);
                while ((count = fread(buf, 1, sizeof(buf), f))) {
                        if (!gdk_pixbuf_loader_write(loader, buf, count, &error)) {
                                printf("cannot write: %s\n", error->message);
                                exit(1);
                        }
                }
                if (!gdk_pixbuf_loader_close(loader, &error)) {
                        printf("cannot close: %s\n", error->message);
                        exit(1);
                }
                gettimeofday(&finish, NULL);  
                printf("loading time: %.9f s\n", finish.tv_sec - start.tv_sec + (finish.tv_usec - start.tv_usec) / 1.e6);
        }

        printf("<<< level %d\n", level);
}


int main(int argc, char** argv) {

        gtk_init(&argc, &argv);
        recurse(0);
        return 0;
}

