added wxDIB::Save() and wxDIB to/from wxBitmap) conversions, use them instead of the old C functions (the latter were removed, there is no old code left any more)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19744 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-03-23 21:33:21 +00:00
parent 26f0e9e2e4
commit 2b254edf9c
6 changed files with 169 additions and 718 deletions
+17 -14
View File
@@ -35,6 +35,10 @@ public:
wxDIB(int width, int height, int depth)
{ Init(); (void)Create(width, height, depth); }
// create a DIB from the DDB
wxDIB(const wxBitmap& bmp)
{ Init(); (void)Create(bmp); }
// load a DIB from file (any depth is supoprted here unlike above)
//
// as above, use IsOk() to see if the bitmap was loaded successfully
@@ -43,6 +47,7 @@ public:
// same as the corresponding ctors but with return value
bool Create(int width, int height, int depth);
bool Create(const wxBitmap& bmp);
bool Load(const wxString& filename);
// dtor is not virtual, this class is not meant to be used polymorphically
@@ -66,6 +71,9 @@ public:
wxPalette *CreatePalette() const;
#endif // wxUSE_PALETTE
// save the DIB as a .BMP file to the file with the given name
bool Save(const wxString& filename);
// accessors
// ---------
@@ -92,8 +100,8 @@ public:
// HBITMAP conversion
// ------------------
// these functions are only used by wxBitmapDataObject implementation in
// src/msw/ole/dataobj.cpp, don't use them directly if possible
// these functions are only used by wxWindows internally right now, please
// don't use them directly if possible as they're subject to change
// creates a DDB compatible with the given (or screen) DC from either
// a plain DIB or a DIB section (in which case the last parameter must be
@@ -102,12 +110,18 @@ public:
HDC hdc = 0,
void *bits = NULL);
// create a plain DIB (not a DIB section) from a DDB, the caller is
// responsable for freeing it using ::GlobalFree()
static HGLOBAL ConvertFromBitmap(HBITMAP hbmp);
// creates a DIB from the given DDB or calculates the space needed by it:
// if pbi is NULL, only the space is calculated, otherwise pbi is supposed
// to point at BITMAPINFO of the correct size which is filled by this
// function
// function (this overload is needed for wxBitmapDataObject code in
// src/msw/ole/dataobj.cpp)
static size_t ConvertFromBitmap(BITMAPINFO *pbi, HBITMAP hbmp);
// wxImage conversion
// ------------------
@@ -199,16 +213,5 @@ inline wxDIB::~wxDIB()
Free();
}
// the rest is defined in dib.cpp
// Save (device dependent) wxBitmap as a DIB
bool wxSaveBitmap(wxChar *filename, wxBitmap *bitmap, wxPalette *palette = NULL);
HANDLE wxBitmapToDIB (HBITMAP hBitmap, HPALETTE hPal);
bool wxReadDIB(LPTSTR lpFileName, HBITMAP *bitmap, HPALETTE *palette);
HANDLE wxReadDIB2(LPTSTR lpFileName);
LPSTR wxFindDIBBits (LPSTR lpbi);
HPALETTE wxMakeDIBPalette(LPBITMAPINFOHEADER lpInfo);
#endif // _WX_MSW_DIB_H_
-1
View File
@@ -487,7 +487,6 @@ bool wxBitmap::DoCreate(int w, int h, int d, WXHDC hdc)
hbmp = dib.Detach();
GetBitmapData()->m_depth = d;
GetBitmapData()->m_hasAlpha = d == 32; // 32bpp DIBs have alpha channel
}
else // create a DDB
{
+6 -6
View File
@@ -220,13 +220,13 @@ bool wxSetClipboardData(wxDataFormat dataFormat,
case wxDF_DIB:
{
#if wxUSE_IMAGE_LOADING_IN_MSW
wxBitmap *bitmap = (wxBitmap *)data;
HBITMAP hBitmap = (HBITMAP)bitmap->GetHBITMAP();
// NULL palette means to use the system one
HANDLE hDIB = wxBitmapToDIB(hBitmap, (HPALETTE)NULL);
handle = SetClipboardData(CF_DIB, hDIB);
#endif // wxUSE_IMAGE_LOADING_IN_MSW
HGLOBAL hDIB = wxDIB::ConvertFromBitmap(GetHbitmapOf(*bitmap));
if ( hDIB )
{
handle = ::SetClipboardData(CF_DIB, hDIB);
}
break;
}
+132 -670
View File
File diff suppressed because it is too large Load Diff
+4 -13
View File
@@ -355,22 +355,13 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap,
bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap,
const wxString& name,
int WXUNUSED(type),
const wxPalette *pal)
const wxPalette * WXUNUSED(pal))
{
#if wxUSE_IMAGE_LOADING_IN_MSW
wxCHECK_MSG( bitmap, false, _T("NULL bitmap in SaveFile") );
#if wxUSE_PALETTE
wxPalette *actualPalette = (wxPalette *)pal;
if ( !actualPalette )
actualPalette = bitmap->GetPalette();
#else
wxPalette *actualPalette = NULL;
#endif // wxUSE_PALETTE
wxDIB dib(*bitmap);
return wxSaveBitmap(WXSTRINGCAST name, bitmap, actualPalette) != 0;
#else
return false;
#endif
return dib.Save(name);
}
// ----------------------------------------------------------------------------
+10 -14
View File
@@ -1103,20 +1103,16 @@ WXHBITMAP wxToolBar::CreateMappedBitmap(WXHINSTANCE WXUNUSED(hInstance), void *i
WXHBITMAP wxToolBar::CreateMappedBitmap(WXHINSTANCE hInstance, WXHBITMAP hBitmap)
{
HANDLE hDIB = wxBitmapToDIB((HBITMAP) hBitmap, 0);
if (hDIB)
{
#ifdef __WINDOWS_386__
LPBITMAPINFOHEADER lpbmInfoHdr = (LPBITMAPINFOHEADER)MK_FP32(GlobalLock(hDIB));
#else
LPBITMAPINFOHEADER lpbmInfoHdr = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
#endif
HBITMAP newBitmap = (HBITMAP) CreateMappedBitmap((WXHINSTANCE) wxGetInstance(), lpbmInfoHdr);
GlobalUnlock(hDIB);
HANDLE hDIB = wxDIB::ConvertFromBitmap((HBITMAP) hBitmap);
if ( !hDIB )
return 0;
WXHBITMAP newBitmap = CreateMappedBitmap(hInstance, GlobalHandle(hDIB));
GlobalFree(hDIB);
return (WXHBITMAP) newBitmap;
}
return 0;
return newBitmap;
}
#endif
#endif // wxUSE_TOOLBAR