1998-05-20 14:12:05 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
1999-11-24 12:30:56 +00:00
|
|
|
// Name: wx/msw/dib.h
|
2003-03-04 02:15:29 +00:00
|
|
|
// Purpose: wxDIB class representing Win32 device independent bitmaps
|
|
|
|
// Author: Vadim Zeitlin
|
1998-05-20 14:12:05 +00:00
|
|
|
// Modified by:
|
2003-03-04 02:15:29 +00:00
|
|
|
// Created: 03.03.03 (replaces the old file with the same name)
|
1998-05-20 14:12:05 +00:00
|
|
|
// RCS-ID: $Id$
|
2003-03-04 02:15:29 +00:00
|
|
|
// Copyright: (c) 1997-2003 wxWindows team
|
1999-11-24 12:30:56 +00:00
|
|
|
// Licence: wxWindows licence
|
1998-05-20 14:12:05 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2003-03-04 02:15:29 +00:00
|
|
|
#ifndef _WX_MSW_DIB_H_
|
|
|
|
#define _WX_MSW_DIB_H_
|
1999-10-24 19:50:17 +00:00
|
|
|
|
1999-11-12 14:50:44 +00:00
|
|
|
class WXDLLEXPORT wxBitmap;
|
1999-11-24 12:30:56 +00:00
|
|
|
class WXDLLEXPORT wxPalette;
|
|
|
|
|
2003-03-04 02:15:29 +00:00
|
|
|
#include "wx/msw/private.h"
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// wxDIB: represents a DIB section
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class WXDLLEXPORT wxDIB
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
// ctors and such
|
|
|
|
// --------------
|
|
|
|
|
|
|
|
// create an uninitialized DIB with the given width, height and depth (only
|
|
|
|
// 24 and 32 bpp DIBs are currently supported)
|
|
|
|
//
|
|
|
|
// after using this ctor, GetData() and GetHandle() may be used if IsOk()
|
|
|
|
// returns true
|
|
|
|
wxDIB(int width, int height, int depth)
|
|
|
|
{ Init(); (void)Create(width, height, depth); }
|
|
|
|
|
2003-03-23 01:46:31 +00:00
|
|
|
// load a DIB from file (any depth is supoprted here unlike above)
|
|
|
|
//
|
|
|
|
// as above, use IsOk() to see if the bitmap was loaded successfully
|
|
|
|
wxDIB(const wxString& filename)
|
|
|
|
{ Init(); (void)Load(filename); }
|
|
|
|
|
|
|
|
// same as the corresponding ctors but with return value
|
2003-03-04 02:15:29 +00:00
|
|
|
bool Create(int width, int height, int depth);
|
2003-03-23 01:46:31 +00:00
|
|
|
bool Load(const wxString& filename);
|
2003-03-04 02:15:29 +00:00
|
|
|
|
|
|
|
// dtor is not virtual, this class is not meant to be used polymorphically
|
2003-03-23 01:46:31 +00:00
|
|
|
~wxDIB();
|
2003-03-04 02:15:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
// operations
|
|
|
|
// ----------
|
|
|
|
|
2003-03-23 01:46:31 +00:00
|
|
|
// create a bitmap compatiblr with the given HDC (or screen by default) and
|
|
|
|
// return its handle, the caller is responsible for freeing it (using
|
|
|
|
// DeleteObject())
|
|
|
|
HBITMAP CreateDDB(HDC hdc = NULL) const;
|
|
|
|
|
2003-03-04 02:15:29 +00:00
|
|
|
// get the handle from the DIB and reset it, i.e. this object won't destroy
|
|
|
|
// the DIB after this (but the caller should do it)
|
|
|
|
HBITMAP Detach() { HBITMAP hbmp = m_handle; m_handle = 0; return hbmp; }
|
|
|
|
|
2003-03-23 01:46:31 +00:00
|
|
|
#if wxUSE_PALETTE
|
|
|
|
// create a palette for this DIB (always a trivial/default one for 24bpp)
|
|
|
|
wxPalette *CreatePalette() const;
|
|
|
|
#endif // wxUSE_PALETTE
|
|
|
|
|
2003-03-04 02:15:29 +00:00
|
|
|
|
|
|
|
// accessors
|
|
|
|
// ---------
|
|
|
|
|
|
|
|
// return true if DIB was successfully created, false otherwise
|
|
|
|
bool IsOk() const { return m_handle != 0; }
|
|
|
|
|
|
|
|
// get the bitmap size
|
|
|
|
wxSize GetSize() const { DoGetObject(); return wxSize(m_width, m_height); }
|
|
|
|
int GetWidth() const { DoGetObject(); return m_width; }
|
|
|
|
int GetHeight() const { DoGetObject(); return m_height; }
|
|
|
|
|
|
|
|
// get the number of bits per pixel, or depth
|
|
|
|
int GetDepth() const { DoGetObject(); return m_depth; }
|
|
|
|
|
|
|
|
// get the DIB handle
|
|
|
|
HBITMAP GetHandle() const { return m_handle; }
|
|
|
|
|
|
|
|
// get raw pointer to bitmap bits, you should know what you do if you
|
|
|
|
// decide to use it
|
|
|
|
void *GetData() const { DoGetObject(); return m_data; }
|
|
|
|
|
|
|
|
|
|
|
|
// wxImage conversion
|
|
|
|
// ------------------
|
|
|
|
|
|
|
|
#if wxUSE_IMAGE
|
|
|
|
// create a DIB from the given image, the DIB will be either 24 or 32 (if
|
|
|
|
// the image has alpha channel) bpp
|
|
|
|
wxDIB(const wxImage& image) { Init(); (void)Create(image); }
|
|
|
|
|
|
|
|
// same as the above ctor but with the return code
|
|
|
|
bool Create(const wxImage& image);
|
|
|
|
|
|
|
|
// create wxImage having the same data as this DIB
|
|
|
|
wxImage ConvertToImage() const;
|
|
|
|
#endif // wxUSE_IMAGE
|
|
|
|
|
|
|
|
|
|
|
|
// helper functions
|
|
|
|
// ----------------
|
|
|
|
|
|
|
|
// return the size of one line in a DIB with given width and depth: the
|
|
|
|
// point here is that as the scan lines need to be DWORD aligned so we may
|
|
|
|
// need to add some padding
|
|
|
|
static unsigned long GetLineSize(int width, int depth)
|
|
|
|
{
|
|
|
|
return ((width*depth + 31) & ~31) >> 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
// common part of all ctors
|
|
|
|
void Init()
|
|
|
|
{
|
|
|
|
m_handle = 0;
|
|
|
|
|
|
|
|
m_data = NULL;
|
|
|
|
|
|
|
|
m_width =
|
|
|
|
m_height =
|
|
|
|
m_depth = 0;
|
|
|
|
}
|
|
|
|
|
2003-03-23 01:46:31 +00:00
|
|
|
// free resources
|
|
|
|
void Free()
|
|
|
|
{
|
|
|
|
if ( m_handle )
|
|
|
|
{
|
|
|
|
if ( !::DeleteObject(m_handle) )
|
|
|
|
{
|
|
|
|
wxLogLastError(wxT("DeleteObject(hDIB)"));
|
|
|
|
}
|
|
|
|
|
|
|
|
Init();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-03-04 02:15:29 +00:00
|
|
|
// the DIB section handle, 0 if invalid
|
|
|
|
HBITMAP m_handle;
|
|
|
|
|
|
|
|
// NB: we could store only m_handle and not any of the other fields as
|
|
|
|
// we may always retrieve them from it using ::GetObject(), but we
|
|
|
|
// decide to still store them for efficiency concerns -- however if we
|
|
|
|
// don't have them from the very beginning (e.g. DIB constructed from a
|
|
|
|
// bitmap), we only retrieve them when necessary and so these fields
|
|
|
|
// should *never* be accessed directly, even from inside wxDIB code
|
|
|
|
|
|
|
|
// function which must be called before accessing any members and which
|
|
|
|
// gets their values from m_handle, if not done yet
|
|
|
|
void DoGetObject() const;
|
|
|
|
|
|
|
|
// pointer to DIB bits, may be NULL
|
|
|
|
void *m_data;
|
|
|
|
|
|
|
|
// size and depth of the image
|
|
|
|
int m_width,
|
|
|
|
m_height,
|
|
|
|
m_depth;
|
|
|
|
|
|
|
|
|
|
|
|
// DIBs can't be copied
|
|
|
|
wxDIB(const wxDIB&);
|
|
|
|
wxDIB& operator=(const wxDIB&);
|
|
|
|
};
|
|
|
|
|
2003-03-23 01:46:31 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// inline functions implementation
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
inline wxDIB::~wxDIB()
|
|
|
|
{
|
|
|
|
Free();
|
|
|
|
}
|
2001-04-26 16:38:11 +00:00
|
|
|
|
1999-11-24 12:30:56 +00:00
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Functions for working with DIBs
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
|
2003-03-04 02:15:29 +00:00
|
|
|
// WARNING: these functions are private to wxWindows and shouldn't be used
|
|
|
|
// by the user code, they risk to disappear in the next versions!
|
|
|
|
|
1999-11-24 12:30:56 +00:00
|
|
|
// VZ: we have 3 different sets of functions: from bitmap.cpp (wxCreateDIB and
|
|
|
|
// wxFreeDIB), from dib.cpp and from dataobj.cpp - surely there is some
|
|
|
|
// redundancy between them? (FIXME)
|
|
|
|
|
|
|
|
// defined in ole/dataobj.cpp
|
2001-04-26 16:38:11 +00:00
|
|
|
extern WXDLLEXPORT size_t wxConvertBitmapToDIB(LPBITMAPINFO pbi, const wxBitmap& bitmap);
|
|
|
|
extern WXDLLEXPORT wxBitmap wxConvertDIBToBitmap(const LPBITMAPINFO pbi);
|
1999-11-24 12:30:56 +00:00
|
|
|
|
|
|
|
// the rest is defined in dib.cpp
|
1999-11-12 14:50:44 +00:00
|
|
|
|
1998-05-20 14:12:05 +00:00
|
|
|
// Save (device dependent) wxBitmap as a DIB
|
2003-03-18 15:08:21 +00:00
|
|
|
bool wxSaveBitmap(wxChar *filename, wxBitmap *bitmap, wxPalette *palette = NULL);
|
1998-05-20 14:12:05 +00:00
|
|
|
|
|
|
|
// Load device independent bitmap into device dependent bitmap
|
2003-03-18 15:08:21 +00:00
|
|
|
wxBitmap *wxLoadBitmap(wxChar *filename, wxPalette **palette = NULL);
|
1998-05-20 14:12:05 +00:00
|
|
|
|
|
|
|
// Load into existing bitmap;
|
1999-11-26 16:29:54 +00:00
|
|
|
bool wxLoadIntoBitmap(wxChar *filename, wxBitmap *bitmap, wxPalette **pal = NULL);
|
1998-05-20 14:12:05 +00:00
|
|
|
|
1999-10-04 11:39:13 +00:00
|
|
|
HANDLE wxBitmapToDIB (HBITMAP hBitmap, HPALETTE hPal);
|
2003-03-18 15:08:21 +00:00
|
|
|
bool wxReadDIB(LPTSTR lpFileName, HBITMAP *bitmap, HPALETTE *palette);
|
1999-10-04 11:39:13 +00:00
|
|
|
HANDLE wxReadDIB2(LPTSTR lpFileName);
|
|
|
|
LPSTR wxFindDIBBits (LPSTR lpbi);
|
|
|
|
HPALETTE wxMakeDIBPalette(LPBITMAPINFOHEADER lpInfo);
|
1998-05-20 14:12:05 +00:00
|
|
|
|
2003-03-04 02:15:29 +00:00
|
|
|
#endif // _WX_MSW_DIB_H_
|
1999-10-24 19:50:17 +00:00
|
|
|
|