]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/image.cpp
JPEG handler does not read entire file into memory anymore (+, of course, that header...
[wxWidgets.git] / src / common / image.cpp
index 96d3c58d8a6059040ebdb95150dcbab598ae236b..4a7a6a4a1a6f052391cbcd0544c99cac8ffbf9ad 100644 (file)
@@ -45,7 +45,6 @@
 
 class wxImageRefData: public wxObjectRefData
 {
-
 public:
     wxImageRefData();
     ~wxImageRefData();
@@ -72,7 +71,8 @@ wxImageRefData::wxImageRefData()
 
 wxImageRefData::~wxImageRefData()
 {
-    if (m_data) free( m_data );
+    if (m_data) 
+        free( m_data );
 }
 
 wxList wxImage::sm_handlers;
@@ -81,9 +81,7 @@ wxList wxImage::sm_handlers;
 
 #define M_IMGDATA ((wxImageRefData *)m_refData)
 
-#if !USE_SHARED_LIBRARIES
     IMPLEMENT_DYNAMIC_CLASS(wxImage, wxObject)
-#endif
 
 wxImage::wxImage()
 {
@@ -195,8 +193,8 @@ wxImage wxImage::GetSubImage( const wxRect &rect ) const
 
     wxCHECK_MSG( Ok(), image, wxT("invalid image") );
 
-    wxCHECK_MSG( (rect.GetLeft()>=0) && (rect.GetTop()>=0) && (rect.GetRight()<=GetWidth()) && (rect.GetBottom()<=GetHeight())
-                 image, wxT("invalid subimage size") );
+    wxCHECK_MSG( (rect.GetLeft()>=0) && (rect.GetTop()>=0) && (rect.GetRight()<=GetWidth()) && (rect.GetBottom()<=GetHeight()),
+                 image, wxT("invalid subimage size") );
 
     int subwidth=rect.GetWidth();
     const int subheight=rect.GetHeight();
@@ -381,11 +379,12 @@ bool wxImage::LoadFile( const wxString& filename, long type )
     if (wxFileExists(filename))
     {
         wxFileInputStream stream(filename);
-        return LoadFile(stream, type);
+       wxBufferedInputStream bstream( stream );
+        return LoadFile(bstream, type);
     }
-
-    else {
-        wxLogError( wxT("Can't load image from file '%s': file does not exist."), filename.c_str() );
+    else 
+    {
+        wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() );
 
         return FALSE;
     }
@@ -400,11 +399,12 @@ bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype )
     if (wxFileExists(filename))
     {
         wxFileInputStream stream(filename);
-        return LoadFile(stream, mimetype);
+       wxBufferedInputStream bstream( stream );
+        return LoadFile(bstream, mimetype);
     }
-
-    else {
-        wxLogError( wxT("Can't load image from file '%s': file does not exist."), filename.c_str() );
+    else 
+    {
+        wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() );
 
         return FALSE;
     }
@@ -419,7 +419,10 @@ bool wxImage::SaveFile( const wxString& filename, int type )
     wxFileOutputStream stream(filename);
 
     if ( stream.LastError() == wxStream_NOERROR )
-        return SaveFile(stream, type);
+    {
+       wxBufferedOutputStream bstream( stream );
+        return SaveFile(bstream, type);
+    }
     else
 #endif // wxUSE_STREAMS
         return FALSE;
@@ -431,7 +434,10 @@ bool wxImage::SaveFile( const wxString& filename, const wxString& mimetype )
     wxFileOutputStream stream(filename);
 
     if ( stream.LastError() == wxStream_NOERROR )
-        return SaveFile(stream, mimetype);
+    {
+       wxBufferedOutputStream bstream( stream );
+        return SaveFile(bstream, mimetype);
+    }
     else
 #endif // wxUSE_STREAMS
         return FALSE;
@@ -483,7 +489,7 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
 
         }
 
-        wxLogWarning( wxT("No handler found for this image.") );
+        wxLogWarning( _("No handler found for image type.") );
         return FALSE;
     }
 
@@ -491,7 +497,7 @@ bool wxImage::LoadFile( wxInputStream& stream, long type )
 
     if (handler == NULL)
     {
-        wxLogWarning( wxT("No image handler for type %d defined."), type );
+        wxLogWarning( _("No image handler for type %d defined."), type );
 
         return FALSE;
     }
@@ -509,7 +515,7 @@ bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype )
 
     if (handler == NULL)
     {
-        wxLogWarning( wxT("No image handler for type %s defined."), mimetype.GetData() );
+        wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() );
 
         return FALSE;
     }
@@ -525,7 +531,7 @@ bool wxImage::SaveFile( wxOutputStream& stream, int type )
 
     if (handler == NULL)
     {
-        wxLogWarning( wxT("No image handler for type %d defined."), type );
+        wxLogWarning( _("No image handler for type %d defined."), type );
 
         return FALSE;
     }
@@ -541,7 +547,7 @@ bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype )
 
     if (handler == NULL)
     {
-        wxLogWarning( wxT("No image handler for type %s defined."), mimetype.GetData() );
+        wxLogWarning( _("No image handler for type %s defined."), mimetype.GetData() );
 
         return FALSE;
     }
@@ -651,12 +657,10 @@ void wxImage::CleanUpHandlers()
 // wxImageHandler
 //-----------------------------------------------------------------------------
 
-#if !USE_SHARED_LIBRARIES
 IMPLEMENT_ABSTRACT_CLASS(wxImageHandler,wxObject)
-#endif
 
 #if wxUSE_STREAMS
-bool wxImageHandler::LoadFile( wxImage *WXUNUSED(image), wxInputStream& WXUNUSED(stream), bool WXUNUSED(verbose) )
+bool wxImageHandler::LoadFile( wxImage *WXUNUSED(image), wxInputStream& WXUNUSED(stream), bool WXUNUSED(verbose), int WXUNUSED(index) )
 {
     return FALSE;
 }
@@ -666,9 +670,13 @@ bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSE
     return FALSE;
 }
 
+int wxImageHandler::GetImageCount( wxInputStream& WXUNUSED(stream) )
+{
+    return 1;
+}
+
 bool wxImageHandler::CanRead( const wxString& name )
 {
-#if wxUSE_STREAMS
     if (wxFileExists(name))
     {
         wxFileInputStream stream(name);
@@ -676,17 +684,13 @@ bool wxImageHandler::CanRead( const wxString& name )
     }
 
     else {
-        wxLogError( wxT("Can't check image format of file '%s': file does not exist."), name.c_str() );
+        wxLogError( _("Can't check image format of file '%s': file does not exist."), name.c_str() );
 
         return FALSE;
     }
-#else // !wxUSE_STREAMS
-    return FALSE;
-#endif // wxUSE_STREAMS
+//    return FALSE;
 }
 
-
-
 #endif // wxUSE_STREAMS
 
 //-----------------------------------------------------------------------------
@@ -2293,3 +2297,93 @@ public:
 };
 
 IMPLEMENT_DYNAMIC_CLASS(wxImageModule, wxModule)
+
+
+//-----------------------------------------------------------------------------
+
+// GRG, Dic/99
+// Counts and returns the number of different colours. Optionally stops
+// when it reaches 'stopat' different colours. This is useful, for example,
+// to see if the image can be saved as 8-bit (256 colour or less, in this
+// case it would be invoked as CountColours(257)). Default value for stopat
+// is -1 (don't care).
+//
+unsigned long wxImage::CountColours( unsigned long stopat )
+{
+    wxHashTable h;
+    wxNode *node;
+    wxHNode *hnode;
+    unsigned char r, g, b, *p;
+    unsigned long size, nentries, key;
+
+    p = GetData();
+    size = GetWidth() * GetHeight();
+    nentries = 0;
+
+    for (unsigned long j = 0; (j < size) && (nentries < stopat) ; j++)
+    {
+        r = *(p++);
+        g = *(p++);
+        b = *(p++);
+        key = (r << 16) | (g << 8) | b;
+
+        hnode = (wxHNode *) h.Get(key);
+
+        if (!hnode)
+        {
+            h.Put(key, (wxObject *)(new wxHNode));
+            nentries++;
+        }
+    }
+
+    // delete all HNodes
+    h.BeginFind();
+    while ((node = h.Next()) != NULL)
+        delete (wxHNode *)node->GetData();
+
+    return nentries;
+}
+
+
+// GRG, Dic/99
+// Computes the histogram of the image and fills a hash table, indexed
+// with integer keys built as 0xRRGGBB, containing wxHNode objects. Each
+// wxHNode contains an 'index' (useful to build a palette with the image
+// colours) and a 'value', which is the number of pixels in the image with
+// that colour.
+//
+unsigned long wxImage::ComputeHistogram( wxHashTable &h )
+{
+    unsigned char r, g, b, *p;
+    unsigned long size, nentries, key;
+    wxHNode *hnode;
+
+    p = GetData();
+    size = GetWidth() * GetHeight();
+    nentries = 0;
+
+    for (unsigned long j = 0; j < size; j++)
+    {
+        r = *(p++);
+        g = *(p++);
+        b = *(p++);
+        key = (r << 16) | (g << 8) | b;
+
+        hnode = (wxHNode *) h.Get(key);
+
+        if (hnode)
+            hnode->value++;
+        else
+        {
+            hnode = new wxHNode();
+            hnode->index = nentries++;  
+            hnode->value = 1;
+
+            h.Put(key, (wxObject *)hnode);
+        }
+    }
+
+    return nentries;
+}
+
+