]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/bitmap.cpp
Committing in .
[wxWidgets.git] / src / msw / bitmap.cpp
index d6e1ddd207d311524202ca717c087dc7067e605b..c4b2b8bed5bf34724daf510fe1c60d47df11f32d 100644 (file)
@@ -144,6 +144,10 @@ bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon)
     refData->m_bitmapMask = new wxMask((WXHBITMAP)
                                         wxInvertMask(iconInfo.hbmMask, w, h));
 
     refData->m_bitmapMask = new wxMask((WXHBITMAP)
                                         wxInvertMask(iconInfo.hbmMask, w, h));
 
+
+    // delete the old one now as we don't need it any more
+    ::DeleteObject(iconInfo.hbmMask);
+
 #if WXWIN_COMPATIBILITY_2
     refData->m_ok = TRUE;
 #endif // WXWIN_COMPATIBILITY_2
 #if WXWIN_COMPATIBILITY_2
     refData->m_ok = TRUE;
 #endif // WXWIN_COMPATIBILITY_2
@@ -242,9 +246,9 @@ wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
         // we assume that it is in XBM format which is not quite the same as
         // the format CreateBitmap() wants because the order of bytes in the
         // line is inversed!
         // we assume that it is in XBM format which is not quite the same as
         // the format CreateBitmap() wants because the order of bytes in the
         // line is inversed!
-        static const size_t bytesPerLine = (width + 7) / 8;
-        static const size_t padding = bytesPerLine % 2;
-        static const size_t len = height * ( padding + bytesPerLine );
+        const size_t bytesPerLine = (width + 7) / 8;
+        const size_t padding = bytesPerLine % 2;
+        const size_t len = height * ( padding + bytesPerLine );
         data = (char *)malloc(len);
         const char *src = bits;
         char *dst = data;
         data = (char *)malloc(len);
         const char *src = bits;
         char *dst = data;
@@ -297,15 +301,15 @@ bool wxBitmap::CreateFromXpm(const char **data)
     Init();
 
     wxCHECK_MSG( data != NULL, FALSE, wxT("invalid bitmap data") )
     Init();
 
     wxCHECK_MSG( data != NULL, FALSE, wxT("invalid bitmap data") )
-    
+
     wxXPMDecoder decoder;
     wxImage img = decoder.ReadData(data);
     wxCHECK_MSG( img.Ok(), FALSE, wxT("invalid bitmap data") )
     wxXPMDecoder decoder;
     wxImage img = decoder.ReadData(data);
     wxCHECK_MSG( img.Ok(), FALSE, wxT("invalid bitmap data") )
-    
+
     *this = wxBitmap(img);
     return TRUE;
 #else
     *this = wxBitmap(img);
     return TRUE;
 #else
-       return FALSE;
+    return FALSE;
 #endif
 }
 
 #endif
 }
 
@@ -382,6 +386,10 @@ bool wxBitmap::Create(int w, int h, int d)
 
 bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
 {
 
 bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
 {
+#ifdef __WXMICROWIN__
+    // TODO
+    return FALSE;
+#else
     wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") )
 
     m_refData = new wxBitmapRefData();
     wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") )
 
     m_refData = new wxBitmapRefData();
@@ -427,6 +435,9 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
     if (depth == -1) depth = wxDisplayDepth();
     SetDepth( depth );
 
     if (depth == -1) depth = wxDisplayDepth();
     SetDepth( depth );
 
+    // Copy the palette from the source image
+    SetPalette(image.GetPalette());
+
     // create a DIB header
     int headersize = sizeof(BITMAPINFOHEADER);
     BITMAPINFO *lpDIBh = (BITMAPINFO *) malloc( headersize );
     // create a DIB header
     int headersize = sizeof(BITMAPINFOHEADER);
     BITMAPINFO *lpDIBh = (BITMAPINFO *) malloc( headersize );
@@ -463,12 +474,14 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
     hbitmap = ::CreateCompatibleBitmap( hdc, width, bmpHeight );
     ::SelectObject( memdc, hbitmap);
 
     hbitmap = ::CreateCompatibleBitmap( hdc, width, bmpHeight );
     ::SelectObject( memdc, hbitmap);
 
+#if wxUSE_PALETTE
     HPALETTE hOldPalette = 0;
     if (image.GetPalette().Ok())
     {
         hOldPalette = ::SelectPalette(memdc, (HPALETTE) image.GetPalette().GetHPALETTE(), FALSE);
         ::RealizePalette(memdc);
     }
     HPALETTE hOldPalette = 0;
     if (image.GetPalette().Ok())
     {
         hOldPalette = ::SelectPalette(memdc, (HPALETTE) image.GetPalette().GetHPALETTE(), FALSE);
         ::RealizePalette(memdc);
     }
+#endif // wxUSE_PALETTE
 
     // copy image data into DIB data and then into DDB (in a loop)
     unsigned char *data = image.GetData();
 
     // copy image data into DIB data and then into DDB (in a loop)
     unsigned char *data = image.GetData();
@@ -519,8 +532,10 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
     }
     SetHBITMAP( (WXHBITMAP) hbitmap );
 
     }
     SetHBITMAP( (WXHBITMAP) hbitmap );
 
+#if wxUSE_PALETTE
     if (hOldPalette)
         SelectPalette(memdc, hOldPalette, FALSE);
     if (hOldPalette)
         SelectPalette(memdc, hOldPalette, FALSE);
+#endif // wxUSE_PALETTE
 
     // similarly, created an mono-bitmap for the possible mask
     if( image.HasMask() )
 
     // similarly, created an mono-bitmap for the possible mask
     if( image.HasMask() )
@@ -604,10 +619,15 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
     if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 
     return TRUE;
     if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
 
     return TRUE;
+#endif
 }
 
 wxImage wxBitmap::ConvertToImage() const
 {
 }
 
 wxImage wxBitmap::ConvertToImage() const
 {
+#ifdef __WXMICROWIN__
+    // TODO
+    return wxImage();
+#else
     wxImage image;
 
     wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") );
     wxImage image;
 
     wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") );
@@ -732,6 +752,7 @@ wxImage wxBitmap::ConvertToImage() const
     free(lpBits);
 
     return image;
     free(lpBits);
 
     return image;
+#endif
 }
 
 #endif // wxUSE_IMAGE
 }
 
 #endif // wxUSE_IMAGE
@@ -782,7 +803,9 @@ bool wxBitmap::Create(void *data, long type, int width, int height, int depth)
     return handler->Create(this, data, type, width, height, depth);
 }
 
     return handler->Create(this, data, type, width, height, depth);
 }
 
-bool wxBitmap::SaveFile(const wxString& filename, int type, const wxPalette *palette)
+bool wxBitmap::SaveFile(const wxString& filename,
+                        int type,
+                        const wxPalette *palette)
 {
     wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler);
 
 {
     wxBitmapHandler *handler = wxDynamicCast(FindHandler(type), wxBitmapHandler);
 
@@ -872,6 +895,8 @@ void wxBitmap::SetOk(bool isOk)
 }
 #endif // WXWIN_COMPATIBILITY_2
 
 }
 #endif // WXWIN_COMPATIBILITY_2
 
+#if wxUSE_PALETTE
+
 void wxBitmap::SetPalette(const wxPalette& palette)
 {
     EnsureHasData();
 void wxBitmap::SetPalette(const wxPalette& palette)
 {
     EnsureHasData();
@@ -879,6 +904,8 @@ void wxBitmap::SetPalette(const wxPalette& palette)
     GetBitmapData()->m_bitmapPalette = palette;
 }
 
     GetBitmapData()->m_bitmapPalette = palette;
 }
 
+#endif // wxUSE_PALETTE
+
 void wxBitmap::SetMask(wxMask *mask)
 {
     EnsureHasData();
 void wxBitmap::SetMask(wxMask *mask)
 {
     EnsureHasData();
@@ -901,6 +928,7 @@ wxBitmap wxBitmap::GetBitmapForDC(wxDC& dc) const
     LPBITMAPINFO    lpDib;
     void            *lpBits = (void*) NULL;
 
     LPBITMAPINFO    lpDib;
     void            *lpBits = (void*) NULL;
 
+#if wxUSE_PALETTE
     if( GetPalette() && GetPalette()->Ok() )
     {
         tmpBitmap.SetPalette(*GetPalette());
     if( GetPalette() && GetPalette()->Ok() )
     {
         tmpBitmap.SetPalette(*GetPalette());
@@ -917,6 +945,9 @@ wxBitmap wxBitmap::GetBitmapForDC(wxDC& dc) const
         memDC.SelectObject(tmpBitmap);
         memDC.SetPalette( palette );
     }
         memDC.SelectObject(tmpBitmap);
         memDC.SetPalette( palette );
     }
+#else // !wxUSE_PALETTE
+    hPal = (HPALETTE) ::GetStockObject(DEFAULT_PALETTE);
+#endif // wxUSE_PALETTE/!wxUSE_PALETTE
 
     // set the height negative because in a DIB the order of the lines is
     // reversed
 
     // set the height negative because in a DIB the order of the lines is
     // reversed
@@ -1022,6 +1053,8 @@ bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex)
         ::DeleteObject((HBITMAP) m_maskBitmap);
         m_maskBitmap = 0;
     }
         ::DeleteObject((HBITMAP) m_maskBitmap);
         m_maskBitmap = 0;
     }
+
+#if wxUSE_PALETTE
     if (bitmap.Ok() && bitmap.GetPalette()->Ok())
     {
         unsigned char red, green, blue;
     if (bitmap.Ok() && bitmap.GetPalette()->Ok())
     {
         unsigned char red, green, blue;
@@ -1031,6 +1064,8 @@ bool wxMask::Create(const wxBitmap& bitmap, int paletteIndex)
             return Create(bitmap, transparentColour);
         }
     }
             return Create(bitmap, transparentColour);
         }
     }
+#endif // wxUSE_PALETTE
+
     return FALSE;
 }
 
     return FALSE;
 }
 
@@ -1052,7 +1087,7 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
 
     // scan the bitmap for the transparent colour and set the corresponding
     // pixels in the mask to BLACK and the rest to WHITE
 
     // scan the bitmap for the transparent colour and set the corresponding
     // pixels in the mask to BLACK and the rest to WHITE
-    COLORREF maskColour = wxColourToRGB(colour);
+    COLORREF maskColour = RGB(colour.Red(), colour.Green(), colour.Blue());
     m_maskBitmap = (WXHBITMAP)::CreateBitmap(width, height, 1, 1, 0);
 
     HDC srcDC = ::CreateCompatibleDC(NULL);
     m_maskBitmap = (WXHBITMAP)::CreateBitmap(width, height, 1, 1, 0);
 
     HDC srcDC = ::CreateCompatibleDC(NULL);