X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/700ec4546cfa7a89b3bca0a4eb5b6ee9d43ac17a..f2c2fa4d62b34608e21b04f8010149945aebda70:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index c714ea6b5b..fcdc3d34e9 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,9 +657,7 @@ 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), int WXUNUSED(index) ) @@ -680,11 +684,11 @@ 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; } - return FALSE; +// return FALSE; } #endif // wxUSE_STREAMS @@ -743,7 +747,7 @@ wxBitmap wxImage::ConvertToBitmap() const // create a DIB header int headersize = sizeof(BITMAPINFOHEADER); - LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); + BITMAPINFO *lpDIBh = (BITMAPINFO *) malloc( headersize ); wxCHECK_MSG( lpDIBh, bitmap, wxT("could not allocate memory for DIB header") ); // Fill in the DIB header lpDIBh->bmiHeader.biSize = headersize; @@ -935,7 +939,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) // create a DIB header int headersize = sizeof(BITMAPINFOHEADER); - LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); + BITMAPINFO *lpDIBh = (BITMAPINFO *) malloc( headersize ); if( !lpDIBh ) { wxFAIL_MSG( wxT("could not allocate data for DIB header") ); @@ -1050,31 +1054,31 @@ wxBitmap wxImage::ConvertToBitmap() const int height = GetHeight(); // Create picture - + wxBitmap bitmap( width , height , wxDisplayDepth() ) ; - + // Create mask - + if (HasMask()) { /* unsigned char *mask_data = (unsigned char*)malloc( ((width >> 3)+8) * height ); - + mask_image = gdk_image_new_bitmap( gdk_visual_get_system(), mask_data, width, height ); - + wxMask *mask = new wxMask(); mask->m_bitmap = gdk_pixmap_new( (GdkWindow*)&gdk_root_parent, width, height, 1 ); - + bitmap.SetMask( mask ); */ } - + // Render - + int r_mask = GetMaskRed(); int g_mask = GetMaskGreen(); int b_mask = GetMaskBlue(); - + CGrafPtr origPort ; GDHandle origDevice ; @@ -1082,7 +1086,7 @@ wxBitmap wxImage::ConvertToBitmap() const SetGWorld( bitmap.GetHBITMAP() , NULL ) ; register unsigned char* data = GetData(); - + int index = 0; for (int y = 0; y < height; y++) { @@ -1098,7 +1102,7 @@ wxBitmap wxImage::ConvertToBitmap() const unsigned char r = data[index++]; unsigned char g = data[index++]; unsigned char b = data[index++]; - + if ( r != lastr || g != lastg || b != lastb ) { lastcolor.red = ( lastr << 8 ) + lastr ; @@ -1132,9 +1136,9 @@ wxBitmap wxImage::ConvertToBitmap() const } // for height SetGWorld( origPort , origDevice ) ; - + return bitmap; - + } wxImage::wxImage( const wxBitmap &bitmap ) @@ -1145,11 +1149,11 @@ wxImage::wxImage( const wxBitmap &bitmap ) wxFAIL_MSG( "invalid bitmap" ); return; } - + // create an wxImage object int width = bitmap.GetWidth(); int height = bitmap.GetHeight(); - Create( width, height ); + Create( width, height ); /* unsigned char *data = GetData(); if( !data ) @@ -1157,18 +1161,18 @@ wxImage::wxImage( const wxBitmap &bitmap ) wxFAIL_MSG( "could not allocate data for image" ); return; } - + // calc the number of bytes per scanline and padding in the DIB int bytePerLine = width*3; int sizeDWORD = sizeof( DWORD ); div_t lineBoundary = div( bytePerLine, sizeDWORD ); int padding = 0; - if( lineBoundary.rem > 0 ) + if( lineBoundary.rem > 0 ) { padding = sizeDWORD - lineBoundary.rem; bytePerLine += padding; } - + // create a DIB header int headersize = sizeof(BITMAPINFOHEADER); LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); @@ -1201,13 +1205,13 @@ wxImage::wxImage( const wxBitmap &bitmap ) free( lpDIBh ); return; } - + // copy data from the device-dependent bitmap to the DIB HDC hdc = ::GetDC(NULL); HBITMAP hbitmap; hbitmap = (HBITMAP) bitmap.GetHBITMAP(); ::GetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS ); - + // copy DIB data into the wxImage object int i, j; unsigned char *ptdata = data; @@ -1223,7 +1227,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) } ptbits += padding; } - + // similarly, set data according to the possible mask bitmap if( bitmap.GetMask() && bitmap.GetMask()->GetMaskBitmap() ) { @@ -1233,9 +1237,9 @@ wxImage::wxImage( const wxBitmap &bitmap ) ::SetTextColor( memdc, RGB( 0, 0, 0 ) ); ::SetBkColor( memdc, RGB( 255, 255, 255 ) ); ::GetDIBits( memdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS ); - ::DeleteDC( memdc ); + ::DeleteDC( memdc ); // background color set to RGB(16,16,16) in consistent with wxGTK - unsigned char r=16, g=16, b=16; + unsigned char r=16, g=16, b=16; ptdata = data; ptbits = lpBits; for( i=0; iGetData(); + + 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; +} + +