]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/image.cpp
Unicode overview added
[wxWidgets.git] / src / common / image.cpp
index 2ee0a4c1bb891312f17c858c184987f7e5c5bf62..be502d1e803afa8742ac0dda6752fbe4bc806fc4 100644 (file)
@@ -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<w) && (y<h), _T("invalid image index") );
+    wxCHECK_RET( (x>=0) && (y>=0) && (x<w) && (y<h), T("invalid image index") );
 
     long pos = (y * w + x) * 3;
 
@@ -244,12 +244,12 @@ void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned c
 
 unsigned char wxImage::GetRed( int x, int y )
 {
-    wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+    wxCHECK_MSG( Ok(), 0, T("invalid image") );
 
     int w = M_IMGDATA->m_width;
     int h = M_IMGDATA->m_height;
 
-    wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, _T("invalid image index") );
+    wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, T("invalid image index") );
 
     long pos = (y * w + x) * 3;
 
@@ -258,12 +258,12 @@ unsigned char wxImage::GetRed( int x, int y )
 
 unsigned char wxImage::GetGreen( int x, int y )
 {
-    wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+    wxCHECK_MSG( Ok(), 0, T("invalid image") );
 
     int w = M_IMGDATA->m_width;
     int h = M_IMGDATA->m_height;
 
-    wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, _T("invalid image index") );
+    wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, T("invalid image index") );
 
     long pos = (y * w + x) * 3;
 
@@ -272,12 +272,12 @@ unsigned char wxImage::GetGreen( int x, int y )
 
 unsigned char wxImage::GetBlue( int x, int y )
 {
-    wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+    wxCHECK_MSG( Ok(), 0, T("invalid image") );
 
     int w = M_IMGDATA->m_width;
     int h = M_IMGDATA->m_height;
 
-    wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, _T("invalid image index") );
+    wxCHECK_MSG( (x>=0) && (y>=0) && (x<w) && (y<h), 0, T("invalid image index") );
 
     long pos = (y * w + x) * 3;
 
@@ -291,21 +291,34 @@ bool wxImage::Ok() const
 
 char unsigned *wxImage::GetData() const
 {
-    wxCHECK_MSG( Ok(), (char unsigned *)NULL, _T("invalid image") );
+    wxCHECK_MSG( Ok(), (char unsigned *)NULL, T("invalid image") );
 
     return M_IMGDATA->m_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;