www.pudn.com > etree_src.zip > DIB.CPP
//****************************************************************************
// Dib.cpp: implementation of the CDib class.
//
// Copyright (c) Boris J. Wang (e_boris2002@hotmail.com) 2002 - 2003
// From Institute of Computing Technology, Chinese Academy of Sciences
// Beijing 100871, China
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//****************************************************************************
#include "stdafx.h"
#include "Dib.h"
#include "windowsX.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#ifdef DIB_LOAD_FILE_FROM_RESOURCE
BOOL CDib::LoadBitmapFile(const char* ResName)
{
ASSERT(ResName);
ASSERT(!lpBits);
HBITMAP Bitmap;
Bitmap = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,ResName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE);
if(Bitmap)
{BITMAP bm;
if(GetObject(Bitmap,sizeof(BITMAP),&bm))
{
cx = bm.bmWidth;
cy = bm.bmHeight;
lpBits = new BYTE[3*cx*cy];
if(lpBits)
{
GetBitmapBits(Bitmap,3*cx*cy,lpBits);
DeleteObject(Bitmap);
return TRUE;
}
}
DWORD d=GetLastError();
DeleteObject(Bitmap);
return FALSE;
}
else
return FALSE;
}
UINT CDib::GetDibWidth()
{
ASSERT(lpBits);
return cx;
}
UINT CDib::GetDibHeight()
{
ASSERT(lpBits);
return cy;
}
BYTE* CDib::GetDibBitsPtr()
{
ASSERT(lpBits);
return lpBits;
}
CDib::~CDib()
{
if(lpBits)
{
delete [] lpBits;
lpBits = NULL;
}
}
#else
CDib::CDib()
{
m_pBmFileHeader=NULL;
m_pBmInfo=NULL;
m_pBmInfoHeader=NULL;
m_pRGBTable=0;
m_pDibBits=0;
}
CDib::CDib(const char* fileName)
{
m_pBmInfo = NULL;
LoadBitmapFile(fileName);
}
CDib::~CDib()
{
if(m_pBmInfo)delete [] ((BYTE *)m_pBmInfo);
}
BOOL CDib::LoadBitmapFile(const char* fileName)
{
CFile file;
ASSERT(!m_pBmInfo);
ASSERT(fileName);
if(!file.Open(fileName,CFile::modeRead|CFile::shareDenyNone))return FALSE;
BYTE* pDib = NULL;
try
{
//Load Header
BITMAPFILEHEADER bmFileHeader;
file.Read((void*)&bmFileHeader,sizeof(bmFileHeader));
//Check signture
if(bmFileHeader.bfType!=0x4d42)
{
m_pBmFileHeader=0;
m_pBmInfo=0;
m_pBmInfoHeader=0;
m_pRGBTable=0;
m_pDibBits=0;
m_numColors=0;
return FALSE;
}
DWORD fileLength=file.GetLength();
DWORD dibSize=fileLength-sizeof(bmFileHeader);
pDib=new BYTE[dibSize];
file.Read(pDib,dibSize);
file.Close();
m_pBmInfo=(LPBITMAPINFO)pDib;
m_pBmInfoHeader=(LPBITMAPINFOHEADER)pDib;
m_pBmInfoHeader->biSizeImage=GetDibSizeImage();
m_pDibBits=pDib+m_pBmInfoHeader->biSize;
}
catch(CFileException * e)
{
e->Delete();
if(pDib)delete [] pDib;
return FALSE;
}
return TRUE;
}
DWORD CDib::GetDibSizeImage()
{
ASSERT(m_pBmInfoHeader);
if(m_pBmInfoHeader->biSizeImage==0)
{
//Width
DWORD byteWidth=(DWORD)GetDibWidth();
//Height
DWORD height=(DWORD)GetDibHeight();
DWORD imageSize=byteWidth*height;
return imageSize;
}
else
return m_pBmInfoHeader->biSizeImage;
}
UINT CDib::GetDibWidth()
{
ASSERT(m_pBmInfoHeader);
return (UINT)m_pBmInfoHeader->biWidth;
}
UINT CDib::GetDibHeight()
{
ASSERT(m_pBmInfoHeader);
return (UINT)m_pBmInfoHeader->biHeight;
}
LPBITMAPINFOHEADER CDib::GetDibInfoHeaderPtr()
{
ASSERT(m_pBmInfoHeader);
return m_pBmInfoHeader;
}
LPBITMAPINFO CDib::GetDIbInfoPtr()
{
ASSERT(m_pBmInfo);
return m_pBmInfo;
}
BYTE* CDib::GetDibBitsPtr()
{
ASSERT(m_pDibBits);
return m_pDibBits;
}
#endif