X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/004fd0c8834ca526d335a9294322d9def17ef8a9..7513f9ffc5f8f6e75d55cc32cafe5ea6a111fcfc:/src/common/image.cpp?ds=sidebyside diff --git a/src/common/image.cpp b/src/common/image.cpp index bb9f59afc4..5931d63cb1 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; @@ -195,8 +195,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 +381,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 +401,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 +421,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 +436,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 +491,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 +499,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 +517,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 +533,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 +549,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; } @@ -656,7 +664,7 @@ 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 +674,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 +688,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 +902,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; } @@ -1034,18 +1041,255 @@ wxImage::wxImage( const wxBitmap &bitmap ) #endif +#ifdef __WXMAC__ + +#include + +extern CTabHandle wxMacCreateColorTable( int numColors ) ; +extern void wxMacDestroyColorTable( CTabHandle colors ) ; +extern void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue ) ; +extern GWorldPtr wxMacCreateGWorld( int height , int width , int depth ) ; +extern void wxMacDestroyGWorld( GWorldPtr gw ) ; + +wxBitmap wxImage::ConvertToBitmap() const +{ + // width and height of the device-dependent bitmap + int width = GetWidth(); + 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 ; + + GetGWorld( &origPort , &origDevice ) ; + SetGWorld( bitmap.GetHBITMAP() , NULL ) ; + + register unsigned char* data = GetData(); + + int index = 0; + for (int y = 0; y < height; y++) + { +#if 0 + unsigned char lastr = 0 ; + unsigned char lastg = 0 ; + unsigned char lastb = 0 ; + RGBColor lastcolor ; + + MoveTo( 0 , y ) ; + for (int x = 0; x < width; x++) + { + 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 ; + lastcolor.green = ( lastg << 8 ) + lastg ; + lastcolor.blue = ( lastb << 8 ) + lastb ; + RGBForeColor( &lastcolor ) ; + LineTo( x , y ) ; + lastr = r ; + lastg = g ; + lastb = b ; + } + } // for width + lastcolor.red = ( lastr << 8 ) + lastr ; + lastcolor.green = ( lastg << 8 ) + lastg ; + lastcolor.blue = ( lastb << 8 ) + lastb ; + RGBForeColor( &lastcolor ) ; + LineTo( width - 1 , y ) ; +#else + for (int x = 0; x < width; x++) + { + unsigned char r = data[index++]; + unsigned char g = data[index++]; + unsigned char b = data[index++]; + RGBColor color ; + color.red = ( r << 8 ) + r ; + color.green = ( g << 8 ) + g ; + color.blue = ( b << 8 ) + b ; + SetCPixel( x , y , &color ) ; + } +#endif + } // for height + + SetGWorld( origPort , origDevice ) ; + + return bitmap; + +} + +wxImage::wxImage( const wxBitmap &bitmap ) +{ + // check the bitmap + if( !bitmap.Ok() ) + { + wxFAIL_MSG( "invalid bitmap" ); + return; + } + + // create an wxImage object + int width = bitmap.GetWidth(); + int height = bitmap.GetHeight(); + Create( width, height ); + /* + unsigned char *data = GetData(); + if( !data ) + { + 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 ) + { + padding = sizeDWORD - lineBoundary.rem; + bytePerLine += padding; + } + + // create a DIB header + int headersize = sizeof(BITMAPINFOHEADER); + LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); + if( !lpDIBh ) + { + wxFAIL_MSG( "could not allocate data for DIB header" ); + free( data ); + return; + } + // Fill in the DIB header + lpDIBh->bmiHeader.biSize = headersize; + lpDIBh->bmiHeader.biWidth = width; + lpDIBh->bmiHeader.biHeight = -height; + lpDIBh->bmiHeader.biSizeImage = bytePerLine * height; + lpDIBh->bmiHeader.biPlanes = 1; + lpDIBh->bmiHeader.biBitCount = 24; + lpDIBh->bmiHeader.biCompression = BI_RGB; + lpDIBh->bmiHeader.biClrUsed = 0; + // These seem not really needed for our purpose here. + lpDIBh->bmiHeader.biClrImportant = 0; + lpDIBh->bmiHeader.biXPelsPerMeter = 0; + lpDIBh->bmiHeader.biYPelsPerMeter = 0; + // memory for DIB data + unsigned char *lpBits; + lpBits = (unsigned char *) malloc( lpDIBh->bmiHeader.biSizeImage ); + if( !lpBits ) + { + wxFAIL_MSG( "could not allocate data for DIB" ); + free( data ); + 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; + unsigned char *ptbits = lpBits; + for( i=0; iGetMaskBitmap() ) + { + hbitmap = (HBITMAP) bitmap.GetMask()->GetMaskBitmap(); + // memory DC created, color set, data copied, and memory DC deleted + HDC memdc = ::CreateCompatibleDC( hdc ); + ::SetTextColor( memdc, RGB( 0, 0, 0 ) ); + ::SetBkColor( memdc, RGB( 255, 255, 255 ) ); + ::GetDIBits( memdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS ); + ::DeleteDC( memdc ); + // background color set to RGB(16,16,16) in consistent with wxGTK + unsigned char r=16, g=16, b=16; + ptdata = data; + ptbits = lpBits; + for( i=0; i +#include +#include #if (GTK_MINOR_VERSION > 0) -#include "gdk/gdkrgb.h" +#include #endif wxBitmap wxImage::ConvertToBitmap() const @@ -1319,7 +1563,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; @@ -1327,19 +1570,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) @@ -1368,8 +1623,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