⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdiobject.cpp

📁 一个更为先进的嵌入式操作系统.采用RMS线程调度算法,具有信号量等同步对象.亦包括GUI. 通过该系统您可以极大知道Windows的内部秘密.
💻 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;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -