src/lib/image.c
changeset 19 ebcc49de97d0
parent 18 f92a24ab046e
child 22 811c88041c06
--- a/src/lib/image.c	Thu Dec 31 14:01:37 2009 +0200
+++ b/src/lib/image.c	Thu Dec 31 16:40:13 2009 +0200
@@ -1,8 +1,10 @@
 #include "image.h"
+#include "ctx.h"
 #include "cache.h"
 #include "tile.h"
 #include "error.h"
 #include "shared/util.h"
+#include "shared/log.h"
 
 #include <stdlib.h>
 #include <errno.h>
@@ -230,11 +232,11 @@
     int err;
 
     // init
-    if ((err = pt_tile_init_file(&tile, info, out)))
+    if ((err = pt_tile_init_file(&tile, image->cache, info, out)))
         return err;
 
     // render
-    if ((err = pt_tile_render(&tile, image->cache)))
+    if ((err = pt_tile_render(&tile)))
         JUMP_ERROR(err);
 
     // ok
@@ -252,11 +254,11 @@
     int err;
 
     // init
-    if ((err = pt_tile_init_mem(&tile, info)))
+    if ((err = pt_tile_init_mem(&tile, image->cache, info)))
         return err;
 
     // render
-    if ((err = pt_tile_render(&tile, image->cache)))
+    if ((err = pt_tile_render(&tile)))
         JUMP_ERROR(err);
 
     // ok
@@ -271,6 +273,46 @@
     return err;
 }
 
+static void _pt_image_tile_async (void *arg)
+{
+    struct pt_tile *tile = arg;
+    int err;
+
+    // do render op
+    if ((err = pt_tile_render(tile)))
+        log_warn_errno("pt_tile_render: %s", pt_strerror(err));
+
+    // signal done
+    if (fclose(tile->out.file))
+        log_warn_errno("fclose");
+}
+
+int pt_image_tile_async (struct pt_image *image, const struct pt_tile_info *info, FILE *out)
+{
+    struct pt_tile *tile;
+    int err;
+
+    // alloc
+    if ((err = pt_tile_new(&tile)))
+        return err;
+
+    // init
+    if ((err = pt_tile_init_file(tile, image->cache, info, out)))
+        JUMP_ERROR(err);
+    
+    // enqueue work
+    if ((err = pt_ctx_work(image->ctx, _pt_image_tile_async, tile)))
+        JUMP_ERROR(err);
+
+    // ok, running
+    return 0;
+
+error:
+    pt_tile_destroy(tile);
+
+    return err;
+}
+
 void pt_image_destroy (struct pt_image *image)
 {
     free(image->path);
@@ -280,3 +322,4 @@
 
     free(image);
 }
+