// dib256.h
//

#ifndef DIB256_H
#define DIB256_H

#pragma once

class CDIBitmap
{
friend class CBmpPalette;

public:
	BITMAPINFO*  m_pInfo;
	BYTE*        m_pPixels;
	CBmpPalette* m_pPal;
	BOOL         m_bIsPadded;

public:		//constructors
	CDIBitmap();
	virtual ~CDIBitmap();

private:
	CDIBitmap(const CDIBitmap& dbmp);

public:
	BITMAPINFO*	 GetHeaderPtr() const;
	BYTE*        GetPixelPtr() const;
	RGBQUAD*     GetColorTablePtr() const;
	int          GetWidth() const;
	int          GetHeight() const;
	CBmpPalette* GetPalette() { return m_pPal; }

public:		// operations
	BOOL CreatePalette();	// auto. made by "Load()" and "CreateFromBitmap()"
	void ClearPalette();		// destroy the palette associated with this image
	BOOL CreateFromBitmap(CDC*, CBitmap*);
	BOOL LoadResource(LPCTSTR ID);
	BOOL LoadResource(UINT ID) { return LoadResource(MAKEINTRESOURCE(ID)); }
	BOOL LoadBitmap(UINT ID) { return LoadResource(ID); }
	BOOL LoadBitmap(LPCTSTR ID) { return LoadResource(ID); }
	void DestroyBitmap();
	BOOL DeleteObject() { DestroyBitmap(); return TRUE; }
	
public:		// overridables
		// draw the bitmap at the specified location
	virtual void DrawDIB(CDC * pDC, int x=0, int y=0);

		// draw the bitmap and stretch/compress it to the desired size
	virtual void DrawDIB(CDC * pDC, int x, int y, int width, int height);

		// draw parts of the dib into a given area of the DC
	virtual int DrawDIB(CDC * pDC, CRect & rectDC, CRect & rectDIB);

		// load a bitmap from disk
	virtual BOOL Load(CFile* pFile);
	virtual BOOL Load(const CString&);

		// save the bitmap to disk
	virtual BOOL Save(CFile* pFile);
	virtual BOOL Save(const CString&);

protected:
	int   GetPalEntries() const;
	int   GetPalEntries(BITMAPINFOHEADER& infoHeader) const;
	DWORD GetBitsPerPixel() const;
	DWORD LastByte(DWORD BitsPerPixel, DWORD PixelCount) const;
	DWORD GetBytesPerLine(DWORD BitsPerPixel, DWORD Width) const;
	BOOL  PadBits();
	BOOL  UnPadBits();
	WORD  GetColorCount() const;
};

#include "dibpal.h"

#endif	// DIB256_H