www.pudn.com > WinGOS.rar > GdiObject.cpp


#include "gos.h" 
#include "gdiobject.h" 
 
BOOL CBitmap::CreateBitmap(LPCTSTR pszFileName,CDC* pCompatile) 
{ 
	BYTE aHead[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)]; 
	PBITMAPFILEHEADER pFile=PBITMAPFILEHEADER(aHead); 
	PBITMAPINFOHEADER pInfo=PBITMAPINFOHEADER(pFile+1); 
	DWORD nCTBytes,nSize=sizeof(aHead); 
	PBYTE pBuffer; 
	ASSERT(!m_bmp.bmBits); 
 
	/*HANDLE hFile = CreateFile(pszFileName,GENERIC_READ, 
		0,NULL,OPEN_EXISTING,0,NULL); 
	if(!hFile)return FALSE; 
	ReadFile(hFile,aHead,nSize,&nSize,NULL);*/ 
	if(pFile->bfType!='MB' || nSize!=sizeof(aHead)) 
	{ 
		//CloseHandle(hFile); 
		return FALSE; 
	} 
	nSize=sizeof(BITMAPFILEHEADER)+pInfo->biSize; 
	nCTBytes=MAKELONG(pFile->bfOffBitsL,pFile->bfOffBitsH)-nSize; 
	nSize=MAKELONG(pFile->bfSizeL,pFile->bfSizeH)-nSize; 
	pBuffer=(PBYTE)malloc(nSize); 
	if(!pBuffer) 
		return FALSE; 
 
	m_bmp.bmType=0; 
	m_bmp.bmWidth=pInfo->biWidth; 
	m_bmp.bmHeight=pInfo->biHeight; 
	m_bmp.bmBitsPixel=pInfo->biBitCount; 
	m_bmp.bmBits=pBuffer; 
	m_bmp.bmClrTable=PRGBQUAD(pBuffer+nSize-nCTBytes); 
	m_bmp.bmClrUsed=nCTBytes>>2; 
 
	if(m_bmp.bmBitsPixel>8 || !m_bmp.bmClrUsed) 
		m_bmp.bmClrTable=NULL; 
	if(m_bmp.bmBitsPixel==16 && !pInfo->biCompression) 
		m_bmp.bmType|=BMP_TYPE555; 
	if(nCTBytes) 
	{ 
		nSize-=nCTBytes; 
		//ReadFile(hFile,pBuffer+nSize-nCTBytes,nCTBytes,&nCTBytes,NULL); 
	} 
	//ReadFile(hFile,pBuffer,nSize,&nSize,NULL); 
	//CloseHandle(hFile); 
	 
	return TRUE; 
} 
 
void CBitmap::CreateBitmap(int nWidth,int nHeight,int nBitCount,PVOID pBits) 
{ 
	ASSERT(!m_bmp.bmBits); 
 
	m_bmp.bmBits=pBits; 
	m_bmp.bmBitsPixel=nBitCount; 
	m_bmp.bmHeight=nHeight; 
	m_bmp.bmWidth=nWidth; 
	m_bmp.bmClrTable=NULL; 
	m_bmp.bmType=0; 
} 
 
BOOL CBitmap::CreateBitmap(int nWidth,int nHeight,int nBitCount) 
{ 
	DWORD nBytes; 
	PVOID pBits; 
	ASSERT(!m_bmp.bmBits); 
 
	GETBMPBITSBYTES(nBytes,nWidth,nHeight,nBitCount); 
	pBits=malloc(nBytes); 
	if(pBits) 
	{ 
		m_bmp.bmBits=pBits; 
		m_bmp.bmBitsPixel=nBitCount; 
		m_bmp.bmHeight=nHeight; 
		m_bmp.bmClrTable=NULL; 
		m_bmp.bmType=BMP_OWNBUFFER; 
	} 
	return BOOL(pBits); 
} 
 
BOOL CBitmap::CreateBitmap(int nWidth,int nHeight,CBitmap* pCompatible) 
{ 
	if((nWidth<0)!=(pCompatible->m_bmp.bmHeight<0)) 
		nWidth=-nWidth; 
	if((nHeight<0)!=(pCompatible->m_bmp.bmHeight<0)) 
		nHeight=-nHeight; 
	return CreateBitmap(nWidth,nHeight,int(pCompatible->m_bmp.bmBitsPixel)); 
} 
 
BOOL CBitmap::CreateBitmap(int nWidth,int nHeight,CDC* pCompatible) 
{ 
	return CreateBitmap(nWidth,nHeight,pCompatible->GetCurrentBitmap()); 
} 
 
 
BOOL CBitmap::CreateBitmap(PBITMAPFILEHEADER pFile,CDC* pCompatile) 
{ 
	PBITMAPINFOHEADER pInfo=PBITMAPINFOHEADER(pFile+1); 
	DWORD nOffBits; 
	ASSERT(!m_bmp.bmBits); 
	if(pFile->bfType!='MB') 
		return FALSE; 
 
	nOffBits=MAKELONG(pFile->bfOffBitsL,pFile->bfOffBitsH); 
	m_bmp.bmType=0; 
	m_bmp.bmWidth=pInfo->biWidth; 
	m_bmp.bmHeight=-pInfo->biHeight; 
	m_bmp.bmBitsPixel=pInfo->biBitCount; 
	m_bmp.bmBits=PVOID(DWORD(pFile)+nOffBits); 
	m_bmp.bmClrTable=PRGBQUAD(DWORD(pInfo)+pInfo->biSize); 
	m_bmp.bmClrUsed=PRGBQUAD(m_bmp.bmBits)-PRGBQUAD(m_bmp.bmClrTable); 
 
	if(m_bmp.bmBitsPixel>8 || !m_bmp.bmClrUsed) 
		m_bmp.bmClrTable=NULL; 
	if(m_bmp.bmBitsPixel==16 && !pInfo->biCompression) 
		m_bmp.bmType=BMP_TYPE555; 
 
	if(pCompatile && m_bmp.bmClrTable && m_bmp.bmClrUsed>0) 
	{ 
		CPalette* pPal=(CPalette*)&m_bmp.bmClrTable; 
		PRGBQUAD pColor=m_bmp.bmClrTable; 
		m_bmp.bmClrTable=NULL; 
		nOffBits=pPal->CreatePalette(pCompatile,pColor,m_bmp.bmClrUsed); 
		if(nOffBits) 
			m_bmp.bmClrUsed=-m_bmp.bmClrUsed; 
	} 
	return TRUE; 
} 
 
void CBitmap::CopyBitmap(CBitmap* pSrcBitmap) 
{ 
	int nBytes; 
	PVOID pData; 
	ASSERT(!m_bmp.bmBits); 
	m_bmp=pSrcBitmap->m_bmp; 
	if(!m_bmp.bmBits) 
		return; 
 
	if(m_bmp.bmType & BMP_OWNBUFFER) 
	{ 
		nBytes=_msize(m_bmp.bmBits); 
		pData=malloc(nBytes); 
		CopyMemory(pData,m_bmp.bmBits,nBytes); 
		m_bmp.bmBits=pData; 
	} 
	if(m_bmp.bmClrUsed<0) 
	{ 
		nBytes=_msize(m_bmp.bmClrTable); 
		pData=malloc(nBytes); 
		CopyMemory(pData,m_bmp.bmClrTable,nBytes); 
		m_bmp.bmClrTable=PRGBQUAD(pData); 
	} 
} 
 
void CBitmap::DeleteObject() 
{ 
	if(m_bmp.bmBits) 
	{ 
		if(m_bmp.bmType & BMP_OWNBUFFER) 
			free(m_bmp.bmBits); 
		if(m_bmp.bmClrUsed<0) 
			free(m_bmp.bmClrTable); 
		m_bmp.bmBits=NULL; 
	} 
} 
 
BOOL CPalette::CreatePalette(CDC* pCompatile,CBitmap* pBitmap) 
{ 
	const BITMAP& bmp=pBitmap->GetBitmap(); 
	if(!bmp.bmBits || bmp.bmClrUsed<=0) 
		return FALSE; 
 
	return CreatePalette(pCompatile,bmp.bmClrTable,bmp.bmClrUsed); 
} 
 
BOOL CPalette::CreatePalette(CDC* pCompatile,PRGBQUAD pColorTable,int nCount) 
{ 
	ASSERT(!m_pTable); 
	m_pTable=(PDWORD)malloc(nCount*sizeof(DWORD)); 
	if(!m_pTable) 
		return FALSE; 
 
	pCompatile->GetRopObj().CopyPalette(m_pTable,PDWORD(pColorTable),nCount); 
	return TRUE; 
} 
BOOL CPalette::CreatePalette(CDC* pCompatile,PCOLORREF pColorTable,int nCount) 
{ 
	ASSERT(!m_pTable); 
	m_pTable=(PDWORD)malloc(nCount*sizeof(DWORD)); 
	if(!m_pTable) 
		return FALSE; 
 
	pCompatile->GetRopObj().CopyPalette(m_pTable,PDWORD(pColorTable),-nCount); 
	return TRUE; 
} 
 
BOOL CFont::CreateFont(CCharSet* pCharSet,CFontFace* pFontFace,int nSize) 
{ 
	m_pCharSet=pCharSet?pCharSet:g_pDesktop->m_pCharSet; 
	m_pFontFace=pFontFace?pFontFace:m_pCharSet->GetFontFace(); 
	m_nSize=nSize?nSize:m_pFontFace->GetFontFace().nHeight; 
	return TRUE; 
}