diff options
Diffstat (limited to 'src/tiff_binfile.c')
-rw-r--r-- | src/tiff_binfile.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/tiff_binfile.c b/src/tiff_binfile.c new file mode 100644 index 0000000..e782b94 --- /dev/null +++ b/src/tiff_binfile.c @@ -0,0 +1,139 @@ +/** \file + * \brief libTIFF I/O and error handlers. + * I/O uses imBinFile instead of libTIFF original handlers. + * + * See Copyright Notice in im_lib.h + * $Id: tiff_binfile.c,v 1.1 2008/10/17 06:10:16 scuri Exp $ + */ + +#include "tiffiop.h" + +#include "im_binfile.h" + +#include <stdlib.h> +#include <memory.h> + +static tsize_t iTIFFReadProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + imBinFile* file_bin = (imBinFile*)fd; + return imBinFileRead(file_bin, buf, size, 1); +} + +static tsize_t iTIFFWriteProc(thandle_t fd, tdata_t buf, tsize_t size) +{ + imBinFile* file_bin = (imBinFile*)fd; + return imBinFileWrite(file_bin, buf, size, 1); +} + +static toff_t iTIFFSeekProc(thandle_t fd, toff_t off, int whence) +{ + imBinFile* file_bin = (imBinFile*)fd; + switch (whence) + { + case SEEK_SET: + imBinFileSeekTo(file_bin, off); + break; + case SEEK_CUR: + imBinFileSeekOffset(file_bin, off); + break; + case SEEK_END: + imBinFileSeekFrom(file_bin, off); + break; + } + + return imBinFileTell(file_bin); +} + +static int iTIFFCloseProc(thandle_t fd) +{ + imBinFile* file_bin = (imBinFile*)fd; + imBinFileClose(file_bin); + return 0; +} + +static toff_t iTIFFSizeProc(thandle_t fd) +{ + imBinFile* file_bin = (imBinFile*)fd; + return imBinFileSize(file_bin); +} + +static int iTIFFMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize) +{ + (void) fd; (void) pbase; (void) psize; + return (0); +} + +static void iTIFFUnmapProc(thandle_t fd, tdata_t base, toff_t size) +{ + (void) fd; (void) base; (void) size; +} + +TIFF* TIFFFdOpen(int fd, const char* name, const char* mode) +{ + TIFF* tif; + + tif = TIFFClientOpen(name, mode, (thandle_t) fd, iTIFFReadProc, iTIFFWriteProc, + iTIFFSeekProc, iTIFFCloseProc, + iTIFFSizeProc, iTIFFMapProc, + iTIFFUnmapProc); + if (tif) + tif->tif_fd = fd; + + return (tif); +} + +TIFF* TIFFOpen(const char* name, const char* mode) +{ + imBinFile* bin_file; + TIFF* tiff; + + if (mode[0] == 'r') + bin_file = imBinFileOpen(name); + else + bin_file = imBinFileNew(name); + + if (!bin_file) + return NULL; + + tiff = TIFFClientOpen(name, mode, (thandle_t)bin_file, iTIFFReadProc, iTIFFWriteProc, + iTIFFSeekProc, iTIFFCloseProc, + iTIFFSizeProc, iTIFFMapProc, + iTIFFUnmapProc); + if (!tiff) + imBinFileClose(bin_file); + + return tiff; +} + +void* _TIFFmalloc(tsize_t s) +{ + return (malloc((size_t) s)); +} + +void _TIFFfree(tdata_t p) +{ + free(p); +} + +void* _TIFFrealloc(tdata_t p, tsize_t s) +{ + return (realloc(p, (size_t) s)); +} + +void _TIFFmemset(tdata_t p, int v, tsize_t c) +{ + memset(p, v, (size_t) c); +} + +void _TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c) +{ + memcpy(d, s, (size_t) c); +} + +int _TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c) +{ + return (memcmp(p1, p2, (size_t) c)); +} + +TIFFErrorHandler _TIFFwarningHandler = NULL; +TIFFErrorHandler _TIFFerrorHandler = NULL; |