diff -r 43297144f196 -r ee426f453cf5 render_png.c --- a/render_png.c Fri Jun 06 23:37:45 2008 +0300 +++ b/render_png.c Sat Jun 07 05:05:18 2008 +0300 @@ -11,31 +11,33 @@ png_structp png_ptr; png_infop info_ptr; - // our render op, containing the I/O callbacks - struct render *render; + // some info that we need to keep from the struct render + render_ctx_write_cb io_write_fn; + render_ctx_flush_cb io_flush_fn; + void *cb_arg; }; -void _render_png_write(png_structp png_ptr, png_bytep data, png_size_t length) { +static void _render_png_write(png_structp png_ptr, png_bytep data, png_size_t length) { struct render_png *ctx = png_get_io_ptr(png_ptr); - if (ctx->render->io_write_fn) - if (ctx->render->io_write_fn(data, length, ctx->render->cb_arg)) { + if (ctx->io_write_fn) + if (ctx->io_write_fn(data, length, ctx->cb_arg)) { // error, doesn't return png_error(png_ptr, "_render_png_write: io_write_fn"); } } -void _render_png_flush(png_structp png_ptr) { +static void _render_png_flush(png_structp png_ptr) { struct render_png *ctx = png_get_io_ptr(png_ptr); - if (ctx->render->io_flush_fn) - if (ctx->render->io_flush_fn(ctx->render->cb_arg)) { + if (ctx->io_flush_fn) + if (ctx->io_flush_fn(ctx->cb_arg)) { // error, doesn't return png_error(png_ptr, "_render_png_flush: io_flush_fn"); } } -void _render_png_free (struct render_png *ctx) { +static void _render_png_free (struct render_png *ctx) { if (ctx) png_destroy_write_struct(&ctx->png_ptr, &ctx->info_ptr); @@ -51,8 +53,10 @@ if (!(ctx = calloc(1, sizeof(struct render_png)))) ERROR("calloc"); - // store the struct render - ctx->render = render; + // store some info from the struct render + ctx->io_write_fn = render->io_write_fn; + ctx->io_flush_fn = render->io_flush_fn; + ctx->cb_arg = render->cb_arg; // libpng initialization if (!(ctx->png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) @@ -111,6 +115,9 @@ // write end png_write_end(ctx->png_ptr, ctx->info_ptr); + + // free everything + _render_png_free(ctx); // success return 0; @@ -124,7 +131,8 @@ // libpng error handling if (setjmp(png_jmpbuf(ctx->png_ptr))) ERROR("libpng"); - + + // just free it _render_png_free(ctx); // success