Blame contrib/win_dib/Tiffile.cpp

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