]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagtiff.cpp
VA 4.0 fixes
[wxWidgets.git] / src / common / imagtiff.cpp
index 1ca0a0d0f788e5d95d650ab92c87a5f78c6c64ca..4fb132a42dbef10db0df55d22de323167317e506 100644 (file)
@@ -1,16 +1,15 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        imagjpeg.cpp
-// Purpose:     wxImage JPEG handler
-// Author:      Vaclav Slavik
+// Name:        imagtiff.cpp
+// Purpose:     wxImage TIFF handler
+// Author:      Robert Roebling
 // RCS-ID:      $Id$
-// Copyright:   (c) Vaclav Slavik
+// Copyright:   (c) Robert Roebling
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-/*
-   We don't put pragma implement in this file because it is already present in
-   src/common/image.cpp
-*/
+#ifdef __GNUG__
+#pragma implementation "imagtiff.h"
+#endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
@@ -23,7 +22,7 @@
 
 #if wxUSE_LIBTIFF
 
-#include "wx/image.h"
+#include "wx/imagtiff.h"
 #include "wx/bitmap.h"
 #include "wx/debug.h"
 #include "wx/log.h"
@@ -43,9 +42,7 @@ extern "C"
 // wxTIFFHandler
 //-----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxTIFFHandler,wxImageHandler)
-#endif
 
 static tsize_t
 _tiffReadProc(thandle_t handle, tdata_t buf, tsize_t size)
@@ -75,7 +72,7 @@ _tiffSeekProc(thandle_t handle, toff_t off, int whence)
         case SEEK_END: mode = wxFromEnd; break;
         default:       mode = wxFromCurrent; break;
     }
-    
+
     return (toff_t)stream->SeekI( (off_t)off, mode );
 }
 
@@ -93,13 +90,17 @@ _tiffSizeProc(thandle_t handle)
 }
 
 static int
-_tiffMapProc(thandle_t WXUNUSED(handle), tdata_t* pbase, toff_t* psize)
+_tiffMapProc(thandle_t WXUNUSED(handle),
+             tdata_t* WXUNUSED(pbase),
+             toff_t* WXUNUSED(psize))
 {
     return 0;
 }
 
 static void
-_tiffUnmapProc(thandle_t WXUNUSED(handle), tdata_t base, toff_t size)
+_tiffUnmapProc(thandle_t WXUNUSED(handle),
+               tdata_t WXUNUSED(base),
+               toff_t WXUNUSED(size))
 {
 }
 
@@ -114,111 +115,138 @@ TIFFwxOpen(wxInputStream &stream, const char* name, const char* mode)
 
     if (tif)
         tif->tif_fd = (int) &stream;
-       
+
     return tif;
 }
 
 
-bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose )
+bool wxTIFFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int index )
 {
     image->Destroy();
-    
+
     TIFF *tif = TIFFwxOpen( stream, "image", "r" );
-    
+
     if (!tif)
     {
         if (verbose)
-            wxLogError( _("Error loading TIFF image.") );
-           
-       return FALSE;
+            wxLogError( _("TIFF: Error loading image.") );
+
+        return FALSE;
+    }
+
+    if (!TIFFSetDirectory( tif, (tdir_t)index ))
+    {
+        if (verbose)
+            wxLogError( _("Invalid TIFF image index.") );
+
+        TIFFClose( tif );
+
+        return FALSE;
     }
 
     uint32 w, h;
-    size_t npixels;
+    uint32 npixels;
     uint32 *raster;
-    
+
     TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &w );
     TIFFGetField( tif, TIFFTAG_IMAGELENGTH, &h );
-    
+
     npixels = w * h;
-    
+
     raster = (uint32*) _TIFFmalloc( npixels * sizeof(uint32) );
-    
+
     if (!raster)
     {
         if (verbose)
-            wxLogError( _("Not enough memory for loading TIFF image.") );
-           
-       return FALSE;
+            wxLogError( _("TIFF: Couldn't allocate memory.") );
+
+        return FALSE;
     }
 
-    image->Create( w, h );
-    if (!image->Ok()) 
+    image->Create( (int)w, (int)h );
+    if (!image->Ok())
     {
         if (verbose)
-            wxLogError( _("Not enough memory for loading TIFF image.") );
-           
-       _TIFFfree( raster );
-       
+            wxLogError( _("TIFF: Couldn't allocate memory.") );
+
+        _TIFFfree( raster );
+
         return FALSE;
     }
-    
+
     if (!TIFFReadRGBAImage( tif, w, h, raster, 0 ))
     {
         if (verbose)
-            wxLogError( _("Error reading TIFF image.") );
-           
-       _TIFFfree( raster );
-       image->Destroy();
-       
-       return FALSE;
+            wxLogError( _("TIFF: Error reading image.") );
+
+        _TIFFfree( raster );
+        image->Destroy();
+
+        return FALSE;
     }
-    
+
     bool hasmask = FALSE;
-    
+
     unsigned char *ptr = image->GetData();
+    ptr += w*3*(h-1);
     uint32 pos = 0;
-    
+
     for (uint32 i = 0; i < h; i++)
     {
-        for (uint32 j = 0; w < h; j++)
-       {
-           unsigned char alpha = (unsigned char)(raster[pos] >> 24);
-           if (alpha < 127)
-           {
-               hasmask = TRUE;
-               ptr[0] = image->GetMaskRed();
-               ptr++;
-               ptr[0] = image->GetMaskGreen();
-               ptr++;
-               ptr[0] = image->GetMaskBlue();
-               ptr++;
-           }
-           else
-           {
-               ptr[0] = (unsigned char)(raster[pos] >> 16);
-               ptr++;
-               ptr[0] = (unsigned char)(raster[pos] >> 8);
-               ptr++;
-               ptr[0] = (unsigned char)(raster[pos]);
-               ptr++;
-           }
-           pos++;
-       }
+        for (uint32 j = 0; j < w; j++)
+        {
+            unsigned char alpha = (unsigned char)TIFFGetA(raster[pos]);
+            if (alpha < 127)
+            {
+                hasmask = TRUE;
+                ptr[0] = image->GetMaskRed();
+                ptr++;
+                ptr[0] = image->GetMaskGreen();
+                ptr++;
+                ptr[0] = image->GetMaskBlue();
+                ptr++;
+            }
+            else
+            {
+                ptr[0] = (unsigned char)TIFFGetR(raster[pos]);
+                ptr++;
+                ptr[0] = (unsigned char)TIFFGetG(raster[pos]);
+                ptr++;
+                ptr[0] = (unsigned char)TIFFGetB(raster[pos]);
+                ptr++;
+            }
+            pos++;
+        }
+        ptr -= 2*w*3; // subtract line we just added plus one line
     }
-    
+
     _TIFFfree( raster );
-    
+
     TIFFClose( tif );
-       
+
     image->SetMask( hasmask );
-    
+
     return TRUE;
 }
 
+int wxTIFFHandler::GetImageCount( wxInputStream& stream )
+{
+    TIFF *tif = TIFFwxOpen( stream, "image", "r" );
+
+    if (!tif)
+        return 0;
+
+    int dircount = 0;  // according to the libtiff docs, dircount should be set to 1 here???
+    do {
+        dircount++;
+    } while (TIFFReadDirectory(tif));
 
+    TIFFClose( tif );
 
-bool wxTIFFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose )
+    return dircount;
+}
+
+bool wxTIFFHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream), bool WXUNUSED(verbose) )
 {
     return FALSE;
 }
@@ -229,7 +257,7 @@ bool wxTIFFHandler::DoCanRead( wxInputStream& stream )
 
     stream.Read(&hdr, 2);
     stream.SeekI(-2, wxFromCurrent);
-    
+
     return ((hdr[0] == 0x49 && hdr[1] == 0x49) ||
             (hdr[0] == 0x4D && hdr[1] == 0x4D));
 }