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