From: Bastian Dehn Date: Fri, 14 Feb 2025 18:34:44 +0000 (+0100) Subject: change read tiff from memory X-Git-Tag: v1.0.36^2~9 X-Git-Url: https://gitweb.hhaalo.de/?a=commitdiff_plain;h=a8a5dcdea95de81124811265ce3a66f375dbd35b;p=sane-kds-s2000w-net.git change read tiff from memory --- diff --git a/src/kds_s2000w_image_converter_netpbm.c b/src/kds_s2000w_image_converter_netpbm.c index 77e685f..14d94b3 100644 --- a/src/kds_s2000w_image_converter_netpbm.c +++ b/src/kds_s2000w_image_converter_netpbm.c @@ -19,30 +19,68 @@ enum imgformat { RGB = 3 }; +typedef struct { + blobdata* image; + toff_t curr_offset; +} tiff_reader; + tsize_t _kds_s2000w_image_converter_tiff_read(thandle_t handler, tdata_t data, tsize_t size) { - return fread(data, sizeof(char), size, handler); + tiff_reader* reader = (tiff_reader*) handler; + char* imagedata = (char*) reader->image->data; + memcpy(data, &imagedata[reader->curr_offset], size); + reader->curr_offset += size; + + return size; } tsize_t _kds_s2000w_image_converter_tiff_write(thandle_t handler, tdata_t data, tsize_t size) { - return fwrite(data, sizeof(char), size, handler); + tiff_reader* writer = (tiff_reader*) handler; + char* imagedata = (char*) writer->image->data; + memcpy(&imagedata[writer->curr_offset], data, size); + writer->curr_offset += size; + + return size; } toff_t _kds_s2000w_image_converter_tiff_seek(thandle_t handler, toff_t offset, int whence) { - fseek(handler, offset, whence); - return ftell(handler); + tiff_reader* reader = (tiff_reader*) handler; + + switch (whence) { + case SEEK_SET: + reader->curr_offset = offset; + break; + case SEEK_CUR: + reader->curr_offset += offset; + break; + case SEEK_END: + reader->curr_offset = reader->image->size - 1; + reader->curr_offset += offset; + break; + default: + break; + } + + return reader->curr_offset; } int _kds_s2000w_image_converter_tiff_close(thandle_t handler) { - return fclose(handler); + tiff_reader* reader = (tiff_reader*) handler; + + free(reader); + reader = NULL; + + return 0; } toff_t _kds_s2000w_image_converter_tiff_size(thandle_t handler) { - return ftell(handler); + tiff_reader* reader = (tiff_reader*) handler; + + return reader->curr_offset; } uint32_t _kds_s2000w_image_converter_find_char(blobdata* image, uint32_t start, const char cfind) @@ -78,8 +116,10 @@ uint32_t _kds_s2000w_image_converter_get_number_from_substring(char* data, uint3 void _kds_s2000w_image_converter_tiff_metadata(blobdata* image, image_metadata* mdata) { - FILE* input = fmemopen(image->data, image->size, "r"); - TIFF* tiff = TIFFClientOpen("input.tiff", "r", input, + tiff_reader* tiff_handler = malloc(sizeof(tiff_reader)); + tiff_handler->image = image; + tiff_handler->curr_offset = 0; + TIFF* tiff = TIFFClientOpen("input.tiff", "r", (thandle_t) tiff_handler, _kds_s2000w_image_converter_tiff_read, _kds_s2000w_image_converter_tiff_write, _kds_s2000w_image_converter_tiff_seek, @@ -333,8 +373,10 @@ void _kds_s2000w_image_converter_tiff_to_pnm(blobdata* in, blobdata* out) { kds_s2000w_debug_printf(ALL, "kds_s2000w_image_converter_tiff_to_pnm"); - FILE* tiff_stream = fmemopen(in->data, in->size, "r"); - TIFF* tiff = TIFFClientOpen("input.tiff", "r", tiff_stream, + tiff_reader* tiff_handler = malloc(sizeof(tiff_reader)); + tiff_handler->image = in; + tiff_handler->curr_offset = 0; + TIFF* tiff = TIFFClientOpen("input.tiff", "r", (thandle_t*) tiff_handler, _kds_s2000w_image_converter_tiff_read, _kds_s2000w_image_converter_tiff_write, _kds_s2000w_image_converter_tiff_seek,