X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdevices%2Ffile.c;h=553e6422970b00e649177de912c9c3ba0baa5d0c;hb=7fb4a4ac393f19a0b8a8998a2f1deac88c97eda0;hp=592b307e7c78f802f4d448e816f4a61d6c535d05;hpb=36f562f4988603a630302892dc63d5588d48b010;p=swftools.git diff --git a/lib/devices/file.c b/lib/devices/file.c index 592b307..553e642 100644 --- a/lib/devices/file.c +++ b/lib/devices/file.c @@ -20,10 +20,15 @@ #include #include +#ifndef WIN32 +#include +#endif +#include #include #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,21 @@ 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; + } +} + +static void dumpmatrix (FILE*fi, gfxmatrix_t*matrix) +{ + fprintf(fi, "| %5.2f %5.2f %5.2f\n", matrix->m00, matrix->m10, matrix->tx); + fprintf(fi, "| %5.2f %5.2f %5.2f\n", matrix->m01, matrix->m11, matrix->ty); +} + +static void dumpgradient (FILE*fi, gfxgradient_t*gradient) +{ + while(gradient) { + fprintf(fi, "pos %f: %02x%02x%02x%02x\n", gradient->pos, gradient->color.r, gradient->color.g, gradient->color.b, gradient->color.a); + gradient = gradient->next; } } @@ -89,6 +109,7 @@ void file_fillbitmap(struct _gfxdevice*dev, gfxline_t*line, gfximage_t*img, gfxm { internal_t*i = (internal_t*)dev->internal; fprintf(i->fi, "fillbitmap\n"); + dumpmatrix(i->fi, matrix); dumpline(i->fi, line); } @@ -96,20 +117,23 @@ void file_fillgradient(struct _gfxdevice*dev, gfxline_t*line, gfxgradient_t*grad { internal_t*i = (internal_t*)dev->internal; fprintf(i->fi, "fillgradient\n"); + dumpmatrix(i->fi, matrix); + dumpgradient(i->fi, gradient); 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; + fprintf(i->fi, "addfont %s\n", font->id); } -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 +146,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 +242,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);