X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c74e7fe1de14f32dcd6f3c9cdd727de540bbd0e..1aaaa7120e9a7a5c0c11fa1c532fef414f071594:/src/common/image.cpp?ds=sidebyside diff --git a/src/common/image.cpp b/src/common/image.cpp index fa17d43fa0..4a7a6a4a1a 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -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 //----------------------------------------------------------------------------- @@ -894,11 +898,10 @@ wxBitmap wxImage::ConvertToBitmap() const free(lpDIBh); free(lpBits); +#if WXWIN_COMPATIBILITY_2 // check the wxBitmap object - if( bitmap.GetHBITMAP() ) - bitmap.SetOk( TRUE ); - else - bitmap.SetOk( FALSE ); + bitmap.GetBitmapData()->SetOk(); +#endif // WXWIN_COMPATIBILITY_2 return bitmap; } @@ -1277,12 +1280,12 @@ wxImage::wxImage( const wxBitmap &bitmap ) #ifdef __WXGTK__ -#include "gtk/gtk.h" -#include "gdk/gdk.h" -#include "gdk/gdkx.h" +#include +#include +#include #if (GTK_MINOR_VERSION > 0) -#include "gdk/gdkrgb.h" +#include #endif wxBitmap wxImage::ConvertToBitmap() const @@ -1556,7 +1559,6 @@ wxImage::wxImage( const wxBitmap &bitmap ) for (int i = 0; i < bitmap.GetWidth(); i++) { wxInt32 pixel = gdk_image_get_pixel( gdk_image, i, j ); - // pixel = wxINT32_SWAP_ON_BE( pixel ); if (bpp <= 8) { data[pos] = cmap->colors[pixel].red >> 8; @@ -1564,19 +1566,31 @@ wxImage::wxImage( const wxBitmap &bitmap ) data[pos+2] = cmap->colors[pixel].blue >> 8; } else if (bpp == 15) { +#if (wxBYTE_ORDER == wxBIG_ENDIAN) + // ? +#endif data[pos] = (pixel >> 7) & 0xf8; data[pos+1] = (pixel >> 2) & 0xf8; data[pos+2] = (pixel << 3) & 0xf8; } else if (bpp == 16) { +#if (wxBYTE_ORDER == wxBIG_ENDIAN) + // ? +#endif data[pos] = (pixel >> 8) & 0xf8; data[pos+1] = (pixel >> 3) & 0xfc; data[pos+2] = (pixel << 3) & 0xf8; } else { +#if (wxBYTE_ORDER == wxBIG_ENDIAN) + data[pos] = (pixel) & 0xff; // Red + data[pos+1] = (pixel >> 8) & 0xff; // Green + data[pos+2] = (pixel >> 16) & 0xff; // Blue +#else data[pos] = (pixel >> 16) & 0xff; data[pos+1] = (pixel >> 8) & 0xff; data[pos+2] = pixel & 0xff; +#endif } if (gdk_image_mask) @@ -1605,8 +1619,13 @@ wxImage::wxImage( const wxBitmap &bitmap ) //----------------------------------------------------------------------------- #ifdef __WXMOTIF__ - +#ifdef __VMS__ +#pragma message disable nosimpint +#endif #include +#ifdef __VMS__ +#pragma message enable nosimpint +#endif #include "wx/utils.h" #include @@ -2278,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; +} + +