📄 propacketfileimage.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 + -