X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7b2471a060f4f79481a2de8e6341571ad1674ff1..7c4eef7a75398aab1285e3ad2971c59ea3130293:/src/common/image.cpp diff --git a/src/common/image.cpp b/src/common/image.cpp index 2ee0a4c1bb..be502d1e80 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -154,15 +154,15 @@ wxImage wxImage::Scale( int width, int height ) const { wxImage image; - wxCHECK_MSG( Ok(), image, _T("invalid image") ); + wxCHECK_MSG( Ok(), image, T("invalid image") ); - wxCHECK_MSG( (width > 0) && (height > 0), image, _T("invalid image size") ); + wxCHECK_MSG( (width > 0) && (height > 0), image, T("invalid image size") ); image.Create( width, height ); char unsigned *data = image.GetData(); - wxCHECK_MSG( data, image, _T("unable to create image") ); + wxCHECK_MSG( data, image, T("unable to create image") ); if (M_IMGDATA->m_hasMask) image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); @@ -193,10 +193,10 @@ wxImage wxImage::GetSubImage( const wxRect &rect ) const { wxImage image; - wxCHECK_MSG( Ok(), image, _T("invalid image") ); + wxCHECK_MSG( Ok(), image, T("invalid image") ); wxCHECK_MSG( (rect.GetLeft()>=0) && (rect.GetTop()>=0) && (rect.GetRight()<=GetWidth()) && (rect.GetBottom()<=GetHeight()) - , image, _T("invalid subimage size") ); + , image, T("invalid subimage size") ); int subwidth=rect.GetWidth(); const int subheight=rect.GetHeight(); @@ -205,7 +205,7 @@ wxImage wxImage::GetSubImage( const wxRect &rect ) const char unsigned *subdata = image.GetData(), *data=GetData(); - wxCHECK_MSG( subdata, image, _T("unable to create image") ); + wxCHECK_MSG( subdata, image, T("unable to create image") ); if (M_IMGDATA->m_hasMask) image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); @@ -228,12 +228,12 @@ wxImage wxImage::GetSubImage( const wxRect &rect ) const void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ) { - wxCHECK_RET( Ok(), _T("invalid image") ); + wxCHECK_RET( Ok(), T("invalid image") ); int w = M_IMGDATA->m_width; int h = M_IMGDATA->m_height; - wxCHECK_RET( (x>=0) && (y>=0) && (x=0) && (y>=0) && (xm_width; int h = M_IMGDATA->m_height; - wxCHECK_MSG( (x>=0) && (y>=0) && (x=0) && (y>=0) && (xm_width; int h = M_IMGDATA->m_height; - wxCHECK_MSG( (x>=0) && (y>=0) && (x=0) && (y>=0) && (xm_width; int h = M_IMGDATA->m_height; - wxCHECK_MSG( (x>=0) && (y>=0) && (x=0) && (y>=0) && (xm_data; } void wxImage::SetData( char unsigned *data ) { - wxCHECK_RET( Ok(), _T("invalid image") ); - - memcpy(M_IMGDATA->m_data, data, M_IMGDATA->m_width * M_IMGDATA->m_height * 3); + wxCHECK_RET( Ok(), T("invalid image") ); + + wxImageRefData *newRefData = new wxImageRefData(); + + newRefData->m_width = M_IMGDATA->m_width; + newRefData->m_height = M_IMGDATA->m_height; + newRefData->m_data = data; + newRefData->m_ok = TRUE; + newRefData->m_maskRed = M_IMGDATA->m_maskRed; + newRefData->m_maskGreen = M_IMGDATA->m_maskGreen; + newRefData->m_maskBlue = M_IMGDATA->m_maskBlue; + newRefData->m_hasMask = M_IMGDATA->m_hasMask; + + UnRef(); + + m_refData = newRefData; } void wxImage::SetMaskColour( unsigned char r, unsigned char g, unsigned char b ) { - wxCHECK_RET( Ok(), _T("invalid image") ); + wxCHECK_RET( Ok(), T("invalid image") ); M_IMGDATA->m_maskRed = r; M_IMGDATA->m_maskGreen = g; @@ -315,49 +328,49 @@ void wxImage::SetMaskColour( unsigned char r, unsigned char g, unsigned char b ) unsigned char wxImage::GetMaskRed() const { - wxCHECK_MSG( Ok(), 0, _T("invalid image") ); + wxCHECK_MSG( Ok(), 0, T("invalid image") ); return M_IMGDATA->m_maskRed; } unsigned char wxImage::GetMaskGreen() const { - wxCHECK_MSG( Ok(), 0, _T("invalid image") ); + wxCHECK_MSG( Ok(), 0, T("invalid image") ); return M_IMGDATA->m_maskGreen; } unsigned char wxImage::GetMaskBlue() const { - wxCHECK_MSG( Ok(), 0, _T("invalid image") ); + wxCHECK_MSG( Ok(), 0, T("invalid image") ); return M_IMGDATA->m_maskBlue; } void wxImage::SetMask( bool mask ) { - wxCHECK_RET( Ok(), _T("invalid image") ); + wxCHECK_RET( Ok(), T("invalid image") ); M_IMGDATA->m_hasMask = mask; } bool wxImage::HasMask() const { - wxCHECK_MSG( Ok(), FALSE, _T("invalid image") ); + wxCHECK_MSG( Ok(), FALSE, T("invalid image") ); return M_IMGDATA->m_hasMask; } int wxImage::GetWidth() const { - wxCHECK_MSG( Ok(), 0, _T("invalid image") ); + wxCHECK_MSG( Ok(), 0, T("invalid image") ); return M_IMGDATA->m_width; } int wxImage::GetHeight() const { - wxCHECK_MSG( Ok(), 0, _T("invalid image") ); + wxCHECK_MSG( Ok(), 0, T("invalid image") ); return M_IMGDATA->m_height; } @@ -372,7 +385,7 @@ bool wxImage::LoadFile( const wxString& filename, long type ) } else { - wxLogError( _T("Can't load image from file '%s': file does not exist."), filename.c_str() ); + wxLogError( T("Can't load image from file '%s': file does not exist."), filename.c_str() ); return FALSE; } @@ -391,7 +404,7 @@ bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype ) } else { - wxLogError( _T("Can't load image from file '%s': file does not exist."), filename.c_str() ); + wxLogError( T("Can't load image from file '%s': file does not exist."), filename.c_str() ); return FALSE; } @@ -436,26 +449,17 @@ bool wxImage::LoadFile( wxInputStream& stream, long type ) if (type==wxBITMAP_TYPE_ANY) { - // here we can try to guess the handler according the extension, - // but we lose the stream name !? - // Probably we should write methods such as - // bool wxImageHandler::CanRead(wxString&) - // bool wxImageHandler::CanRead(sxInputStream&&) - // for png : see example.c wxList &list=GetHandlers(); - off_t pos=stream.TellI(); - - wxLogNull prevent_log; for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() ) { handler=(wxImageHandler*)node->GetData(); - if (handler->LoadFile( this, stream, FALSE )) return TRUE; + if (handler->CanRead( stream )) + return handler->LoadFile( this, stream ); - stream.SeekI(pos); } - wxLogWarning( _T("No handler found for this image.") ); + wxLogWarning( T("No handler found for this image.") ); return FALSE; } @@ -463,7 +467,7 @@ bool wxImage::LoadFile( wxInputStream& stream, long type ) if (handler == NULL) { - wxLogWarning( _T("No image handler for type %d defined."), type ); + wxLogWarning( T("No image handler for type %d defined."), type ); return FALSE; } @@ -481,7 +485,7 @@ bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype ) if (handler == NULL) { - wxLogWarning( _T("No image handler for type %s defined."), mimetype.GetData() ); + wxLogWarning( T("No image handler for type %s defined."), mimetype.GetData() ); return FALSE; } @@ -491,13 +495,13 @@ bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype ) bool wxImage::SaveFile( wxOutputStream& stream, int type ) { - wxCHECK_MSG( Ok(), FALSE, _T("invalid image") ); + wxCHECK_MSG( Ok(), FALSE, T("invalid image") ); wxImageHandler *handler = FindHandler(type); if (handler == NULL) { - wxLogWarning( _T("No image handler for type %d defined."), type ); + wxLogWarning( T("No image handler for type %d defined."), type ); return FALSE; } @@ -507,13 +511,13 @@ bool wxImage::SaveFile( wxOutputStream& stream, int type ) bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) { - wxCHECK_MSG( Ok(), FALSE, _T("invalid image") ); + wxCHECK_MSG( Ok(), FALSE, T("invalid image") ); wxImageHandler *handler = FindHandlerMime(mimetype); if (handler == NULL) { - wxLogWarning( _T("No image handler for type %s defined."), mimetype.GetData() ); + wxLogWarning( T("No image handler for type %s defined."), mimetype.GetData() ); return FALSE; } @@ -637,6 +641,33 @@ bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSE { return FALSE; } + +bool wxImageHandler::CanRead( wxInputStream& WXUNUSED(stream) ) +{ + return FALSE; +} + +bool wxImageHandler::CanRead( const wxString& name ) +{ +#if wxUSE_STREAMS + if (wxFileExists(name)) + { + wxFileInputStream stream(name); + return CanRead(stream); + } + + else { + wxLogError( T("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 +} + + + #endif // wxUSE_STREAMS //----------------------------------------------------------------------------- @@ -651,7 +682,11 @@ wxBitmap wxImage::ConvertToBitmap() const return wxNullBitmap; // sizeLimit is the MS upper limit for the DIB size +#ifdef WIN32 int sizeLimit = 1024*768*3; +#else + int sizeLimit = 0x7fff ; +#endif // width and height of the device-dependent bitmap int width = GetWidth(); @@ -682,7 +717,7 @@ wxBitmap wxImage::ConvertToBitmap() const // set bitmap parameters wxBitmap bitmap; - wxCHECK_MSG( Ok(), bitmap, _T("invalid image") ); + wxCHECK_MSG( Ok(), bitmap, T("invalid image") ); bitmap.SetWidth( width ); bitmap.SetHeight( bmpHeight ); bitmap.SetDepth( wxDisplayDepth() ); @@ -690,7 +725,7 @@ wxBitmap wxImage::ConvertToBitmap() const // create a DIB header int headersize = sizeof(BITMAPINFOHEADER); LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); - wxCHECK_MSG( lpDIBh, bitmap, _T("could not allocate memory for DIB header") ); + wxCHECK_MSG( lpDIBh, bitmap, T("could not allocate memory for DIB header") ); // Fill in the DIB header lpDIBh->bmiHeader.biSize = headersize; lpDIBh->bmiHeader.biWidth = (DWORD)width; @@ -711,7 +746,7 @@ wxBitmap wxImage::ConvertToBitmap() const lpBits = (unsigned char *)malloc( lpDIBh->bmiHeader.biSizeImage ); if( !lpBits ) { - wxFAIL_MSG( _T("could not allocate memory for DIB") ); + wxFAIL_MSG( T("could not allocate memory for DIB") ); free( lpDIBh ); return bitmap; } @@ -854,7 +889,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) // check the bitmap if( !bitmap.Ok() ) { - wxFAIL_MSG( _T("invalid bitmap") ); + wxFAIL_MSG( T("invalid bitmap") ); return; } @@ -865,7 +900,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) unsigned char *data = GetData(); if( !data ) { - wxFAIL_MSG( _T("could not allocate data for image") ); + wxFAIL_MSG( T("could not allocate data for image") ); return; } @@ -885,7 +920,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); if( !lpDIBh ) { - wxFAIL_MSG( _T("could not allocate data for DIB header") ); + wxFAIL_MSG( T("could not allocate data for DIB header") ); free( data ); return; } @@ -907,7 +942,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) lpBits = (unsigned char *) malloc( lpDIBh->bmiHeader.biSizeImage ); if( !lpBits ) { - wxFAIL_MSG( _T("could not allocate data for DIB") ); + wxFAIL_MSG( T("could not allocate data for DIB") ); free( data ); free( lpDIBh ); return; @@ -998,7 +1033,7 @@ wxBitmap wxImage::ConvertToBitmap() const { wxBitmap bitmap; - wxCHECK_MSG( Ok(), bitmap, _T("invalid image") ); + wxCHECK_MSG( Ok(), bitmap, T("invalid image") ); int width = GetWidth(); int height = GetHeight(); @@ -1206,13 +1241,13 @@ wxBitmap wxImage::ConvertToBitmap() const wxImage::wxImage( const wxBitmap &bitmap ) { - wxCHECK_RET( bitmap.Ok(), _T("invalid bitmap") ); + wxCHECK_RET( bitmap.Ok(), T("invalid bitmap") ); GdkImage *gdk_image = gdk_image_get( bitmap.GetPixmap(), 0, 0, bitmap.GetWidth(), bitmap.GetHeight() ); - wxCHECK_RET( gdk_image, _T("couldn't create image") ); + wxCHECK_RET( gdk_image, T("couldn't create image") ); Create( bitmap.GetWidth(), bitmap.GetHeight() ); char unsigned *data = GetData(); @@ -1220,7 +1255,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) if (!data) { gdk_image_destroy( gdk_image ); - wxFAIL_MSG( _T("couldn't create image") ); + wxFAIL_MSG( T("couldn't create image") ); return; } @@ -1305,7 +1340,7 @@ wxBitmap wxImage::ConvertToBitmap() const { wxBitmap bitmap; - wxCHECK_MSG( Ok(), bitmap, _T("invalid image") ); + wxCHECK_MSG( Ok(), bitmap, T("invalid image") ); int width = GetWidth(); int height = GetHeight(); @@ -1354,7 +1389,7 @@ wxBitmap wxImage::ConvertToBitmap() const vi = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem ); - wxCHECK_MSG( vi, wxNullBitmap, _T("no visual") ); + wxCHECK_MSG( vi, wxNullBitmap, T("no visual") ); XFree( vi ); @@ -1505,7 +1540,7 @@ wxBitmap wxImage::ConvertToBitmap() const wxImage::wxImage( const wxBitmap &bitmap ) { - wxCHECK_RET( bitmap.Ok(), _T("invalid bitmap") ); + wxCHECK_RET( bitmap.Ok(), T("invalid bitmap") ); Display *dpy = (Display*) wxGetDisplay(); Visual* vis = DefaultVisual( dpy, DefaultScreen( dpy ) ); @@ -1517,7 +1552,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) bitmap.GetWidth(), bitmap.GetHeight(), AllPlanes, ZPixmap ); - wxCHECK_RET( ximage, _T("couldn't create image") ); + wxCHECK_RET( ximage, T("couldn't create image") ); Create( bitmap.GetWidth(), bitmap.GetHeight() ); char unsigned *data = GetData(); @@ -1525,7 +1560,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) if (!data) { XDestroyImage( ximage ); - wxFAIL_MSG( _T("couldn't create image") ); + wxFAIL_MSG( T("couldn't create image") ); return; } @@ -1553,7 +1588,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) vi = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem ); - wxCHECK_RET( vi, _T("no visual") ); + wxCHECK_RET( vi, T("no visual") ); if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15;