// // Copyright 2006 Johannes Hofmann // // This software may be used and distributed according to the terms // of the GNU General Public License, incorporated herein by reference. #include #include #include #include "TIFFOutputImage.H" TIFFOutputImage::TIFFOutputImage(const char *f) { file = strdup(f); tiff = NULL; row = NULL; } TIFFOutputImage::~TIFFOutputImage() { if (row) { free(row); } if (file) { free(file); } } int TIFFOutputImage::init_internal(int w1, int h1) { if (row) { free(row); row = NULL; } row = (unsigned char*) malloc(sizeof(char) * 4 * w1); if (!row) { perror("malloc"); return 1; } memset(row, 0, sizeof(char) * 4 * w1); if (tiff) { TIFFClose(tiff); } if((tiff = TIFFOpen(file, "w")) == NULL){ fprintf(stderr, "can't open %s\n", file); return 1; } TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w1); TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h1); TIFFSetField(tiff, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE); TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, 1); TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 4); return 0; } int TIFFOutputImage::set_pixel_internal(int x, int r, int g, int b) { row[x*4+0] = (unsigned char) (r / 255); row[x*4+1] = (unsigned char) (g / 255); row[x*4+2] = (unsigned char) (b / 255); row[x*4+3] = 255; return 0; } int TIFFOutputImage::next_line_internal() { TIFFWriteEncodedStrip(tiff, line -1 , row, W * 4); memset(row, 0, sizeof(char) * 4 * W); return 0; } int TIFFOutputImage::done_internal() { if (tiff) { TIFFClose(tiff); tiff = NULL; } if (row) { free(row); row = NULL; } return 0; }