if (!kds_s2000w_image_type_check_is_tiff(in))
return;
+
+ FILE* tiff_stream = fmemopen(in->data, in->size, "r");
+ TIFF* tiff = TIFFClientOpen("input.tiff", "r", tiff_stream,
+ _kds_s2000w_image_converter_tiff_read,
+ _kds_s2000w_image_converter_tiff_write,
+ _kds_s2000w_image_converter_tiff_seek,
+ _kds_s2000w_image_converter_tiff_close,
+ _kds_s2000w_image_converter_tiff_size,
+ NULL, NULL);
+
+ int width = 0;
+ int height = 0;
+ TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &width);
+ TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &height);
+
+ bit** bits = malloc(sizeof(bit*) * height);
+ for (int i = 0; i < height; i++) {
+ bits[i] = malloc(sizeof(bit) * width);
+ }
+
+ unsigned char* rowbuf = malloc(sizeof(unsigned char) * width);
+ for (int i = 0; i < height; i++) {
+ TIFFReadScanline(tiff, bits[i], i, 0);
+ }
+ free(rowbuf);
+ rowbuf = NULL;
+
+ char** outdata = malloc(sizeof(char*));
+ FILE* pnm_stream = open_memstream(outdata, &out->size);
+ pbm_writepbm(pnm_stream, bits, width, height, 0);
+ fclose(pnm_stream);
+ pnm_stream = NULL;
+
+ out->data = malloc(sizeof(char) * out->size);
+ memcpy(out->data, *outdata, out->size);
+
+ free(*outdata);
+ *outdata = NULL;
+ free(outdata);
+ outdata = NULL;
+ TIFFClose(tiff);
+ for (int i = 0; i < height; i++) {
+ free(bits[i]);
+ bits[i] = NULL;
+ }
+ free(bits);
+ bits = NULL;
}