亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? enbitmap.cpp

?? 強(qiáng)大易用的郵件收發(fā)客戶端
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
// EnBitmap.cpp: implementation of the CEnBitmap class (c) daniel godson 2002.
//
// credits: Peter Hendrix's CPicture implementation for the original IPicture code 
//          Yves Maurer's GDIRotate implementation for the idea of working directly on 32 bit representations of bitmaps 
//          Karl Lager's 'A Fast Algorithm for Rotating Bitmaps' 
// 
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "EnBitmap.h"
#include "color.h"
#include "getwinver.h"

#include <afxpriv.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

const int HIMETRIC_INCH	= 2540;

enum 
{
	FT_BMP,
	FT_ICO,
	FT_JPG,
	FT_GIF,

	FT_UNKNOWN
};

///////////////////////////////////////////////////////////////////////

C32BitImageProcessor::C32BitImageProcessor(BOOL bEnableWeighting) : m_bWeightingEnabled(bEnableWeighting)
{
	m_bBk = FALSE;
}

void C32BitImageProcessor::SetBkColor(int R, int G, int B)
{
	m_bBk = TRUE;
	m_nRed = R;
	m_nGreen = G;
	m_nBlue = B;
}

C32BitImageProcessor::~C32BitImageProcessor()
{
}

CSize C32BitImageProcessor::CalcDestSize(CSize sizeSrc) 
{ 
	return sizeSrc; // default
}

BOOL C32BitImageProcessor::IsBkColor(RGBX*p)
{
	if (!m_bBk)
		return FALSE;
	if (p->btRed == m_nRed && p->btGreen == m_nGreen && p->btBlue==m_nBlue)
		return TRUE;
	return FALSE;
}

BOOL C32BitImageProcessor::ProcessPixels(RGBX* pSrcPixels, CSize , RGBX* pDestPixels, CSize sizeDest)
{ 
	CopyMemory(pDestPixels, pSrcPixels, sizeDest.cx * 4 * sizeDest.cy); // default
	return TRUE;
}
 
// C32BitImageProcessor::CalcWeightedColor(...) is inlined in EnBitmap.h

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CEnBitmap::CEnBitmap(COLORREF crBkgnd) : m_crBkgnd(crBkgnd)
{

}

CEnBitmap::~CEnBitmap()
{

}

BOOL CEnBitmap::GrayImage()
{
	CImageGrayer gr;	
	return ProcessImage(&gr);
}


BOOL CEnBitmap::ProcessImage(C32BitImageProcessor* pProcessor)
{
	C32BIPArray aProcessors;

	aProcessors.Add(pProcessor);

	return ProcessImage(aProcessors);
}

COLORREF CEnBitmap::GetBkColor()
{
	if (!GetSafeHandle())
		return FALSE;

	RGBX* pSrcPixels = GetDIBits32();

	if (!pSrcPixels)
		return FALSE;
	
	COLORREF bk = RGB(pSrcPixels->btRed, 
		pSrcPixels->btGreen, pSrcPixels->btBlue);

	delete[] pSrcPixels;

	return bk;
}

BOOL CEnBitmap::ProcessImage(C32BIPArray& aProcessors)
{
	ASSERT (GetSafeHandle());

	if (!GetSafeHandle())
		return FALSE;

	if (!aProcessors.GetSize())
		return TRUE;

	int nProcessor, nCount = aProcessors.GetSize();

	// retrieve src and final dest sizes
	BITMAP BM;

	if (!GetBitmap(&BM))
		return FALSE;

	CSize sizeSrc(BM.bmWidth, BM.bmHeight);
	CSize sizeDest(sizeSrc), sizeMax(sizeSrc);

	for (nProcessor = 0; nProcessor < nCount; nProcessor++)
	{
		sizeDest = aProcessors[nProcessor]->CalcDestSize(sizeDest);
		sizeMax = CSize(max(sizeMax.cx, sizeDest.cx), max(sizeMax.cy, sizeDest.cy));
	}

	// prepare src and dest bits
	RGBX* pSrcPixels = GetDIBits32();

	if (!pSrcPixels)
		return FALSE;

	RGBX* pDestPixels = new RGBX[sizeMax.cx * sizeMax.cy];

	if (!pDestPixels)
		return FALSE;

	Fill(pDestPixels, sizeMax, m_crBkgnd);

	BOOL bRes = TRUE;
	sizeDest = sizeSrc;

	// do the processing
	for (nProcessor = 0; bRes && nProcessor < nCount; nProcessor++)
	{
		// if its the second processor or later then we need to copy
		// the previous dest bits back into source.
		// we also need to check that sizeSrc is big enough
		if (nProcessor > 0)
		{
			if (sizeSrc.cx < sizeDest.cx || sizeSrc.cy < sizeDest.cy)
			{
				delete [] pSrcPixels;
				pSrcPixels = new RGBX[sizeDest.cx * sizeDest.cy];
			}

			CopyMemory(pSrcPixels, pDestPixels, sizeDest.cx * 4 * sizeDest.cy); // default
			Fill(pDestPixels, sizeDest, m_crBkgnd);
		}

		sizeSrc = sizeDest;
		sizeDest = aProcessors[nProcessor]->CalcDestSize(sizeSrc);
		
		bRes = aProcessors[nProcessor]->ProcessPixels(pSrcPixels, sizeSrc, pDestPixels, sizeDest);
	}

	// update the bitmap
	if (bRes)
	{
		// set the bits
		HDC hdc = GetDC(NULL);
		HBITMAP hbmSrc = ::CreateCompatibleBitmap(hdc, sizeDest.cx, sizeDest.cy);

		if (hbmSrc)
		{
			BITMAPINFO bi;

			if (PrepareBitmapInfo32(bi, hbmSrc))
			{
				if (SetDIBits(hdc, hbmSrc, 0, sizeDest.cy, pDestPixels, &bi, DIB_RGB_COLORS))
				{
					// delete the bitmap and attach new
					DeleteObject();
					bRes = Attach(hbmSrc);
				}
			}

			::ReleaseDC(NULL, hdc);

			if (!bRes)
				::DeleteObject(hbmSrc);
		}
	}

	delete [] pSrcPixels;
	delete [] pDestPixels;

	return bRes;
}

RGBX* CEnBitmap::GetDIBits32()
{
	BITMAPINFO bi;

	int nHeight = PrepareBitmapInfo32(bi);
	
	if (!nHeight)
		return FALSE;

	BYTE* pBits = (BYTE*)new BYTE[bi.bmiHeader.biSizeImage];
	HDC hdc = GetDC(NULL);

	if (!GetDIBits(hdc, (HBITMAP)GetSafeHandle(), 0, nHeight, pBits, &bi, DIB_RGB_COLORS))
	{
		delete pBits;
		pBits = NULL;
	}

	::ReleaseDC(NULL, hdc);

	return (RGBX*)pBits;
}

BOOL CEnBitmap::PrepareBitmapInfo32(BITMAPINFO& bi, HBITMAP hBitmap)
{
	if (!hBitmap)
		hBitmap = (HBITMAP)GetSafeHandle();

	BITMAP BM;

	if (!::GetObject(hBitmap, sizeof(BM), &BM))
		return FALSE;

	bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
	bi.bmiHeader.biWidth = BM.bmWidth;
	bi.bmiHeader.biHeight = -BM.bmHeight;
	bi.bmiHeader.biPlanes = 1;
	bi.bmiHeader.biBitCount = 32; // 32 bit
	bi.bmiHeader.biCompression = BI_RGB; // 32 bit
	bi.bmiHeader.biSizeImage = BM.bmWidth * 4 * BM.bmHeight; // 32 bit
	bi.bmiHeader.biClrUsed = 0;
	bi.bmiHeader.biClrImportant = 0;

	return BM.bmHeight;
}

BOOL CEnBitmap::Fill(RGBX* pPixels, CSize size, COLORREF color)
{
	if (!pPixels)
		return FALSE;

	if (color == -1 || color == RGB(255, 255, 255))
		FillMemory(pPixels, size.cx * 4 * size.cy, 255); // white

	else if (color == 0)
		FillMemory(pPixels, size.cx * 4 * size.cy, 0); // black

	else
	{
		// fill the first line with the color
		RGBX* pLine = &pPixels[0];
		int nSize = 1;

		pLine[0] = RGBX(color);

		while (1)
		{
			if (nSize > size.cx)
				break;

			// else
			int nAmount = min(size.cx - nSize, nSize) * 4;

			CopyMemory(&pLine[nSize], pLine, nAmount);
			nSize *= 2;
		}

		// use that line to fill the rest of the block
		int nRow = 1;

		while (1)
		{
			if (nRow > size.cy)
				break;

			// else
			int nAmount = min(size.cy - nRow, nRow) * size.cx * 4;

			CopyMemory(&pPixels[nRow * size.cx], pPixels, nAmount);
			nRow *= 2;
		}
	}

	return TRUE;
}
void CEnBitmap::MakeHot(COLORREF bk)
{
	int R = GetRValue(bk);
	int G = GetGValue(bk);
	int B = GetBValue(bk);

	C32BIPArray aProcessors;

	CImageOffs offs;
	offs.SetBkColor(R, G, B);
	aProcessors.Add(&offs);

	CImageShadow shadow(GetSysColor(COLOR_3DSHADOW));
	shadow.SetBkColor(R, G, B);
	aProcessors.Add(&shadow);

	ProcessImage(aProcessors);
}

BOOL  CEnBitmap::ApplyAlpha(COLORREF bk)
{
	if (0)//IsComCtl6())	// this sytem allows direct usage
	{
		CDC dcSrc;
		dcSrc.CreateCompatibleDC(NULL);

		BITMAPINFOHEADER bmpi;
		ZeroMemory(&bmpi, sizeof(bmpi));

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂av在线一区| 国内精品国产三级国产a久久| 日韩一区二区三区四区五区六区| 成人在线视频一区| 蜜桃视频一区二区三区在线观看 | 欧美色倩网站大全免费| 国产在线国偷精品产拍免费yy| 亚洲影院免费观看| 中文欧美字幕免费| 精品国产91九色蝌蚪| 在线观看日产精品| 91影视在线播放| 国产成人免费视频网站| 久久电影国产免费久久电影 | 亚洲欧美另类图片小说| 国产日韩欧美麻豆| 欧美精品一区二区在线播放| 欧美日韩精品一区视频| 99国产欧美另类久久久精品 | 国内精品国产三级国产a久久| 香蕉久久夜色精品国产使用方法 | 色综合网色综合| 成人av在线观| 成人综合婷婷国产精品久久| 国精产品一区一区三区mba视频| 日韩激情在线观看| 亚洲国产日韩一级| 亚洲一级片在线观看| 亚洲欧美日韩中文字幕一区二区三区 | 日本不卡一二三区黄网| 午夜久久久久久久久久一区二区| 亚洲一区二区在线观看视频| 日韩美女视频一区| 亚洲丝袜美腿综合| 亚洲欧美激情小说另类| 亚洲欧美精品午睡沙发| 一区二区三区中文字幕| 亚洲精品国产精品乱码不99 | 久久精品99久久久| 久久不见久久见中文字幕免费| 日韩精品电影一区亚洲| 日韩电影在线免费看| 蜜臀av性久久久久蜜臀av麻豆| 免费成人av在线| 久久精品72免费观看| 国产一区不卡视频| 成人看片黄a免费看在线| av欧美精品.com| 欧美综合欧美视频| 欧美人体做爰大胆视频| 日韩欧美一区二区免费| 欧美精品一区二区高清在线观看| 精品欧美久久久| 中文字幕免费不卡| 国产精品国产三级国产有无不卡| 综合av第一页| 爽好多水快深点欧美视频| 奇米精品一区二区三区四区| 精品在线观看免费| 成人激情视频网站| 在线观看国产一区二区| 日韩亚洲欧美成人一区| 国产情人综合久久777777| 亚洲欧洲国产日韩| 日韩电影网1区2区| 成人网在线播放| 欧美日韩亚洲综合一区二区三区| 日韩精品一区二区三区视频| 中文字幕va一区二区三区| 亚洲一区二区成人在线观看| 久久se这里有精品| 国产99久久久国产精品潘金| 91福利社在线观看| 精品国产麻豆免费人成网站| 国产精品盗摄一区二区三区| 亚洲国产成人精品视频| 国产一区二区三区免费在线观看| 一本到不卡免费一区二区| 日韩欧美一级特黄在线播放| 中文字幕一区二区不卡| 日本美女一区二区| 成年人国产精品| 欧美一区二区三区视频在线| 国产精品久久久久影院色老大| 同产精品九九九| av在线不卡电影| 日韩欧美国产午夜精品| 亚洲欧美日韩电影| 国产精品自拍一区| 欧美日韩国产小视频在线观看| 国产欧美精品区一区二区三区| 亚洲v日本v欧美v久久精品| 国产成人午夜视频| 欧美精品日韩一区| 日韩毛片精品高清免费| 精品一区二区三区欧美| 欧美亚洲国产一区二区三区va | 亚洲国产成人av网| 成人av在线网| 久久免费午夜影院| 日本vs亚洲vs韩国一区三区 | 国产成人精品影院| 欧美一二三四区在线| 一区二区三区日韩精品视频| 国产传媒一区在线| 欧美电视剧免费观看| 一区二区欧美在线观看| 国产91高潮流白浆在线麻豆| 欧美一区二区大片| 亚洲国产成人av网| 91麻豆国产精品久久| 欧美激情一区不卡| 国产老妇另类xxxxx| 91.麻豆视频| 亚洲成国产人片在线观看| 色综合天天综合网国产成人综合天| 精品国产精品网麻豆系列| 日韩福利视频网| 欧美男人的天堂一二区| 亚洲国产精品嫩草影院| 91福利小视频| 一个色妞综合视频在线观看| 91婷婷韩国欧美一区二区| 国产精品毛片a∨一区二区三区| 国产福利一区二区三区在线视频| 日韩欧美一二区| 久久爱另类一区二区小说| 日韩欧美专区在线| 免费精品视频最新在线| 日韩女优av电影| 韩国一区二区三区| 国产午夜精品在线观看| 国产成人综合在线| 欧美经典一区二区| 成人h精品动漫一区二区三区| 国产精品久久久久一区| 91一区二区在线| 亚洲综合在线第一页| 欧美性猛片xxxx免费看久爱| 亚洲成人av一区二区三区| 6080亚洲精品一区二区| 美女免费视频一区| 久久精品夜色噜噜亚洲aⅴ| 国产999精品久久久久久绿帽| 国产精品无遮挡| 欧美综合在线视频| 日韩国产高清影视| 久久亚洲二区三区| 99国产精品国产精品毛片| 亚洲男人都懂的| 欧美亚一区二区| 日本女人一区二区三区| 久久久另类综合| 91网站黄www| 日韩精彩视频在线观看| 国产亚洲欧美日韩俺去了| 成人高清伦理免费影院在线观看| 亚洲裸体在线观看| 7777精品伊人久久久大香线蕉最新版| 欧美bbbbb| 国产精品乱子久久久久| 欧美性猛片aaaaaaa做受| 久久精品久久久精品美女| 国产亚洲欧美日韩在线一区| 91浏览器在线视频| 日本在线观看不卡视频| 久久久久久久久久美女| 色狠狠av一区二区三区| 美国十次综合导航| 1024国产精品| 欧美一级高清片在线观看| 成人av小说网| 午夜成人免费视频| 中文字幕av免费专区久久| 在线观看亚洲精品| 激情综合网av| 亚洲美女一区二区三区| 日韩视频免费直播| 99久久婷婷国产| 狠狠色伊人亚洲综合成人| 亚洲视频综合在线| 精品久久久三级丝袜| 91成人国产精品| 国产激情精品久久久第一区二区 | 成人黄色av网站在线| 天天免费综合色| 最新日韩av在线| 日韩精品自拍偷拍| 欧美va日韩va| 欧美视频在线一区二区三区| 高清国产一区二区| 日韩av一级片| 亚洲三级电影全部在线观看高清| 日韩女优av电影| 欧美日韩在线不卡| 91美女片黄在线观看91美女| 精品一二线国产| 日韩成人一区二区| 一区二区不卡在线视频 午夜欧美不卡在| 欧美成人a视频|