X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdevices%2Ffile.c;h=70d1979b6a4b70cc3c069b509d81d84804411732;hb=b93de056e0b79f57c8f8fe22985b166c7d2c3dc3;hp=592b307e7c78f802f4d448e816f4a61d6c535d05;hpb=36f562f4988603a630302892dc63d5588d48b010;p=swftools.git diff --git a/lib/devices/file.c b/lib/devices/file.c index 592b307..70d1979 100644 --- a/lib/devices/file.c +++ b/lib/devices/file.c @@ -20,10 +20,12 @@ #include #include +#include #include #include "../gfxdevice.h" typedef struct _internal { + char*filename; FILE*fi; } internal_t; @@ -31,7 +33,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 +52,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,12 +102,12 @@ 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; } @@ -122,20 +125,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, 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, 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 +221,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);