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

📄 propacketfileimage.cpp

📁 本例是SYMBIAN C++一个创建短信的例子
💻 CPP
字号:
/*
 * ============================================================================
 *  Name     : CProPacketFileImage from ProPacketFileImage.cpp
 *  Part of  : msc
 *  Created  : 2007-9-14 by tomken
 *  Version  : 1.0
 *  Copyright: Copyright (C) 2006-2008
 * ============================================================================
 */

#include "ProPacketFileImage.h"
#include <eikenv.h>

#define  SAFEDELETE(x)   delete x; x = NULL;

CProPacketFileImage::CProPacketFileImage(MImageLoadObserver* Observer)
{
	m_bitmap = NULL;
	m_bitmapmask = NULL;
	m_bitmapAlphaMask = NULL;
	m_loadObserver = Observer;
	iAlpha = 100;
}

CProPacketFileImage::CProPacketFileImage()
{
	m_bitmap = NULL;
	m_bitmapmask = NULL;
	m_bitmapAlphaMask = NULL; 
	m_loadObserver = NULL;
	iAlpha = 100;
}

CProPacketFileImage::~CProPacketFileImage()
{
	SAFEDELETE(m_bitmap);
	SAFEDELETE(m_bitmapmask);
	SAFEDELETE(m_bitmapAlphaMask);
}


TDisplayMode CProPacketFileImage::DisplayMode()
{
#ifdef MSC_PLATFORM_S60_V1
	return EColor64K;
#else
	return EColor16MU;
#endif
	//return CEikonEnv::DefaultDisplayMode();
}

void CProPacketFileImage::InitFbsBitmap(TInt w, TInt h)
{
	m_bitmap = new(ELeave) CFbsBitmap; 
	m_bitmap->Create(TSize(w, h), DisplayMode());
}

void CProPacketFileImage::InitFbsBitmap(const TDesC& aPngFileName)
{
	CMdaImageFileToBitmapUtility * pconverter;
	pconverter = CMdaImageFileToBitmapUtility::NewL(*this);
	pconverter->OpenL(aPngFileName);
	CActiveScheduler::Start();
	TFrameInfo iframeinfo;
	pconverter->FrameInfo(0, iframeinfo);
	m_bitmap = new(ELeave) CFbsBitmap;
	m_bitmap->Create(iframeinfo.iOverallSizeInPixels, DisplayMode());
	
	if(TFrameInfo::ETransparencyPossible&iframeinfo.iFlags)
	{	
		m_bitmapmask = new(ELeave) CFbsBitmap;
		m_bitmapmask->Create(iframeinfo.iOverallSizeInPixels, EGray256);
		TRAPD(convertErr,pconverter->ConvertL(*m_bitmap, *m_bitmapmask, 0));
	}
	else
	{
		TRAPD(convertErr,pconverter->ConvertL(*m_bitmap,0));
	}
	
	CActiveScheduler::Start();
	delete pconverter;
}


void CProPacketFileImage::MiuoOpenComplete(TInt aError)
{
	CActiveScheduler::Stop();
}

void CProPacketFileImage::MiuoConvertComplete(TInt aError)
{
	CActiveScheduler::Stop();
	if (m_loadObserver!=NULL)
		m_loadObserver->OnLoaded();
}

void CProPacketFileImage::MiuoCreateComplete(TInt aError)
{
	//CActiveScheduler::Stop();
}

CProPacketFileImage * CProPacketFileImage::CreateImage(int width, int height)
{
	CProPacketFileImage * img = new CProPacketFileImage();
	img->InitFbsBitmap(width, height);
	return img;
}


CProPacketFileImage * CProPacketFileImage::CreateImage(MImageLoadObserver* Observer, const TDesC& fn)
{
	CProPacketFileImage* img = new CProPacketFileImage(Observer);	
	img->InitFbsBitmap(fn);
	return img;
}

CProPacketFileImage * CProPacketFileImage::CreateImage(MImageLoadObserver* Observer, const TDesC8& aDescriptor)
{
	CProPacketFileImage* img = new CProPacketFileImage(Observer);	
	img->InitFbsBitmapFrmData(aDescriptor);
	return img;
}

CProPacketFileImage * CProPacketFileImage::CreateImage(CProPacketFileImage * img, TRect aRect, TCProPacketFileImageTransform transform) 
{
	TInt fwidth;
	TInt fheight;
	TInt x = aRect.iTl.iX;
	TInt y = aRect.iTl.iY;
	TInt width = aRect.Size().iWidth;
	TInt height = aRect.Size().iHeight;
	switch (transform)
	{
	case TRANS_ROT90:
		fwidth = height;
		fheight = width;
		break;
	case TRANS_ROT270:
		fwidth = height;
		fheight = width;
		break;
	case TRANS_MIRROR_ROT90:
		fwidth = height;
		fheight = width;
		break;
	case TRANS_MIRROR_ROT270:
		fwidth = height;
		fheight = width;
	case TRANS_MIRROR_ROT180:
		fwidth = width;
		fheight = height;		
		break;
	default:
		fwidth = width;
		fheight = height;
		break;
	}
	CProPacketFileImage * ret = new CProPacketFileImage();
	ret->InitFbsBitmap(fwidth, fheight);
	{
		
		TBitmapUtil buSRC(img->m_bitmap);
		TBitmapUtil buDST(ret->m_bitmap);
		buSRC.Begin( TPoint(0,0) );
		buDST.Begin( TPoint(0,0),buSRC );
		for (int i=y; i<height+y; i++)	
		{
			for (int j=x; j<width+x; j++)
			{
				int xx = j-x;
				int yy = i-y;
				buSRC.SetPos(TPoint(j, i));
				switch (transform)
				{
				case TRANS_ROT90:
					break;
				case TRANS_ROT180:
					break;
				case TRANS_ROT270:
					break;
				case TRANS_MIRROR:
					buDST.SetPos(TPoint(width - xx - 1, yy));
					break;
				case TRANS_MIRROR_ROT90:
					break;
				case TRANS_MIRROR_ROT180:
					buDST.SetPos(TPoint(xx, height - yy - 1));
					break;
				case TRANS_MIRROR_ROT270:
					break;
				default:
					buDST.SetPos(TPoint(xx, yy));
					break;
				}				
				buDST.SetPixel(buSRC.GetPixel());
			}			
		}
		buSRC.End();
		buDST.End();
	}
	
	
	if(img->m_bitmapmask!=NULL)
	{
		ret->m_bitmapmask = new(ELeave) CFbsBitmap;
		ret->m_bitmapmask->Create(ret->m_bitmap->SizeInPixels(), EGray256);
		
		{
			
			TBitmapUtil buSRC(img->m_bitmapmask);
			TBitmapUtil buDST(ret->m_bitmapmask);
			buSRC.Begin( TPoint(0,0) );
			buDST.Begin( TPoint(0,0),buSRC );
			for (int i=y; i<height+y; i++)
			{	
				for (int j=x; j<width+x; j++)
				{
					int xx = j-x;
					int yy = i-y;
					buSRC.SetPos(TPoint(j, i));
					switch (transform)
					{
					case TRANS_ROT90:
						break;
					case TRANS_ROT180:
						break;
					case TRANS_ROT270:
						break;
					case TRANS_MIRROR:
						buDST.SetPos(TPoint(width - xx - 1, yy));
						break;
					case TRANS_MIRROR_ROT90:
						break;
					case TRANS_MIRROR_ROT180:
						buDST.SetPos(TPoint(xx, height - yy - 1));
						break;
					case TRANS_MIRROR_ROT270:
						break;
					default:
						buDST.SetPos(TPoint(xx, yy));
						break;
					}				
					buDST.SetPixel(buSRC.GetPixel());
				}			
			}
			buSRC.End();
			buDST.End();
		}
	}
	return ret;
}

int CProPacketFileImage::Width()const
{
	return m_bitmap->SizeInPixels().iWidth;
}

int CProPacketFileImage::Height()const
{
	return m_bitmap->SizeInPixels().iHeight;
}	


TRect CProPacketFileImage::Rect()const
{
	return TRect(m_bitmap->SizeInPixels());
}	


CProPacketFileImage* CProPacketFileImage::CreateImage(CProPacketFileImage* img)
{
	return CreateImage(img, TRect(TPoint(0,0),TSize(img->Width(), img->Height())), TRANS_NONE);
}


void CProPacketFileImage::InitFbsBitmapFrmData(const TDesC8 &aDescriptor)
{
	CMdaImageDescToBitmapUtility * pconverter;
	pconverter = CMdaImageDescToBitmapUtility::NewL(*this);
	pconverter->OpenL(aDescriptor);
	CActiveScheduler::Start();
	TFrameInfo iframeinfo;
	pconverter->FrameInfo(0, iframeinfo);
	m_bitmap = new(ELeave) CFbsBitmap;
	
	m_bitmap->Create(iframeinfo.iOverallSizeInPixels, DisplayMode());
	
	if(TFrameInfo::ETransparencyPossible&iframeinfo.iFlags)
	{	
		m_bitmapmask = new(ELeave) CFbsBitmap;
		m_bitmapmask->Create(iframeinfo.iOverallSizeInPixels, EGray256);
		TRAPD(convertErr,pconverter->ConvertL(*m_bitmap, *m_bitmapmask, 0));
	}
	else
	{
		TRAPD(convertErr,pconverter->ConvertL(*m_bitmap,0));
	}
	
	
	CActiveScheduler::Start();
	delete pconverter;
}

void CProPacketFileImage::SetAlpha(int aAlpha)
{
	aAlpha = aAlpha>128?128:aAlpha;
	aAlpha = aAlpha<0?0:aAlpha;
	if (iAlpha!=aAlpha)
	{
		iAlpha = aAlpha;
		if(m_bitmapmask==NULL)
		{
			m_bitmapmask = new(ELeave) CFbsBitmap;
			m_bitmapmask->Create(m_bitmap->SizeInPixels(), EGray256);
		}
		int sl = CFbsBitmap::ScanLineLength(m_bitmapmask->SizeInPixels().iWidth, EGray256);
		if (m_bitmapAlphaMask==NULL)
		{
			m_bitmapAlphaMask = new(ELeave) CFbsBitmap;
			m_bitmapAlphaMask->Create(m_bitmap->SizeInPixels(), EGray256);
			Mem::Copy(m_bitmapAlphaMask->DataAddress(), m_bitmapmask->DataAddress(),
					m_bitmapmask->SizeInPixels().iHeight*sl);
		}
		Mem::Copy(m_bitmapmask->DataAddress(), m_bitmapAlphaMask->DataAddress(),
				m_bitmapmask->SizeInPixels().iHeight*sl);
		
			TBitmapUtil buSRC(m_bitmapmask);
			buSRC.Begin( TPoint(0,0) );
			for (int i=0; i<m_bitmapmask->SizeInPixels().iHeight; i++)
			{
				for (int j=0; j<m_bitmapmask->SizeInPixels().iWidth; j++)
				{
					buSRC.SetPos(TPoint(j,i));
					TUint32 temp = 0;
					temp = buSRC.GetPixel();
					temp = (temp * iAlpha)>>6;
					buSRC.SetPixel(temp>255?255:(temp<0?0:temp));
				}
			}
			buSRC.End();
	}
}

void CProPacketFileImage::CancelAlpha()
{
	SetAlpha(128);
}

int CProPacketFileImage::Alpha()
{	
	return iAlpha;
}

⌨️ 快捷键说明

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