UnRef();
}
-wxImage wxImage::Scale( int width, int height )
+wxImage wxImage::Scale( int width, int height ) const
{
wxImage image;
- wxCHECK_MSG( Ok(), image, _T("invalid image") );
+ wxCHECK_MSG( Ok(), image, wxT("invalid image") );
- wxCHECK_MSG( (width > 0) && (height > 0), image, _T("invalid image size") );
+ wxCHECK_MSG( (width > 0) && (height > 0), image, wxT("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, wxT("unable to create image") );
if (M_IMGDATA->m_hasMask)
image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue );
return image;
}
+wxImage wxImage::GetSubImage( const wxRect &rect ) const
+{
+ wxImage image;
+
+ 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") );
+
+ int subwidth=rect.GetWidth();
+ const int subheight=rect.GetHeight();
+
+ image.Create( subwidth, subheight );
+
+ char unsigned *subdata = image.GetData(), *data=GetData();
+
+ wxCHECK_MSG( subdata, image, wxT("unable to create image") );
+
+ if (M_IMGDATA->m_hasMask)
+ image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue );
+
+ const int subleft=3*rect.GetLeft();
+ const int width=3*GetWidth();
+ subwidth*=3;
+
+ data+=rect.GetTop()*width+subleft;
+
+ for (long j = 0; j < subheight; ++j)
+ {
+ memcpy( subdata, data, subwidth);
+ subdata+=subwidth;
+ data+=width;
+ }
+
+ return image;
+}
+
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(), wxT("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), wxT("invalid image index") );
long pos = (y * w + x) * 3;
unsigned char wxImage::GetRed( int x, int y )
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("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, wxT("invalid image index") );
long pos = (y * w + x) * 3;
unsigned char wxImage::GetGreen( int x, int y )
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("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, wxT("invalid image index") );
long pos = (y * w + x) * 3;
unsigned char wxImage::GetBlue( int x, int y )
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("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, wxT("invalid image index") );
long pos = (y * w + x) * 3;
char unsigned *wxImage::GetData() const
{
- wxCHECK_MSG( Ok(), (char unsigned *)NULL, _T("invalid image") );
+ wxCHECK_MSG( Ok(), (char unsigned *)NULL, wxT("invalid image") );
return M_IMGDATA->m_data;
}
void wxImage::SetData( char unsigned *data )
{
- wxCHECK_RET( Ok(), _T("invalid image") );
+ wxCHECK_RET( Ok(), wxT("invalid image") );
+
+ wxImageRefData *newRefData = new wxImageRefData();
- memcpy(M_IMGDATA->m_data, data, M_IMGDATA->m_width * M_IMGDATA->m_height * 3);
+ 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(), wxT("invalid image") );
M_IMGDATA->m_maskRed = r;
M_IMGDATA->m_maskGreen = g;
unsigned char wxImage::GetMaskRed() const
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
return M_IMGDATA->m_maskRed;
}
unsigned char wxImage::GetMaskGreen() const
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
return M_IMGDATA->m_maskGreen;
}
unsigned char wxImage::GetMaskBlue() const
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
return M_IMGDATA->m_maskBlue;
}
void wxImage::SetMask( bool mask )
{
- wxCHECK_RET( Ok(), _T("invalid image") );
+ wxCHECK_RET( Ok(), wxT("invalid image") );
M_IMGDATA->m_hasMask = mask;
}
bool wxImage::HasMask() const
{
- wxCHECK_MSG( Ok(), FALSE, _T("invalid image") );
+ wxCHECK_MSG( Ok(), FALSE, wxT("invalid image") );
return M_IMGDATA->m_hasMask;
}
int wxImage::GetWidth() const
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
return M_IMGDATA->m_width;
}
int wxImage::GetHeight() const
{
- wxCHECK_MSG( Ok(), 0, _T("invalid image") );
+ wxCHECK_MSG( Ok(), 0, wxT("invalid image") );
return M_IMGDATA->m_height;
}
}
else {
- wxLogError( _T("Can't load image from file '%s': file does not exist."), filename.c_str() );
+ wxLogError( wxT("Can't load image from file '%s': file does not exist."), filename.c_str() );
return FALSE;
}
}
else {
- wxLogError( _T("Can't load image from file '%s': file does not exist."), filename.c_str() );
+ wxLogError( wxT("Can't load image from file '%s': file does not exist."), filename.c_str() );
return FALSE;
}
return FALSE;
}
+bool wxImage::CanRead( const wxString &name )
+{
+#if wxUSE_STREAMS
+ wxFileInputStream stream(name);
+ return CanRead(stream);
+#else
+ return FALSE;
+#endif
+}
+
#if wxUSE_STREAMS
+
+bool wxImage::CanRead( wxInputStream &stream )
+{
+ wxList &list=GetHandlers();
+
+ for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() )
+ {
+ wxImageHandler *handler=(wxImageHandler*)node->GetData();
+ if (handler->CanRead( stream ))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
bool wxImage::LoadFile( wxInputStream& stream, long type )
{
UnRef();
m_refData = new wxImageRefData;
- wxImageHandler *handler = FindHandler(type);
+ wxImageHandler *handler;
+
+ if (type==wxBITMAP_TYPE_ANY)
+ {
+ wxList &list=GetHandlers();
+
+ for ( wxList::Node *node = list.GetFirst(); node; node = node->GetNext() )
+ {
+ handler=(wxImageHandler*)node->GetData();
+ if (handler->CanRead( stream ))
+ return handler->LoadFile( this, stream );
+
+ }
+
+ wxLogWarning( wxT("No handler found for this image.") );
+ return FALSE;
+ }
+
+ handler = FindHandler(type);
if (handler == NULL)
{
- wxLogWarning( _T("No image handler for type %d defined."), type );
+ wxLogWarning( wxT("No image handler for type %d defined."), type );
return FALSE;
}
if (handler == NULL)
{
- wxLogWarning( _T("No image handler for type %s defined."), mimetype.GetData() );
+ wxLogWarning( wxT("No image handler for type %s defined."), mimetype.GetData() );
return FALSE;
}
bool wxImage::SaveFile( wxOutputStream& stream, int type )
{
- wxCHECK_MSG( Ok(), FALSE, _T("invalid image") );
+ wxCHECK_MSG( Ok(), FALSE, wxT("invalid image") );
wxImageHandler *handler = FindHandler(type);
if (handler == NULL)
{
- wxLogWarning( _T("No image handler for type %d defined."), type );
+ wxLogWarning( wxT("No image handler for type %d defined."), type );
return FALSE;
}
bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype )
{
- wxCHECK_MSG( Ok(), FALSE, _T("invalid image") );
+ wxCHECK_MSG( Ok(), FALSE, wxT("invalid image") );
wxImageHandler *handler = FindHandlerMime(mimetype);
if (handler == NULL)
{
- wxLogWarning( _T("No image handler for type %s defined."), mimetype.GetData() );
+ wxLogWarning( wxT("No image handler for type %s defined."), mimetype.GetData() );
return FALSE;
}
void wxImage::InitStandardHandlers()
{
- AddHandler( new wxBMPHandler );
+ AddHandler( new wxBMPHandler );
}
void wxImage::CleanUpHandlers()
//-----------------------------------------------------------------------------
#if !USE_SHARED_LIBRARIES
-IMPLEMENT_DYNAMIC_CLASS(wxImageHandler,wxObject)
+IMPLEMENT_ABSTRACT_CLASS(wxImageHandler,wxObject)
#endif
#if wxUSE_STREAMS
-bool wxImageHandler::LoadFile( wxImage *WXUNUSED(image), wxInputStream& WXUNUSED(stream) )
+bool wxImageHandler::LoadFile( wxImage *WXUNUSED(image), wxInputStream& WXUNUSED(stream), bool WXUNUSED(verbose) )
{
return FALSE;
}
-bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream) )
+bool wxImageHandler::SaveFile( wxImage *WXUNUSED(image), wxOutputStream& WXUNUSED(stream), bool WXUNUSED(verbose) )
{
return FALSE;
}
+
+bool wxImageHandler::CanRead( const wxString& name )
+{
+#if wxUSE_STREAMS
+ if (wxFileExists(name))
+ {
+ wxFileInputStream stream(name);
+ return CanRead(stream);
+ }
+
+ else {
+ wxLogError( wxT("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
//-----------------------------------------------------------------------------
wxBitmap wxImage::ConvertToBitmap() const
{
+ if ( !Ok() )
+ 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();
// calc the number of bytes per scanline and padding
int bytePerLine = width*3;
int sizeDWORD = sizeof( DWORD );
- div_t lineBoundary = div( bytePerLine, sizeDWORD );
+ int lineBoundary = bytePerLine % sizeDWORD;
int padding = 0;
- if( lineBoundary.rem > 0 )
+ if( lineBoundary > 0 )
{
- padding = sizeDWORD - lineBoundary.rem;
+ padding = sizeDWORD - lineBoundary;
bytePerLine += padding;
}
// calc the number of DIBs and heights of DIBs
height = bmpHeight;
else
{
- div_t result = div( bmpHeight, height );
- numDIB = result.quot;
- hRemain = result.rem;
+ numDIB = bmpHeight / height;
+ hRemain = bmpHeight % height;
if( hRemain >0 ) numDIB++;
}
// set bitmap parameters
wxBitmap bitmap;
- wxCHECK_MSG( Ok(), bitmap, _T("invalid image") );
+ wxCHECK_MSG( Ok(), bitmap, wxT("invalid image") );
bitmap.SetWidth( width );
bitmap.SetHeight( bmpHeight );
bitmap.SetDepth( wxDisplayDepth() );
// 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, wxT("could not allocate memory for DIB header") );
// Fill in the DIB header
lpDIBh->bmiHeader.biSize = headersize;
lpDIBh->bmiHeader.biWidth = (DWORD)width;
lpBits = (unsigned char *)malloc( lpDIBh->bmiHeader.biSizeImage );
if( !lpBits )
{
- wxFAIL_MSG( _T("could not allocate memory for DIB") );
+ wxFAIL_MSG( wxT("could not allocate memory for DIB") );
free( lpDIBh );
return bitmap;
}
// HDC memdc = ::CreateCompatibleDC( hdc );
// ::SelectObject( memdc, hbitmap);
// ::SetDIBitsToDevice( memdc, 0, 0, width, height,
- // 0, 0, 0, height, (void *)lpBits, lpDIBh, DIB_RGB_COLORS);
+ // 0, 0, 0, height, (void *)lpBits, lpDIBh, DIB_RGB_COLORS);
// ::SelectObject( memdc, 0 );
// ::DeleteDC( memdc );
}
// check the bitmap
if( !bitmap.Ok() )
{
- wxFAIL_MSG( _T("invalid bitmap") );
+ wxFAIL_MSG( wxT("invalid bitmap") );
return;
}
unsigned char *data = GetData();
if( !data )
{
- wxFAIL_MSG( _T("could not allocate data for image") );
+ wxFAIL_MSG( wxT("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 lineBoundary = bytePerLine % sizeDWORD;
int padding = 0;
- if( lineBoundary.rem > 0 )
+ if( lineBoundary > 0 )
{
- padding = sizeDWORD - lineBoundary.rem;
+ padding = sizeDWORD - lineBoundary;
bytePerLine += padding;
}
LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize );
if( !lpDIBh )
{
- wxFAIL_MSG( _T("could not allocate data for DIB header") );
+ wxFAIL_MSG( wxT("could not allocate data for DIB header") );
free( data );
return;
}
lpBits = (unsigned char *) malloc( lpDIBh->bmiHeader.biSizeImage );
if( !lpBits )
{
- wxFAIL_MSG( _T("could not allocate data for DIB") );
+ wxFAIL_MSG( wxT("could not allocate data for DIB") );
free( data );
free( lpDIBh );
return;
{
wxBitmap bitmap;
- wxCHECK_MSG( Ok(), bitmap, _T("invalid image") );
+ wxCHECK_MSG( Ok(), bitmap, wxT("invalid image") );
int width = GetWidth();
int height = GetHeight();
// Retrieve depth
GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
- if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
+ if (visual == NULL) visual = gdk_visual_get_system();
int bpp = visual->depth;
bitmap.SetDepth( bpp );
{
static bool s_hasInitialized = FALSE;
- if (!s_hasInitialized)
- {
- gdk_rgb_init();
- s_hasInitialized = TRUE;
- }
+ if (!s_hasInitialized)
+ {
+ gdk_rgb_init();
+ s_hasInitialized = TRUE;
+ }
GdkGC *gc = gdk_gc_new( bitmap.GetPixmap() );
- gdk_draw_rgb_image( bitmap.GetPixmap(),
- gc,
- 0, 0,
- width, height,
- GDK_RGB_DITHER_NONE,
- GetData(),
- width*3 );
+ gdk_draw_rgb_image( bitmap.GetPixmap(),
+ gc,
+ 0, 0,
+ width, height,
+ GDK_RGB_DITHER_NONE,
+ GetData(),
+ width*3 );
gdk_gc_unref( gc );
- return bitmap;
+ return bitmap;
}
#endif
wxImage::wxImage( const wxBitmap &bitmap )
{
- wxCHECK_RET( bitmap.Ok(), _T("invalid bitmap") );
+ wxCHECK_RET( bitmap.Ok(), wxT("invalid bitmap") );
- GdkImage *gdk_image = gdk_image_get( bitmap.GetPixmap(),
- 0, 0,
- bitmap.GetWidth(), bitmap.GetHeight() );
+ GdkImage *gdk_image = (GdkImage*) NULL;
+ if (bitmap.GetPixmap())
+ {
+ gdk_image = gdk_image_get( bitmap.GetPixmap(),
+ 0, 0,
+ bitmap.GetWidth(), bitmap.GetHeight() );
+ } else
+ if (bitmap.GetBitmap())
+ {
+ gdk_image = gdk_image_get( bitmap.GetBitmap(),
+ 0, 0,
+ bitmap.GetWidth(), bitmap.GetHeight() );
+ } else
+ {
+ wxFAIL_MSG( wxT("Ill-formed bitmap") );
+ }
- wxCHECK_RET( gdk_image, _T("couldn't create image") );
+ wxCHECK_RET( gdk_image, wxT("couldn't create image") );
Create( bitmap.GetWidth(), bitmap.GetHeight() );
char unsigned *data = GetData();
if (!data)
{
gdk_image_destroy( gdk_image );
- wxFAIL_MSG( _T("couldn't create image") );
+ wxFAIL_MSG( wxT("couldn't create image") );
return;
}
SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable
}
- GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() );
+ GdkVisual *visual = (GdkVisual*) NULL;
+ if (bitmap.GetPixmap())
+ visual = gdk_window_get_visual( bitmap.GetPixmap() );
+ else
+ visual = gdk_window_get_visual( bitmap.GetBitmap() );
+
if (visual == NULL) visual = gdk_window_get_visual( (GdkWindow*) &gdk_root_parent );
int bpp = visual->depth;
if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15;
{
for (int i = 0; i < bitmap.GetWidth(); i++)
{
- int pixel = gdk_image_get_pixel( gdk_image, i, j );
+ 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;
{
wxBitmap bitmap;
- wxCHECK_MSG( Ok(), bitmap, _T("invalid image") );
+ wxCHECK_MSG( Ok(), bitmap, wxT("invalid image") );
int width = GetWidth();
int height = GetHeight();
vi = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem );
- wxCHECK_MSG( vi, wxNullBitmap, _T("no visual") );
+ wxCHECK_MSG( vi, wxNullBitmap, wxT("no visual") );
XFree( vi );
wxImage::wxImage( const wxBitmap &bitmap )
{
- wxCHECK_RET( bitmap.Ok(), _T("invalid bitmap") );
+ wxCHECK_RET( bitmap.Ok(), wxT("invalid bitmap") );
Display *dpy = (Display*) wxGetDisplay();
Visual* vis = DefaultVisual( dpy, DefaultScreen( dpy ) );
bitmap.GetWidth(), bitmap.GetHeight(),
AllPlanes, ZPixmap );
- wxCHECK_RET( ximage, _T("couldn't create image") );
+ wxCHECK_RET( ximage, wxT("couldn't create image") );
Create( bitmap.GetWidth(), bitmap.GetHeight() );
char unsigned *data = GetData();
if (!data)
{
XDestroyImage( ximage );
- wxFAIL_MSG( _T("couldn't create image") );
+ wxFAIL_MSG( wxT("couldn't create image") );
return;
}
vi = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem );
- wxCHECK_MSG( vi, wxNullBitmap, _T("no visual") );
+ wxCHECK_RET( vi, wxT("no visual") );
if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15;