diff --git a/src/common/image.cpp b/src/common/image.cpp index 2aa061e627..07ce37c620 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -47,11 +47,11 @@ class wxImageRefData: public wxObjectRefData { - + public: wxImageRefData(void); ~wxImageRefData(void); - + int m_width; int m_height; unsigned char *m_data; @@ -131,12 +131,12 @@ wxImage::wxImage( const wxImage* image ) void wxImage::Create( int width, int height ) { m_refData = new wxImageRefData(); - + M_IMGDATA->m_data = (unsigned char *) malloc( width*height*3 ); if (M_IMGDATA->m_data) { for (int l = 0; l < width*height*3; l++) M_IMGDATA->m_data[l] = 0; - + M_IMGDATA->m_width = width; M_IMGDATA->m_height = height; M_IMGDATA->m_ok = TRUE; @@ -155,53 +155,53 @@ void wxImage::Destroy() wxImage wxImage::Scale( int width, int height ) { wxImage image; - + wxCHECK_MSG( Ok(), image, _T("invalid image") ); - + 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") ); - + if (M_IMGDATA->m_hasMask) image.SetMaskColour( M_IMGDATA->m_maskRed, M_IMGDATA->m_maskGreen, M_IMGDATA->m_maskBlue ); - + long old_height = M_IMGDATA->m_height; long old_width = M_IMGDATA->m_width; - + char unsigned *source_data = M_IMGDATA->m_data; char unsigned *target_data = data; - + for (long j = 0; j < height; j++) { long y_offset = (j * old_height / height) * old_width; - + for (long i = 0; i < width; i++) { - memcpy( target_data, - source_data + 3*(y_offset + ((i * old_width )/ width)), + memcpy( target_data, + source_data + 3*(y_offset + ((i * old_width )/ width)), 3 ); target_data += 3; } } - + return image; } void wxImage::SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ) { wxCHECK_RET( Ok(), _T("invalid image") ); - + int w = M_IMGDATA->m_width; int h = M_IMGDATA->m_height; - + wxCHECK_RET( (x>=0) && (y>=0) && (xm_data[ pos ] = r; M_IMGDATA->m_data[ pos+1 ] = g; M_IMGDATA->m_data[ pos+2 ] = b; @@ -210,42 +210,42 @@ 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") ); - + int w = M_IMGDATA->m_width; int h = M_IMGDATA->m_height; - + wxCHECK_MSG( (x>=0) && (y>=0) && (xm_data[pos]; } unsigned char wxImage::GetGreen( int x, int y ) { 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) && (xm_data[pos+1]; } unsigned char wxImage::GetBlue( int x, int y ) { 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) && (xm_data[pos+2]; } @@ -257,7 +257,7 @@ bool wxImage::Ok() const char unsigned *wxImage::GetData() const { wxCHECK_MSG( Ok(), (char unsigned *)NULL, _T("invalid image") ); - + return M_IMGDATA->m_data; } @@ -271,7 +271,7 @@ void wxImage::SetData( char unsigned *data ) void wxImage::SetMaskColour( unsigned char r, unsigned char g, unsigned char b ) { wxCHECK_RET( Ok(), _T("invalid image") ); - + M_IMGDATA->m_maskRed = r; M_IMGDATA->m_maskGreen = g; M_IMGDATA->m_maskBlue = b; @@ -281,49 +281,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") ); - + return M_IMGDATA->m_maskRed; } unsigned char wxImage::GetMaskGreen() const { wxCHECK_MSG( Ok(), 0, _T("invalid image") ); - + return M_IMGDATA->m_maskGreen; } unsigned char wxImage::GetMaskBlue() const { wxCHECK_MSG( Ok(), 0, _T("invalid image") ); - + return M_IMGDATA->m_maskBlue; } void wxImage::SetMask( bool mask ) { wxCHECK_RET( Ok(), _T("invalid image") ); - + M_IMGDATA->m_hasMask = mask; } bool wxImage::HasMask() const { wxCHECK_MSG( Ok(), FALSE, _T("invalid image") ); - + return M_IMGDATA->m_hasMask; } int wxImage::GetWidth() const { wxCHECK_MSG( Ok(), 0, _T("invalid image") ); - + return M_IMGDATA->m_width; } int wxImage::GetHeight() const { wxCHECK_MSG( Ok(), 0, _T("invalid image") ); - + return M_IMGDATA->m_height; } @@ -354,10 +354,10 @@ bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype ) wxFileInputStream stream(filename); return LoadFile(stream, mimetype); } - + else { wxLogError( _T("Can't load image from file '%s': file does not exist."), filename.c_str() ); - + return FALSE; } #else // !wxUSE_STREAMS @@ -381,7 +381,7 @@ bool wxImage::SaveFile( const wxString& filename, const wxString& mimetype ) { #if wxUSE_STREAMS wxFileOutputStream stream(filename); - + if ( stream.LastError() == wxStream_NOERROR ) return SaveFile(stream, mimetype); else @@ -393,18 +393,18 @@ bool wxImage::SaveFile( const wxString& filename, const wxString& mimetype ) bool wxImage::LoadFile( wxInputStream& stream, long type ) { UnRef(); - + m_refData = new wxImageRefData; - + wxImageHandler *handler = FindHandler(type); - + if (handler == NULL) { wxLogWarning( _T("No image handler for type %d defined."), type ); - + return FALSE; } - + return handler->LoadFile( this, stream ); } @@ -429,9 +429,9 @@ bool wxImage::LoadFile( wxInputStream& stream, const wxString& mimetype ) bool wxImage::SaveFile( wxOutputStream& stream, int type ) { wxCHECK_MSG( Ok(), FALSE, _T("invalid image") ); - + wxImageHandler *handler = FindHandler(type); - + if (handler == NULL) { wxLogWarning( _T("No image handler for type %d defined."), type ); @@ -445,16 +445,16 @@ bool wxImage::SaveFile( wxOutputStream& stream, int type ) bool wxImage::SaveFile( wxOutputStream& stream, const wxString& mimetype ) { 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() ); - + return FALSE; } - + return handler->SaveFile( this, stream ); } #endif // wxUSE_STREAMS @@ -463,7 +463,7 @@ void wxImage::AddHandler( wxImageHandler *handler ) { // make sure that the memory will be freed at the program end sm_handlers.DeleteContents(TRUE); - + sm_handlers.Append( handler ); } @@ -471,7 +471,7 @@ void wxImage::InsertHandler( wxImageHandler *handler ) { // make sure that the memory will be freed at the program end sm_handlers.DeleteContents(TRUE); - + sm_handlers.Insert( handler ); } @@ -494,7 +494,7 @@ wxImageHandler *wxImage::FindHandler( const wxString& name ) { wxImageHandler *handler = (wxImageHandler*)node->Data(); if (handler->GetName().Cmp(name) == 0) return handler; - + node = node->Next(); } return (wxImageHandler *)NULL; @@ -606,52 +606,52 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) #define BI_RLE8 1 #define BI_RLE4 2 #endif - + #ifndef BI_BITFIELDS #define BI_BITFIELDS 3 #endif - + image->Destroy(); - + done = 0; /* * Reading the bmp header */ - + stream.Read(&bbuf, 2); - + stream.Read(dbuf, 4 * 4); - + size = dbuf[0]; offset = dbuf[2]; - + stream.Read(dbuf, 4 * 2); int width = (int)dbuf[0]; int height = (int)dbuf[1]; if (width > 32767) { - wxLogError( _T("Image width > 32767 pixels for file\n") ); + wxLogError( _T("Image width > 32767 pixels for file.") ); return FALSE; } if (height > 32767) { - wxLogError( _T("Image height > 32767 pixels for file\n") ); + wxLogError( _T("Image height > 32767 pixels for file.") ); return FALSE; } stream.Read(&word, 2); planes = (int)word; stream.Read(&word, 2); bpp = (int)word; - if (bpp!=1 && bpp!=4 && bpp!=8 && bpp !=16 && bpp!=24 && bpp!=32) + if (bpp != 1 && bpp != 4 && bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32) { - wxLogError( _T("unknown bitdepth in file\n") ); + wxLogError( _T("unknown bitdepth in file.") ); return FALSE; } stream.Read(dbuf, 4 * 4); comp = (int)dbuf[0]; if (comp != BI_RGB && comp != BI_RLE4 && comp != BI_RLE8 && comp != BI_BITFIELDS) { - wxLogError( _T("unknown encoding in Windows BMP file\n") ); + wxLogError( _T("unknown encoding in Windows BMP file.") ); return FALSE; } stream.Read(dbuf, 4 * 2); @@ -661,32 +661,32 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) /* some more sanity checks */ if (((comp == BI_RLE4) && (bpp != 4)) || ((comp == BI_RLE8) && (bpp != 8)) || ((comp == BI_BITFIELDS) && (bpp != 16 && bpp != 32))) { - wxLogError( _T("encoding of BMP doesn't match bitdepth\n") ); + wxLogError( _T("encoding of BMP doesn't match bitdepth.") ); return FALSE; } if (bpp < 16) { cmap = (struct _cmap *)malloc(sizeof(struct _cmap) * ncolors); - + if (!cmap) { - wxLogError( _T("Cannot allocate RAM for color map in BMP file\n") ); + wxLogError( _T("Cannot allocate RAM for color map in BMP file.") ); return FALSE; } } else cmap = NULL; - + image->Create( width, height ); ptr = image->GetData(); if (!ptr) { - wxLogError( _T("Cannot allocate RAM for RGB data in file\n") ); + wxLogError( _T("Cannot allocate RAM for RGB data in file.") ); if (cmap) free(cmap); return FALSE; } - + /* * Reading the palette, if it exists. */ @@ -705,7 +705,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) if (comp == BI_BITFIELDS) { int bit = 0; - + stream.Read(dbuf, 4 * 3); bmask = dbuf[0]; gmask = dbuf[1]; @@ -740,13 +740,13 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) bshift = 0; } } - + /* * Reading the image data */ stream.SeekI(start_offset + offset); data = ptr; - + /* set the whole image to the background color */ if (bpp < 16 && (comp == BI_RLE4 || comp == BI_RLE8)) { @@ -761,11 +761,11 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) line = 0; column = 0; #define poffset (line * width * 3 + column * 3) - + /* * BMPs are stored upside down... hmmmmmmmmmm.... */ - + linesize = ((width * bpp + 31) / 32) * 4; for (line = (height - 1); line >= 0; line--) { @@ -775,13 +775,13 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) if (bpp < 16) { int index; - + linepos++; aByte = stream.GetC(); if (bpp == 1) { int bit = 0; - + for (bit = 0; bit < 8; bit++) { index = ((aByte & (0x80 >> bit)) ? 1 : 0); @@ -795,7 +795,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) { if (comp == BI_RLE4) { - wxLogError( _T("can't deal with 4bit encoded yet.\n") ); + wxLogError( _T("can't deal with 4bit encoded yet.") ); image->Destroy(); free(cmap); return FALSE; @@ -803,7 +803,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) else { int nibble = 0; - + for (nibble = 0; nibble < 2; nibble++) { index = ((aByte & (0xF0 >> nibble * 4)) >> (!nibble * 4)); @@ -821,7 +821,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) if (comp == BI_RLE8) { unsigned char first; - + first = aByte; aByte = stream.GetC(); if (first == 0) @@ -846,7 +846,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) else { int absolute = aByte; - + for (i = 0; i < absolute; i++) { linepos++; @@ -894,7 +894,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) else if (bpp == 16) { unsigned char temp; - + stream.Read(&word, 2); linepos += 2; temp = (word & rmask) >> rshift; @@ -908,7 +908,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) else { unsigned char temp; - + stream.Read(&dword, 4); linepos += 4; temp = (dword & rmask) >> rshift; @@ -929,9 +929,9 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) } } if (cmap) free(cmap); - + image->SetMask( FALSE ); - + return TRUE; } #endif // wxUSE_STREAMS @@ -941,18 +941,18 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream ) wxBitmap wxImage::ConvertToBitmap() const { // sizeLimit is the MS upper limit for the DIB size - int sizeLimit = 1024*768*3; - + int sizeLimit = 1024*768*3; + // width and height of the device-dependent bitmap int width = GetWidth(); int bmpHeight = GetHeight(); - + // calc the number of bytes per scanline and padding 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; @@ -962,7 +962,7 @@ wxBitmap wxImage::ConvertToBitmap() const int hRemain = 0; int height = sizeLimit/bytePerLine; if( height >= bmpHeight ) - height = bmpHeight; + height = bmpHeight; else { div_t result = div( bmpHeight, height ); @@ -970,14 +970,14 @@ wxBitmap wxImage::ConvertToBitmap() const hRemain = result.rem; if( hRemain >0 ) numDIB++; } - + // set bitmap parameters wxBitmap bitmap; wxCHECK_MSG( Ok(), bitmap, _T("invalid image") ); bitmap.SetWidth( width ); bitmap.SetHeight( bmpHeight ); bitmap.SetDepth( wxDisplayDepth() ); - + // create a DIB header int headersize = sizeof(BITMAPINFOHEADER); LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); @@ -1006,33 +1006,33 @@ wxBitmap wxImage::ConvertToBitmap() const free( lpDIBh ); return bitmap; } - + // create and set the device-dependent bitmap HDC hdc = ::GetDC(NULL); HDC memdc = ::CreateCompatibleDC( hdc ); HBITMAP hbitmap; hbitmap = ::CreateCompatibleBitmap( hdc, width, bmpHeight ); - ::SelectObject( memdc, hbitmap); - + ::SelectObject( memdc, hbitmap); + // copy image data into DIB data and then into DDB (in a loop) unsigned char *data = GetData(); int i, j, n; int origin = 0; unsigned char *ptdata = data; unsigned char *ptbits; - + for( n=0; n 1 && n == numDIB-1 && hRemain > 0 ) { // redefine height and size of the (possibly) last smaller DIB // memory is not reallocated - height = hRemain; + height = hRemain; lpDIBh->bmiHeader.biHeight = (DWORD)(-height); lpDIBh->bmiHeader.biSizeImage = bytePerLine*height; } ptbits = lpBits; - + for( j=0; jbmiHeader.biHeight = (DWORD)(-height); lpDIBh->bmiHeader.biSizeImage = bytePerLine*height; @@ -1084,7 +1084,7 @@ wxBitmap wxImage::ConvertToBitmap() const { // redefine height and size of the (possibly) last smaller DIB // memory is not reallocated - height = hRemain; + height = hRemain; lpDIBh->bmiHeader.biHeight = (DWORD)(-height); lpDIBh->bmiHeader.biSizeImage = bytePerLine*height; } @@ -1123,20 +1123,20 @@ wxBitmap wxImage::ConvertToBitmap() const bitmap.SetMask( mask ); */ } - - // free allocated resources - ::SelectObject( memdc, 0 ); - ::DeleteDC( memdc ); - ::ReleaseDC(NULL, hdc); + + // free allocated resources + ::SelectObject( memdc, 0 ); + ::DeleteDC( memdc ); + ::ReleaseDC(NULL, hdc); free(lpDIBh); free(lpBits); - + // check the wxBitmap object if( bitmap.GetHBITMAP() ) bitmap.SetOk( TRUE ); else bitmap.SetOk( FALSE ); - + return bitmap; } @@ -1148,29 +1148,29 @@ wxImage::wxImage( const wxBitmap &bitmap ) wxFAIL_MSG( _T("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 ) { wxFAIL_MSG( _T("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 ); @@ -1203,13 +1203,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; @@ -1224,8 +1224,8 @@ wxImage::wxImage( const wxBitmap &bitmap ) ptbits += 3; } ptbits += padding; - } - + } + // similarly, set data according to the possible mask bitmap if( bitmap.GetMask() && bitmap.GetMask()->GetMaskBitmap() ) { @@ -1235,9 +1235,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; idepth; - + bitmap.SetDepth( bpp ); - + if ((bpp == 16) && (visual->red_mask != 0xf800)) bpp = 15; if (bpp < 8) bpp = 8; - + #if (GTK_MINOR_VERSION > 0) if (!HasMask() && (bpp > 8)) { static bool s_hasInitialized = FALSE; - + 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, @@ -1327,40 +1327,40 @@ wxBitmap wxImage::ConvertToBitmap() const GDK_RGB_DITHER_NONE, GetData(), width*3 ); - + gdk_gc_unref( gc ); - + return bitmap; } - + #endif - + // Create picture image - + GdkImage *data_image = gdk_image_new( GDK_IMAGE_FASTEST, gdk_visual_get_system(), width, height ); - + // Create mask image - + GdkImage *mask_image = (GdkImage*) NULL; - + 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 - + enum byte_order { RGB, RBG, BRG, BGR, GRB, GBR }; byte_order b_o = RGB; - + if (bpp >= 24) { GdkVisual *visual = gdk_visual_get_system(); @@ -1371,13 +1371,13 @@ wxBitmap wxImage::ConvertToBitmap() const else if ((visual->green_mask > visual->red_mask) && (visual->red_mask > visual->blue_mask)) b_o = GRB; else if ((visual->green_mask > visual->blue_mask) && (visual->blue_mask > visual->red_mask)) b_o = GBR; } - + int r_mask = GetMaskRed(); int g_mask = GetMaskGreen(); int b_mask = GetMaskBlue(); - + unsigned char* data = GetData(); - + int index = 0; for (int y = 0; y < height; y++) { @@ -1389,7 +1389,7 @@ wxBitmap wxImage::ConvertToBitmap() const index++; int b = data[index]; index++; - + if (HasMask()) { if ((r == r_mask) && (b == b_mask) && (g == g_mask)) @@ -1397,7 +1397,7 @@ wxBitmap wxImage::ConvertToBitmap() const else gdk_image_put_pixel( mask_image, x, y, 0 ); } - + if (HasMask()) { if ((r == r_mask) && (b == b_mask) && (g == g_mask)) @@ -1405,7 +1405,7 @@ wxBitmap wxImage::ConvertToBitmap() const else gdk_image_put_pixel( mask_image, x, y, 0 ); } - + switch (bpp) { case 8: @@ -1420,7 +1420,7 @@ wxBitmap wxImage::ConvertToBitmap() const GdkColormap *cmap = gtk_widget_get_default_colormap(); GdkColor *colors = cmap->colors; int max = 3 * (65536); - + for (int i = 0; i < cmap->size; i++) { int rdiff = (r << 8) - colors[i].red; @@ -1430,9 +1430,9 @@ wxBitmap wxImage::ConvertToBitmap() const if (sum < max) { pixel = i; max = sum; } } } - + gdk_image_put_pixel( data_image, x, y, pixel ); - + break; } case 15: @@ -1466,68 +1466,68 @@ wxBitmap wxImage::ConvertToBitmap() const } } // for } // for - + // Blit picture - + GdkGC *data_gc = gdk_gc_new( bitmap.GetPixmap() ); - + gdk_draw_image( bitmap.GetPixmap(), data_gc, data_image, 0, 0, 0, 0, width, height ); - + gdk_image_destroy( data_image ); gdk_gc_unref( data_gc ); - + // Blit mask - + if (HasMask()) { GdkGC *mask_gc = gdk_gc_new( bitmap.GetMask()->GetBitmap() ); - + gdk_draw_image( bitmap.GetMask()->GetBitmap(), mask_gc, mask_image, 0, 0, 0, 0, width, height ); - + gdk_image_destroy( mask_image ); gdk_gc_unref( mask_gc ); } - + return bitmap; } wxImage::wxImage( const wxBitmap &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") ); - + Create( bitmap.GetWidth(), bitmap.GetHeight() ); char unsigned *data = GetData(); - + if (!data) { gdk_image_destroy( gdk_image ); wxFAIL_MSG( _T("couldn't create image") ); return; } - + GdkImage *gdk_image_mask = (GdkImage*) NULL; if (bitmap.GetMask()) { gdk_image_mask = gdk_image_get( bitmap.GetMask()->GetBitmap(), 0, 0, bitmap.GetWidth(), bitmap.GetHeight() ); - + SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable } - + GdkVisual *visual = gdk_window_get_visual( bitmap.GetPixmap() ); 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; - + GdkColormap *cmap = gtk_widget_get_default_colormap(); - + long pos = 0; for (int j = 0; j < bitmap.GetHeight(); j++) { @@ -1555,7 +1555,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) data[pos+1] = (pixel >> 8) & 0xff; data[pos+2] = pixel & 0xff; } - + if (gdk_image_mask) { int mask_pixel = gdk_image_get_pixel( gdk_image_mask, i, j ); @@ -1566,11 +1566,11 @@ wxImage::wxImage( const wxBitmap &bitmap ) data[pos+2] = 16; } } - + pos += 3; } } - + gdk_image_destroy( gdk_image ); if (gdk_image_mask) gdk_image_destroy( gdk_image_mask ); } @@ -1586,72 +1586,68 @@ wxImage::wxImage( const wxBitmap &bitmap ) wxBitmap wxImage::ConvertToBitmap() const { wxBitmap bitmap; - + wxCHECK_MSG( Ok(), bitmap, _T("invalid image") ); int width = GetWidth(); int height = GetHeight(); - + bitmap.SetHeight( height ); bitmap.SetWidth( width ); - + Display *dpy = (Display*) wxGetDisplay(); Visual* vis = DefaultVisual( dpy, DefaultScreen( dpy ) ); int bpp = DefaultDepth( dpy, DefaultScreen( dpy ) ); - + // Create image - + XImage *data_image = XCreateImage( dpy, vis, bpp, ZPixmap, 0, 0, width, height, 32, 0 ); data_image->data = (char*) malloc( data_image->bytes_per_line * data_image->height ); - + bitmap.Create( width, height, bpp ); /* // Create mask - + GdkImage *mask_image = (GdkImage*) NULL; - + 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 ); } */ - + // Retrieve depth info - + XVisualInfo vinfo_template; XVisualInfo *vi; - + vinfo_template.visual = vis; vinfo_template.visualid = XVisualIDFromVisual( vis ); vinfo_template.depth = bpp; int nitem = 0; - + vi = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem ); - - if (!vi) - { - printf("no visual.\n" ); - return wxNullBitmap; - } - + + wxCHECK_MSG( vi, wxNullBitmap, _T("no visual") ); + XFree( vi ); if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15; if (bpp < 8) bpp = 8; - + // Render - + enum byte_order { RGB, RBG, BRG, BGR, GRB, GBR }; byte_order b_o = RGB; - + if (bpp >= 24) { if ((vi->red_mask > vi->green_mask) && (vi->green_mask > vi->blue_mask)) b_o = RGB; @@ -1661,24 +1657,24 @@ wxBitmap wxImage::ConvertToBitmap() const else if ((vi->green_mask > vi->red_mask) && (vi->red_mask > vi->blue_mask)) b_o = GRB; else if ((vi->green_mask > vi->blue_mask) && (vi->blue_mask > vi->red_mask)) b_o = GBR; } - + /* int r_mask = GetMaskRed(); int g_mask = GetMaskGreen(); int b_mask = GetMaskBlue(); */ - + XColor colors[256]; if (bpp == 8) { Colormap cmap = (Colormap) wxTheApp->GetMainColormap( dpy ); - + for (int i = 0; i < 256; i++) colors[i].pixel = i; XQueryColors( dpy, cmap, colors, 256 ); } - + unsigned char* data = GetData(); - + int index = 0; for (int y = 0; y < height; y++) { @@ -1690,7 +1686,7 @@ wxBitmap wxImage::ConvertToBitmap() const index++; int b = data[index]; index++; - + /* if (HasMask()) { @@ -1700,7 +1696,7 @@ wxBitmap wxImage::ConvertToBitmap() const gdk_image_put_pixel( mask_image, x, y, 0 ); } */ - + switch (bpp) { case 8: @@ -1710,8 +1706,8 @@ wxBitmap wxImage::ConvertToBitmap() const if (wxTheApp->m_colorCube) { pixel = wxTheApp->m_colorCube - [ ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + ((b & 0xf8) >> 3) ]; - } + [ ((r & 0xf8) << 7) + ((g & 0xf8) << 2) + ((b & 0xf8) >> 3) ]; + } else { */ @@ -1761,60 +1757,60 @@ wxBitmap wxImage::ConvertToBitmap() const } } // for } // for - + // Blit picture - + XGCValues gcvalues; gcvalues.foreground = BlackPixel( dpy, DefaultScreen( dpy ) ); GC gc = XCreateGC( dpy, RootWindow ( dpy, DefaultScreen(dpy) ), GCForeground, &gcvalues ); XPutImage( dpy, (Drawable)bitmap.GetPixmap(), gc, data_image, 0, 0, 0, 0, width, height ); - + XDestroyImage( data_image ); XFreeGC( dpy, gc ); - + /* // Blit mask - + if (HasMask()) { GdkGC *mask_gc = gdk_gc_new( bitmap.GetMask()->GetBitmap() ); - + gdk_draw_image( bitmap.GetMask()->GetBitmap(), mask_gc, mask_image, 0, 0, 0, 0, width, height ); - + gdk_image_destroy( mask_image ); gdk_gc_unref( mask_gc ); } */ - + return bitmap; } wxImage::wxImage( const wxBitmap &bitmap ) { wxCHECK_RET( bitmap.Ok(), _T("invalid bitmap") ); - + Display *dpy = (Display*) wxGetDisplay(); Visual* vis = DefaultVisual( dpy, DefaultScreen( dpy ) ); int bpp = DefaultDepth( dpy, DefaultScreen( dpy ) ); - + XImage *ximage = XGetImage( dpy, (Drawable)bitmap.GetPixmap(), 0, 0, bitmap.GetWidth(), bitmap.GetHeight(), AllPlanes, ZPixmap ); - + wxCHECK_RET( ximage, _T("couldn't create image") ); - + Create( bitmap.GetWidth(), bitmap.GetHeight() ); char unsigned *data = GetData(); - + if (!data) { XDestroyImage( ximage ); wxFAIL_MSG( _T("couldn't create image") ); return; } - + /* GdkImage *gdk_image_mask = (GdkImage*) NULL; if (bitmap.GetMask()) @@ -1822,42 +1818,38 @@ wxImage::wxImage( const wxBitmap &bitmap ) gdk_image_mask = gdk_image_get( bitmap.GetMask()->GetBitmap(), 0, 0, bitmap.GetWidth(), bitmap.GetHeight() ); - + SetMaskColour( 16, 16, 16 ); // anything unlikely and dividable } */ - + // Retrieve depth info - + XVisualInfo vinfo_template; XVisualInfo *vi; - + vinfo_template.visual = vis; vinfo_template.visualid = XVisualIDFromVisual( vis ); vinfo_template.depth = bpp; int nitem = 0; - + vi = XGetVisualInfo( dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitem ); - - if (!vi) - { - printf("no visual.\n" ); - return; - } - + + wxCHECK_MSG( vi, wxNullBitmap, _T("no visual") ); + if ((bpp == 16) && (vi->red_mask != 0xf800)) bpp = 15; - + XFree( vi ); - + XColor colors[256]; if (bpp == 8) { Colormap cmap = (Colormap)wxTheApp->GetMainColormap( dpy ); - + for (int i = 0; i < 256; i++) colors[i].pixel = i; XQueryColors( dpy, cmap, colors, 256 ); } - + long pos = 0; for (int j = 0; j < bitmap.GetHeight(); j++) { @@ -1885,7 +1877,7 @@ wxImage::wxImage( const wxBitmap &bitmap ) data[pos+1] = (pixel >> 8) & 0xff; data[pos+2] = pixel & 0xff; } - + /* if (gdk_image_mask) { @@ -1898,11 +1890,11 @@ wxImage::wxImage( const wxBitmap &bitmap ) } } */ - + pos += 3; } } - + XDestroyImage( ximage ); /* if (gdk_image_mask) gdk_image_destroy( gdk_image_mask );