Blame contrib/win_dib/Tiffile.cpp

Packit 994f1a
#include "StdAfx.h"
Packit 994f1a
Packit 994f1a
//#define STRICT
Packit 994f1a
#include <windows.h>
Packit 994f1a
#include <windowsx.h>
Packit 994f1a
#include <commdlg.h>
Packit 994f1a
#include <stdlib.h>                     // MAX_ constants
Packit 994f1a
#include "diblib.h"
Packit 994f1a
Packit 994f1a
/*--------------------------------------------------------------------
Packit 994f1a
        READ TIFF
Packit 994f1a
        Load the TIFF data from the file into memory.  Return
Packit 994f1a
        a pointer to a valid DIB (or NULL for errors).
Packit 994f1a
        Uses the TIFFRGBA interface to libtiff.lib to convert
Packit 994f1a
        most file formats to a useable form.  We just keep the 32 bit
Packit 994f1a
        form of the data to display, rather than optimizing for the
Packit 994f1a
        display.
Packit 994f1a
Packit 994f1a
        Main entry points:
Packit 994f1a
Packit 994f1a
            int ChkTIFF ( LPCTSTR lpszPath )
Packit 994f1a
            PVOID ReadTIFF ( LPCTSTR lpszPath )
Packit 994f1a
Packit 994f1a
        RETURN
Packit 994f1a
            A valid DIB pointer for success; NULL for failure.
Packit 994f1a
Packit 994f1a
  --------------------------------------------------------------------*/
Packit 994f1a
Packit 994f1a
#include "TiffLib/tiff.h"
Packit 994f1a
#include "TiffLib/tiffio.h"
Packit 994f1a
#include <assert.h>
Packit 994f1a
#include <stdio.h>
Packit 994f1a
Packit 994f1a
Packit 994f1a
// piggyback some data on top of the RGBA Image
Packit 994f1a
struct TIFFDibImage {
Packit 994f1a
    TIFFRGBAImage tif;
Packit 994f1a
    int  dibinstalled;
Packit 994f1a
} ;
Packit 994f1a
Packit 994f1a
Packit 994f1a
HANDLE LoadTIFFinDIB(LPCTSTR lpFileName);
Packit 994f1a
HANDLE TIFFRGBA2DIB(TIFFDibImage* dib, uint32* raster)  ;
Packit 994f1a
Packit 994f1a
static void
Packit 994f1a
MyWarningHandler(const char* module, const char* fmt, va_list ap)
Packit 994f1a
{
Packit 994f1a
    // ignore all warnings (unused tags, etc)
Packit 994f1a
    return;
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
static void
Packit 994f1a
MyErrorHandler(const char* module, const char* fmt, va_list ap)
Packit 994f1a
{
Packit 994f1a
    return;
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
//  Turn off the error and warning handlers to check if a valid file.
Packit 994f1a
//  Necessary because of the way that the Doc loads images and restart files.
Packit 994f1a
int ChkTIFF ( LPCTSTR lpszPath )
Packit 994f1a
{
Packit 994f1a
    int rtn = 0;
Packit 994f1a
Packit 994f1a
    TIFFErrorHandler  eh;
Packit 994f1a
    TIFFErrorHandler  wh;
Packit 994f1a
Packit 994f1a
    eh = TIFFSetErrorHandler(NULL);
Packit 994f1a
    wh = TIFFSetWarningHandler(NULL);
Packit 994f1a
Packit 994f1a
    TIFF* tif = TIFFOpen(lpszPath, "r");
Packit 994f1a
    if (tif) {
Packit 994f1a
        rtn = 1;
Packit 994f1a
        TIFFClose(tif);
Packit 994f1a
    }
Packit 994f1a
Packit 994f1a
    TIFFSetErrorHandler(eh);
Packit 994f1a
    TIFFSetWarningHandler(wh);
Packit 994f1a
Packit 994f1a
    return rtn;
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
void DibInstallHack(TIFFDibImage* img) ;
Packit 994f1a
Packit 994f1a
PVOID ReadTIFF ( LPCTSTR lpszPath )
Packit 994f1a
{
Packit 994f1a
    void*             pDIB = 0;
Packit 994f1a
    TIFFErrorHandler  wh;
Packit 994f1a
Packit 994f1a
    wh = TIFFSetWarningHandler(MyWarningHandler);
Packit 994f1a
Packit 994f1a
    if (ChkTIFF(lpszPath)) {
Packit 994f1a
        TIFF* tif = TIFFOpen(lpszPath, "r");
Packit 994f1a
        if (tif) {
Packit 994f1a
            char emsg[1024];
Packit 994f1a
Packit 994f1a
            if (TIFFRGBAImageOK(tif, emsg)) {
Packit 994f1a
                TIFFDibImage img;
Packit 994f1a
                char emsg[1024];
Packit 994f1a
Packit 994f1a
                if (TIFFRGBAImageBegin(&img.tif, tif, -1, emsg)) {
Packit 994f1a
                    size_t npixels;
Packit 994f1a
                    uint32* raster;
Packit 994f1a
Packit 994f1a
                    DibInstallHack(&img;;
Packit 994f1a
Packit 994f1a
                    npixels = img.tif.width * img.tif.height;
Packit 994f1a
                    raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32));
Packit 994f1a
                    if (raster != NULL) {
Packit 994f1a
                        if (TIFFRGBAImageGet(&img.tif, raster, img.tif.width, img.tif.height)) {
Packit 994f1a
                            pDIB = TIFFRGBA2DIB(&img, raster);
Packit 994f1a
                        }
Packit 994f1a
                    }
Packit 994f1a
                    _TIFFfree(raster);
Packit 994f1a
                }
Packit 994f1a
                TIFFRGBAImageEnd(&img.tif);
Packit 994f1a
            }
Packit 994f1a
            else {
Packit 994f1a
                TRACE("Unable to open image(%s): %s\n", lpszPath, emsg );
Packit 994f1a
            }
Packit 994f1a
            TIFFClose(tif);
Packit 994f1a
        }
Packit 994f1a
    }
Packit 994f1a
Packit 994f1a
    TIFFSetWarningHandler(wh);
Packit 994f1a
Packit 994f1a
    return pDIB;
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
Packit 994f1a
Packit 994f1a
HANDLE TIFFRGBA2DIB(TIFFDibImage* dib, uint32* raster)
Packit 994f1a
{
Packit 994f1a
    void*   pDIB = 0;
Packit 994f1a
    TIFFRGBAImage* img = &dib->tif;
Packit 994f1a
Packit 994f1a
    uint32 imageLength;
Packit 994f1a
    uint32 imageWidth;
Packit 994f1a
    uint16 BitsPerSample;
Packit 994f1a
    uint16 SamplePerPixel;
Packit 994f1a
    uint32 RowsPerStrip;
Packit 994f1a
    uint16 PhotometricInterpretation;
Packit 994f1a
Packit 994f1a
    BITMAPINFOHEADER   bi;
Packit 994f1a
    int                dwDIBSize ;
Packit 994f1a
Packit 994f1a
    TIFFGetField(img->tif, TIFFTAG_IMAGEWIDTH, &imageWidth);
Packit 994f1a
    TIFFGetField(img->tif, TIFFTAG_IMAGELENGTH, &imageLength);
Packit 994f1a
    TIFFGetField(img->tif, TIFFTAG_BITSPERSAMPLE, &BitsPerSample);
Packit 994f1a
    TIFFGetField(img->tif, TIFFTAG_ROWSPERSTRIP, &RowsPerStrip);
Packit 994f1a
    TIFFGetField(img->tif, TIFFTAG_SAMPLESPERPIXEL, &SamplePerPixel);
Packit 994f1a
    TIFFGetField(img->tif, TIFFTAG_PHOTOMETRIC, &PhotometricInterpretation);
Packit 994f1a
Packit 994f1a
    if ( BitsPerSample == 1 && SamplePerPixel == 1 && dib->dibinstalled ) {   // bilevel
Packit 994f1a
        bi.biSize           = sizeof(BITMAPINFOHEADER);
Packit 994f1a
        bi.biWidth          = imageWidth;
Packit 994f1a
        bi.biHeight         = imageLength;
Packit 994f1a
        bi.biPlanes         = 1;  // always
Packit 994f1a
        bi.biBitCount       = 1;
Packit 994f1a
        bi.biCompression    = BI_RGB;
Packit 994f1a
        bi.biSizeImage      = WIDTHBYTES(bi.biWidth * bi.biBitCount) * bi.biHeight;
Packit 994f1a
        bi.biXPelsPerMeter  = 0;
Packit 994f1a
        bi.biYPelsPerMeter  = 0;
Packit 994f1a
        bi.biClrUsed        = 0;  //  must be zero for RGB compression (none)
Packit 994f1a
        bi.biClrImportant   = 0;  // always
Packit 994f1a
Packit 994f1a
        // Get the size of the DIB
Packit 994f1a
        dwDIBSize = GetDIBSize( &bi );
Packit 994f1a
Packit 994f1a
        // Allocate for the BITMAPINFO structure and the color table.
Packit 994f1a
        pDIB = GlobalAllocPtr( GHND, dwDIBSize );
Packit 994f1a
        if (pDIB == 0) {
Packit 994f1a
            return( NULL );
Packit 994f1a
        }
Packit 994f1a
Packit 994f1a
        // Copy the header info
Packit 994f1a
        *((BITMAPINFOHEADER*)pDIB) = bi;
Packit 994f1a
Packit 994f1a
        // Get a pointer to the color table
Packit 994f1a
        RGBQUAD   *pRgbq = (RGBQUAD   *)((LPSTR)pDIB + sizeof(BITMAPINFOHEADER));
Packit 994f1a
Packit 994f1a
        pRgbq[0].rgbRed      = 0;
Packit 994f1a
        pRgbq[0].rgbBlue     = 0;
Packit 994f1a
        pRgbq[0].rgbGreen    = 0;
Packit 994f1a
        pRgbq[0].rgbReserved = 0;
Packit 994f1a
        pRgbq[1].rgbRed      = 255;
Packit 994f1a
        pRgbq[1].rgbBlue     = 255;
Packit 994f1a
        pRgbq[1].rgbGreen    = 255;
Packit 994f1a
        pRgbq[1].rgbReserved = 255;
Packit 994f1a
Packit 994f1a
        // Pointers to the bits
Packit 994f1a
        //PVOID pbiBits = (LPSTR)pRgbq + bi.biClrUsed * sizeof(RGBQUAD);
Packit 994f1a
        //
Packit 994f1a
        // In the BITMAPINFOHEADER documentation, it appears that
Packit 994f1a
        // there should be no color table for 32 bit images, but
Packit 994f1a
        // experience shows that the image is off by 3 words if it
Packit 994f1a
        // is not included.  So here it is.
Packit 994f1a
        PVOID pbiBits = GetDIBImagePtr((BITMAPINFOHEADER*)pDIB);  //(LPSTR)pRgbq + 3 * sizeof(RGBQUAD);
Packit 994f1a
Packit 994f1a
        int       sizeWords = bi.biSizeImage/4;
Packit 994f1a
        RGBQUAD*  rgbDib = (RGBQUAD*)pbiBits;
Packit 994f1a
        long*     rgbTif = (long*)raster;
Packit 994f1a
Packit 994f1a
        _TIFFmemcpy(pbiBits, raster, bi.biSizeImage);
Packit 994f1a
    }
Packit 994f1a
Packit 994f1a
        //  For now just always default to the RGB 32 bit form.                                                       // save as 32 bit for simplicity
Packit 994f1a
    else if ( true /*BitsPerSample == 8 && SamplePerPixel == 3*/ ) {   // 24 bit color
Packit 994f1a
Packit 994f1a
        bi.biSize           = sizeof(BITMAPINFOHEADER);
Packit 994f1a
        bi.biWidth          = imageWidth;
Packit 994f1a
        bi.biHeight         = imageLength;
Packit 994f1a
        bi.biPlanes         = 1;  // always
Packit 994f1a
        bi.biBitCount       = 32;
Packit 994f1a
        bi.biCompression    = BI_RGB;
Packit 994f1a
        bi.biSizeImage      = WIDTHBYTES(bi.biWidth * bi.biBitCount) * bi.biHeight;
Packit 994f1a
        bi.biXPelsPerMeter  = 0;
Packit 994f1a
        bi.biYPelsPerMeter  = 0;
Packit 994f1a
        bi.biClrUsed        = 0;  //  must be zero for RGB compression (none)
Packit 994f1a
        bi.biClrImportant   = 0;  // always
Packit 994f1a
Packit 994f1a
        // Get the size of the DIB
Packit 994f1a
        dwDIBSize = GetDIBSize( &bi );
Packit 994f1a
Packit 994f1a
        // Allocate for the BITMAPINFO structure and the color table.
Packit 994f1a
        pDIB = GlobalAllocPtr( GHND, dwDIBSize );
Packit 994f1a
        if (pDIB == 0) {
Packit 994f1a
            return( NULL );
Packit 994f1a
        }
Packit 994f1a
Packit 994f1a
        // Copy the header info
Packit 994f1a
        *((BITMAPINFOHEADER*)pDIB) = bi;
Packit 994f1a
Packit 994f1a
        // Get a pointer to the color table
Packit 994f1a
        RGBQUAD   *pRgbq = (RGBQUAD   *)((LPSTR)pDIB + sizeof(BITMAPINFOHEADER));
Packit 994f1a
Packit 994f1a
        // Pointers to the bits
Packit 994f1a
        //PVOID pbiBits = (LPSTR)pRgbq + bi.biClrUsed * sizeof(RGBQUAD);
Packit 994f1a
        //
Packit 994f1a
        // In the BITMAPINFOHEADER documentation, it appears that
Packit 994f1a
        // there should be no color table for 32 bit images, but
Packit 994f1a
        // experience shows that the image is off by 3 words if it
Packit 994f1a
        // is not included.  So here it is.
Packit 994f1a
        PVOID pbiBits = (LPSTR)pRgbq + 3 * sizeof(RGBQUAD);
Packit 994f1a
Packit 994f1a
        int       sizeWords = bi.biSizeImage/4;
Packit 994f1a
        RGBQUAD*  rgbDib = (RGBQUAD*)pbiBits;
Packit 994f1a
        long*     rgbTif = (long*)raster;
Packit 994f1a
Packit 994f1a
        // Swap the byte order while copying
Packit 994f1a
        for ( int i = 0 ; i < sizeWords ; ++i )
Packit 994f1a
        {
Packit 994f1a
            rgbDib[i].rgbRed   = TIFFGetR(rgbTif[i]);
Packit 994f1a
            rgbDib[i].rgbBlue  = TIFFGetB(rgbTif[i]);
Packit 994f1a
            rgbDib[i].rgbGreen = TIFFGetG(rgbTif[i]);
Packit 994f1a
            rgbDib[i].rgbReserved = 0;
Packit 994f1a
        }
Packit 994f1a
    }
Packit 994f1a
Packit 994f1a
    return pDIB;
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
Packit 994f1a
Packit 994f1a
Packit 994f1a
///////////////////////////////////////////////////////////////
Packit 994f1a
//
Packit 994f1a
//  Hacked from tif_getimage.c in libtiff in v3.5.7
Packit 994f1a
//
Packit 994f1a
//
Packit 994f1a
typedef unsigned char u_char;
Packit 994f1a
Packit 994f1a
Packit 994f1a
#define DECLAREContigPutFunc(name) \
Packit 994f1a
static void name(\
Packit 994f1a
    TIFFRGBAImage* img, \
Packit 994f1a
    uint32* cp, \
Packit 994f1a
    uint32 x, uint32 y, \
Packit 994f1a
    uint32 w, uint32 h, \
Packit 994f1a
    int32 fromskew, int32 toskew, \
Packit 994f1a
    u_char* pp \
Packit 994f1a
)
Packit 994f1a
Packit 994f1a
#define DECLARESepPutFunc(name) \
Packit 994f1a
static void name(\
Packit 994f1a
    TIFFRGBAImage* img,\
Packit 994f1a
    uint32* cp,\
Packit 994f1a
    uint32 x, uint32 y, \
Packit 994f1a
    uint32 w, uint32 h,\
Packit 994f1a
    int32 fromskew, int32 toskew,\
Packit 994f1a
    u_char* r, u_char* g, u_char* b, u_char* a\
Packit 994f1a
)
Packit 994f1a
Packit 994f1a
DECLAREContigPutFunc(putContig1bitTile);
Packit 994f1a
static int getStripContig1Bit(TIFFRGBAImage* img, uint32* uraster, uint32 w, uint32 h);
Packit 994f1a
Packit 994f1a
//typdef struct TIFFDibImage {
Packit 994f1a
//    TIFFRGBAImage tif;
Packit 994f1a
//    dibinstalled;
Packit 994f1a
//} TIFFDibImage ;
Packit 994f1a
Packit 994f1a
void DibInstallHack(TIFFDibImage* dib) {
Packit 994f1a
    TIFFRGBAImage* img = &dib->tif;
Packit 994f1a
    dib->dibinstalled = false;
Packit 994f1a
    switch (img->photometric) {
Packit 994f1a
        case PHOTOMETRIC_MINISWHITE:
Packit 994f1a
        case PHOTOMETRIC_MINISBLACK:
Packit 994f1a
        switch (img->bitspersample) {
Packit 994f1a
            case 1:
Packit 994f1a
                img->put.contig = putContig1bitTile;
Packit 994f1a
                img->get = getStripContig1Bit;
Packit 994f1a
                dib->dibinstalled = true;
Packit 994f1a
                break;
Packit 994f1a
        }
Packit 994f1a
        break;
Packit 994f1a
    }
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * 1-bit packed samples => 1-bit
Packit 994f1a
 *
Packit 994f1a
 *   Override to just copy the data
Packit 994f1a
 */
Packit 994f1a
DECLAREContigPutFunc(putContig1bitTile)
Packit 994f1a
{
Packit 994f1a
    int samplesperpixel = img->samplesperpixel;
Packit 994f1a
Packit 994f1a
    (void) y;
Packit 994f1a
    fromskew *= samplesperpixel;
Packit 994f1a
    int wb = WIDTHBYTES(w);
Packit 994f1a
    u_char*  ucp = (u_char*)cp;
Packit 994f1a
Packit 994f1a
    /* Conver 'w' to bytes from pixels (rounded up) */
Packit 994f1a
    w = (w+7)/8;
Packit 994f1a
Packit 994f1a
    while (h-- > 0) {
Packit 994f1a
        _TIFFmemcpy(ucp, pp, w);
Packit 994f1a
        /*
Packit 994f1a
        for (x = wb; x-- > 0;) {
Packit 994f1a
            *cp++ = rgbi(Map[pp[0]], Map[pp[1]], Map[pp[2]]);
Packit 994f1a
            pp += samplesperpixel;
Packit 994f1a
        }
Packit 994f1a
        */
Packit 994f1a
        ucp += (wb + toskew);
Packit 994f1a
        pp += (w + fromskew);
Packit 994f1a
    }
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 *  Hacked from the tif_getimage.c file.
Packit 994f1a
 */
Packit 994f1a
static uint32
Packit 994f1a
setorientation(TIFFRGBAImage* img, uint32 h)
Packit 994f1a
{
Packit 994f1a
    TIFF* tif = img->tif;
Packit 994f1a
    uint32 y;
Packit 994f1a
Packit 994f1a
    switch (img->orientation) {
Packit 994f1a
    case ORIENTATION_BOTRIGHT:
Packit 994f1a
    case ORIENTATION_RIGHTBOT:  /* XXX */
Packit 994f1a
    case ORIENTATION_LEFTBOT:   /* XXX */
Packit 994f1a
    TIFFWarning(TIFFFileName(tif), "using bottom-left orientation");
Packit 994f1a
    img->orientation = ORIENTATION_BOTLEFT;
Packit 994f1a
    /* fall thru... */
Packit 994f1a
    case ORIENTATION_BOTLEFT:
Packit 994f1a
    y = 0;
Packit 994f1a
    break;
Packit 994f1a
    case ORIENTATION_TOPRIGHT:
Packit 994f1a
    case ORIENTATION_RIGHTTOP:  /* XXX */
Packit 994f1a
    case ORIENTATION_LEFTTOP:   /* XXX */
Packit 994f1a
    default:
Packit 994f1a
    TIFFWarning(TIFFFileName(tif), "using top-left orientation");
Packit 994f1a
    img->orientation = ORIENTATION_TOPLEFT;
Packit 994f1a
    /* fall thru... */
Packit 994f1a
    case ORIENTATION_TOPLEFT:
Packit 994f1a
    y = h-1;
Packit 994f1a
    break;
Packit 994f1a
    }
Packit 994f1a
    return (y);
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Get a strip-organized image that has
Packit 994f1a
 *  PlanarConfiguration contiguous if SamplesPerPixel > 1
Packit 994f1a
 * or
Packit 994f1a
 *  SamplesPerPixel == 1
Packit 994f1a
 *
Packit 994f1a
 *  Hacked from the tif_getimage.c file.
Packit 994f1a
 *
Packit 994f1a
 *    This is set up to allow us to just copy the data to the raster
Packit 994f1a
 *    for 1-bit bitmaps
Packit 994f1a
 */
Packit 994f1a
static int
Packit 994f1a
getStripContig1Bit(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
Packit 994f1a
{
Packit 994f1a
    TIFF* tif = img->tif;
Packit 994f1a
    tileContigRoutine put = img->put.contig;
Packit 994f1a
    uint16 orientation;
Packit 994f1a
    uint32 row, y, nrow, rowstoread;
Packit 994f1a
    uint32 pos;
Packit 994f1a
    u_char* buf;
Packit 994f1a
    uint32 rowsperstrip;
Packit 994f1a
    uint32 imagewidth = img->width;
Packit 994f1a
    tsize_t scanline;
Packit 994f1a
    int32 fromskew, toskew;
Packit 994f1a
    tstrip_t strip;
Packit 994f1a
    tsize_t  stripsize;
Packit 994f1a
    u_char* braster = (u_char*)raster; // byte wide raster
Packit 994f1a
    uint32  wb = WIDTHBYTES(w);
Packit 994f1a
    int ret = 1;
Packit 994f1a
Packit 994f1a
    buf = (u_char*) _TIFFmalloc(TIFFStripSize(tif));
Packit 994f1a
    if (buf == 0) {
Packit 994f1a
        TIFFErrorExt(tif->tif_clientdata, TIFFFileName(tif), "No space for strip buffer");
Packit 994f1a
        return (0);
Packit 994f1a
    }
Packit 994f1a
    y = setorientation(img, h);
Packit 994f1a
    orientation = img->orientation;
Packit 994f1a
    toskew = -(int32) (orientation == ORIENTATION_TOPLEFT ? wb+wb : wb-wb);
Packit 994f1a
    TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
Packit 994f1a
    scanline = TIFFScanlineSize(tif);
Packit 994f1a
    fromskew = (w < imagewidth ? imagewidth - w : 0)/8;
Packit 994f1a
    for (row = 0; row < h; row += nrow)
Packit 994f1a
    {
Packit 994f1a
        rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
Packit 994f1a
        nrow = (row + rowstoread > h ? h - row : rowstoread);
Packit 994f1a
        strip = TIFFComputeStrip(tif,row+img->row_offset, 0);
Packit 994f1a
        stripsize = ((row + img->row_offset)%rowsperstrip + nrow) * scanline;
Packit 994f1a
        if (TIFFReadEncodedStrip(tif, strip, buf, stripsize ) < 0
Packit 994f1a
            && img->stoponerr)
Packit 994f1a
        {
Packit 994f1a
            ret = 0;
Packit 994f1a
            break;
Packit 994f1a
        }
Packit 994f1a
Packit 994f1a
        pos = ((row + img->row_offset) % rowsperstrip) * scanline;
Packit 994f1a
        (*put)(img, (uint32*)(braster+y*wb), 0, y, w, nrow, fromskew, toskew, buf + pos);
Packit 994f1a
        y += (orientation == ORIENTATION_TOPLEFT ?-(int32) nrow : (int32) nrow);
Packit 994f1a
    }
Packit 994f1a
    _TIFFfree(buf);
Packit 994f1a
    return (ret);
Packit 994f1a
}
Packit 994f1a
Packit 994f1a
/*
Packit 994f1a
 * Local Variables:
Packit 994f1a
 * mode: c++
Packit 994f1a
 * c-basic-offset: 8
Packit 994f1a
 * fill-column: 78
Packit 994f1a
 * End:
Packit 994f1a
 */