]> git.saurik.com Git - wxWidgets.git/commitdiff
dec 9, 1998 wxImage related changes
authorUnknown (AN) <nobody@localhost>
Wed, 9 Dec 1998 16:37:12 +0000 (16:37 +0000)
committerUnknown (AN) <nobody@localhost>
Wed, 9 Dec 1998 16:37:12 +0000 (16:37 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1141 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/bitmap.cpp

index 9d8228fea933a0e1e84e65892cf61078c4777fd5..cbb71c3f2e62abde0c5f78222c5ce517e66da6b5 100644 (file)
@@ -30,6 +30,7 @@
 #include "wx/bitmap.h"
 #include "wx/icon.h"
 #endif
+#include "wx/image.h"
 
 #include "wx/msw/private.h"
 #include "wx/log.h"
@@ -76,8 +77,9 @@ wxBitmapRefData::~wxBitmapRefData(void)
   m_hBitmap = 0 ;
 
   if (m_bitmapMask)
-    delete m_bitmapMask;
+//    delete m_bitmapMask;    // this line cause an exception
   m_bitmapMask = NULL;
+
 }
 
 wxList wxBitmap::sm_handlers;
@@ -941,3 +943,230 @@ static long freeDIB(LPBITMAPINFO lpDIBHeader)
 }
 
 
+//-----------------------------------------------------------------------------
+// also implemented here from wxImage
+//-----------------------------------------------------------------------------
+
+/*
+class wxImage : wxGDIObject
+{
+  wxImage( const wxBitmap &bitmap );
+  wxBitmap ConvertToBitmap() const;
+}
+*/
+
+
+wxBitmap wxImage::ConvertToBitmap() const
+{
+  
+  wxBitmap bitmap;
+  wxCHECK_MSG( Ok(), bitmap, "invalid image" );
+  int width = GetWidth();
+  int height = GetHeight();
+  bitmap.SetWidth( width );
+  bitmap.SetHeight( height );
+  bitmap.SetDepth( wxDisplayDepth() );
+
+  int headersize = sizeof(BITMAPINFOHEADER);
+  LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize );
+  wxCHECK_MSG( lpDIBh, bitmap, "could not allocate memory for DIB header" );
+
+// Fill in the DIB header
+  lpDIBh->bmiHeader.biSize = headersize;
+  lpDIBh->bmiHeader.biWidth = width;
+  lpDIBh->bmiHeader.biHeight = -height;
+  lpDIBh->bmiHeader.biSizeImage = width * height * 3;
+
+  lpDIBh->bmiHeader.biPlanes = 1;
+  lpDIBh->bmiHeader.biBitCount = 24;
+  lpDIBh->bmiHeader.biCompression = BI_RGB;
+  lpDIBh->bmiHeader.biClrUsed = 0;
+
+// These seem not needed for our purpose here.
+//  lpDIBh->bmiHeader.biClrImportant = 0;
+//  lpDIBh->bmiHeader.biXPelsPerMeter = 0;
+//  lpDIBh->bmiHeader.biYPelsPerMeter = 0;
+
+  unsigned char *lpBits = (unsigned char *) malloc( width*height*3 );
+  if( !lpBits )
+  {
+      wxFAIL_MSG( "could not allocate memory for DIB" );
+      free( lpDIBh );
+      return bitmap;
+  }
+
+  unsigned char *data = GetData();
+
+  unsigned char *ptdata = data, *ptbits = lpBits;
+  for( int i=0; i<width*height; i++ )
+  {
+    *(ptbits++) = *(ptdata+2);
+    *(ptbits++) = *(ptdata+1);
+    *(ptbits++) = *(ptdata  );
+    ptdata += 3;
+  }
+  HDC hdc = ::GetDC(NULL);
+
+  HBITMAP hbitmap;
+  hbitmap = CreateDIBitmap( hdc, &(lpDIBh->bmiHeader), CBM_INIT, lpBits, lpDIBh, DIB_RGB_COLORS );
+    
+// The above line is equivalent to the following two lines.
+//    hbitmap = ::CreateCompatibleBitmap( hdc, width, height );
+//    ::SetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS);
+// or the following lines
+//    hbitmap = ::CreateCompatibleBitmap( hdc, width, height );
+//    HDC memdc = ::CreateCompatibleDC( hdc );
+//    ::SelectObject( memdc, hbitmap); 
+//    ::SetDIBitsToDevice( memdc, 0, 0, width, height,\
+//         0, 0, 0, height, (void *)lpBits, lpDIBh, DIB_RGB_COLORS);
+//    ::SelectObject( memdc, 0 ); 
+//    ::DeleteDC( memdc ); 
+
+  bitmap.SetHBITMAP( (WXHBITMAP) hbitmap );
+
+  if( HasMask() )
+  {
+    unsigned char r = GetMaskRed();
+    unsigned char g = GetMaskGreen();
+    unsigned char b = GetMaskBlue();
+    unsigned char zero = 0, one = 255;
+    ptdata = data;
+    ptbits = lpBits;
+    for( int i=0; i<width*height; i++ )
+    {
+      if( (*(ptdata++)!=r) | (*(ptdata++)!=g) | (*(ptdata++)!=b) )
+      {
+        *(ptbits++) = zero;
+        *(ptbits++) = zero;
+        *(ptbits++) = zero;
+      }
+      else
+      {
+        *(ptbits++) = one;
+        *(ptbits++) = one;
+        *(ptbits++) = one;
+      }
+    }
+    hbitmap = ::CreateBitmap( (WORD)width, (WORD)height, 1, 1, NULL );
+    ::SetDIBits( hdc, hbitmap, 0, (WORD)height, lpBits, lpDIBh, DIB_RGB_COLORS);
+    wxMask bmpmask;
+    bmpmask.SetMaskBitmap( (WXHBITMAP) hbitmap );
+    bitmap.SetMask( &bmpmask );
+
+/* The following can also be used but is slow to run
+    wxColour colour( GetMaskRed(), GetMaskGreen(), GetMaskBlue());
+    wxMask bmpmask( bitmap, colour );
+    bitmap.SetMask( &bmpmask );
+*/
+  }
+
+  ::ReleaseDC(NULL, hdc);   
+  freeDIB(lpDIBh);
+  free(lpBits);
+
+  if( bitmap.GetHBITMAP() )
+    bitmap.SetOk( TRUE );
+  else
+    bitmap.SetOk( FALSE );
+   
+  return bitmap;
+}
+
+
+wxImage::wxImage( const wxBitmap &bitmap )
+{
+  if( !bitmap.Ok() )
+  {
+      wxFAIL_MSG( "invalid bitmap" );
+      return;
+  }
+
+  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;
+  }
+    
+  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 = width * height * 3;
+
+  lpDIBh->bmiHeader.biPlanes = 1;
+  lpDIBh->bmiHeader.biBitCount = 24;
+  lpDIBh->bmiHeader.biCompression = BI_RGB;
+  lpDIBh->bmiHeader.biClrUsed = 0;
+
+// These seem not needed for our purpose here.
+//    lpDIBh->bmiHeader.biClrImportant = 0;
+//    lpDIBh->bmiHeader.biXPelsPerMeter = 0;
+//    lpDIBh->bmiHeader.biYPelsPerMeter = 0;
+
+  unsigned char *lpBits = (unsigned char *) malloc( width*height*3 );
+  if( !lpBits )
+  {
+      wxFAIL_MSG( "could not allocate data for DIB" );
+      free( data );
+      free( lpDIBh );
+      return;
+  }
+    
+  HBITMAP hbitmap;
+  hbitmap = (HBITMAP) bitmap.GetHBITMAP();
+  HDC hdc = ::GetDC(NULL);
+  ::GetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS );
+       
+  unsigned char *ptdata = data, *ptbits = lpBits;
+  for( int i=0; i<width*height; i++ )
+  {
+    *(ptdata++) = *(ptbits+2);
+    *(ptdata++) = *(ptbits+1);
+    *(ptdata++) = *(ptbits  );
+    ptbits += 3;
+  }    
+      
+  if( bitmap.GetMask() && bitmap.GetMask()->GetMaskBitmap() )
+  {
+    hbitmap = (HBITMAP) bitmap.GetMask()->GetMaskBitmap();
+    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 ); 
+    unsigned char r=16, g=16, b=16;  // background set to RGB(16,16,16)
+    ptdata = data;
+    ptbits = lpBits;
+    for( int i=0; i<width*height; i++ )
+    {
+      if( *ptbits != 0 )
+      {
+        *(ptdata++)  = r;
+        *(ptdata++)  = g;
+        *(ptdata++)  = b;
+      }
+      ptbits += 3;
+    }       
+    SetMaskColour( r, g, b );
+  }    
+      
+  ::ReleaseDC(NULL, hdc);   
+  freeDIB(lpDIBh);
+  free(lpBits);
+}
+
+