win32 compile fixes
[swftools.git] / lib / devices / file.c
index 592b307..98aaaa2 100644 (file)
 
 #include <stdlib.h>
 #include <stdio.h>
+#ifndef WIN32
+#include <unistd.h>
+#endif
+#include <string.h>
 #include <memory.h>
 #include "../gfxdevice.h"
 
 typedef struct _internal {
+    char*filename;
     FILE*fi;
 } internal_t;
 
@@ -31,7 +36,7 @@ int file_setparameter(struct _gfxdevice*dev, const char*key, const char*value)
 {
     internal_t*i = (internal_t*)dev->internal;
     fprintf(i->fi, "setparameter %s=%s\n", key, value);
-    return 0;
+    return 1;
 }
 
 void file_startpage(struct _gfxdevice*dev, int width, int height)
@@ -50,6 +55,7 @@ static void dumpline(FILE*fi, gfxline_t*line)
        } else if(line->type == gfx_splineTo) {
            fprintf(fi, "\tsplineTo %f %f %f %f\n", line->sx, line->sy, line->x, line->y);
        }
+       line = line->next;
     }
 }
 
@@ -99,17 +105,17 @@ void file_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*grad
     dumpline(i->fi, line);
 }
 
-void file_addfont(struct _gfxdevice*dev, char*fontid, gfxfont_t*font)
+void file_addfont(struct _gfxdevice*dev, gfxfont_t*font)
 {
     internal_t*i = (internal_t*)dev->internal;
 }
 
-void file_drawchar(struct _gfxdevice*dev, char*fontid, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix)
+void file_drawchar(struct _gfxdevice*dev, gfxfont_t*font, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix)
 {
     internal_t*i = (internal_t*)dev->internal;
 }
 
-void file_drawlink(struct _gfxdevice*dev, gfxline_t*line, char*action)
+void file_drawlink(struct _gfxdevice*dev, gfxline_t*line, const char*action)
 {
     internal_t*i = (internal_t*)dev->internal;
     fprintf(i->fi, "drawlink %s\n", action);
@@ -122,20 +128,85 @@ void file_endpage(struct _gfxdevice*dev)
     fprintf(i->fi, "endpage\n");
 }
 
+typedef struct gfxresult_internal
+{
+    FILE*fi;
+    char*filename;
+} gfxresult_internal_t;
+    
+void fileresult_destroy(struct _gfxresult*gfx)
+{
+    gfxresult_internal_t*i = (gfxresult_internal_t*)gfx->internal;
+    unlink(i->filename);
+    free(i->filename);i->filename = 0;
+}
+
+int fileresult_save(struct _gfxresult*gfx, const char*filename)
+{
+    gfxresult_internal_t*i = (gfxresult_internal_t*)gfx->internal;
+    FILE*fi,*fo;
+    fi = fopen(i->filename, "rb");
+    if(!fi) {
+       perror(i->filename);
+       return 0;
+    }
+    fo = fopen(filename, "wb");
+    if(!fo) {
+       perror(filename);
+       return 0;
+    }
+
+    char buf[4096];
+    while(!feof(fi)) {
+       int l = fread(buf, 1, 4096, fi);
+       if(l>0) {
+           fwrite(buf, 1, l, fo);
+       } else {
+           break;
+       }
+    }
+
+    fclose(fi);
+    fclose(fo);
+    return 0;
+}
+
+void* fileresult_get(struct _gfxresult*gfx, const char*name)
+{
+    return 0; 
+}
+
 gfxresult_t* file_finish(struct _gfxdevice*dev)
 {
     internal_t*i = (internal_t*)dev->internal;
+    char*filename = strdup(i->filename);
+    gfxresult_t*result = (gfxresult_t*)malloc(sizeof(gfxresult_t));
     fclose(i->fi);
     i->fi = 0;
+    if(i->filename) {
+       free(i->filename);
+       i->filename = 0;
+    }
     free(dev->internal);
     dev->internal = 0;
-    return 0;
+
+    memset(result, 0, sizeof(gfxresult_t));
+    result->save = fileresult_save;
+    result->get = fileresult_get;
+    result->destroy = fileresult_destroy;
+    result->internal = malloc(sizeof(gfxresult_internal_t));
+    ((gfxresult_internal_t*)result->internal)->filename = filename;
+
+    return result;
 }
 
 void gfxdevice_file_init(gfxdevice_t*dev, char*filename)
 {
-    internal_t*i = malloc(sizeof(internal_t));
+    internal_t*i = (internal_t*)malloc(sizeof(internal_t));
     memset(dev, 0, sizeof(gfxdevice_t));
+
+    dev->name = "file";
+
     dev->internal = i;
 
     dev->setparameter = file_setparameter;
@@ -153,6 +224,7 @@ void gfxdevice_file_init(gfxdevice_t*dev, char*filename)
     dev->finish = file_finish;
 
     i->fi = fopen(filename, "wb");
+    i->filename = strdup(filename);
     if(!i->fi) {
        fprintf(stderr, "Couldn't open file %s\n", filename);
        exit(1);