// APGPRIV.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include "apgpriv.h"
#include <e32hal.h>
#include <s32strm.h>
#include "apgicnfl.h"
#include "apgstd.h"

#define KDefaultIconSizeInPixels TSize(96,96)

CApaIconPicture* CApaIconPicture::NewL(const TSize& aIconSizeInTwips,CApaAppInfoFileReader& aIconFile,const TDesC& aIconFileName,TUid aIconFileUid)
	{
	CApaIconPicture* self=new(ELeave) CApaIconPicture(aIconFileUid,aIconSizeInTwips);
	CleanupStack::PushL(self);
	self->ConstructL(aIconFileName);
	self->CreateIconL(aIconFile);
	CleanupStack::Pop(); // self
	return self;
	}


CApaIconPicture* CApaIconPicture::NewL(const TSize& aIconSizeInTwips,const TDesC& aIconFileName,TUid aIconFileUid)
	{
	CApaIconPicture* self=new(ELeave) CApaIconPicture(aIconFileUid,aIconSizeInTwips);
	CleanupStack::PushL(self);
	self->ConstructL(aIconFileName);
	self->CreateIconL();
	CleanupStack::Pop(); // self
	return self;
	}


CApaIconPicture::CApaIconPicture(TUid aAppInfoFileUid,const TSize& aIconSizeInTwips)
	: iAppInfoFileUid(aAppInfoFileUid),
	iOriginalSizeInTwips(aIconSizeInTwips),
	iScaleFactorWidth(1000),
	iScaleFactorHeight(1000)
	{
	__DECLARE_NAME(_S("CApaIconPicture"));
	}

void CApaIconPicture::ConstructL(const TDesC& aIconFileName)
	{
	TMachineInfoV1Buf machineInfoBuf;
	User::LeaveIfError( UserHal::MachineInfo(machineInfoBuf) );
	TMachineInfoV1& machineInfo=machineInfoBuf();
	iDisplaySizeInTwips = machineInfo.iPhysicalScreenSize;
	iDisplaySizeInPixels = machineInfo.iDisplaySizeInPixels;
	//
	iAppInfoFileName = aIconFileName.AllocL();
	}

CApaIconPicture::~CApaIconPicture()
	{
	delete iIcon;
	delete iAppInfoFileName;
	}


void CApaIconPicture::CreateIconL()
	{
	// open the icon file
	CApaAppInfoFileReader* iconFile=CApaAppInfoFileReader::NewLC(*iAppInfoFileName,iAppInfoFileUid);
	CreateIconL(*iconFile);
	CleanupStack::PopAndDestroy(); // iconFile;
	}


void CApaIconPicture::CreateIconL(CApaAppInfoFileReader& aIconFile)
// creates an icon of the (implicitly) specified size in iIcon
//
	{
	// calculate the size of icon required in pixels
	TSize sizeInPixels;
	sizeInPixels.iWidth = (iOriginalSizeInTwips.iWidth*iDisplaySizeInPixels.iWidth*ScaleFactorWidth())/(iDisplaySizeInTwips.iWidth*1000);
	sizeInPixels.iHeight = (iOriginalSizeInTwips.iHeight*iDisplaySizeInPixels.iHeight*ScaleFactorHeight())/(iDisplaySizeInTwips.iHeight*1000);
	// if the required icon is not square get a large one and gdi will squash it during drawing
	CApaMaskedBitmap* newIcon = aIconFile.CreateMaskedBitmapL(Max(sizeInPixels.iWidth,sizeInPixels.iHeight));
	delete iIcon;
	iIcon = newIcon;
	//
	// set physical size
	TSize iconSizeInTwips;
	iconSizeInTwips.iWidth = (iOriginalSizeInTwips.iWidth*ScaleFactorWidth())/1000;
	iconSizeInTwips.iHeight = (iOriginalSizeInTwips.iHeight*ScaleFactorHeight())/1000;
	iIcon->SetSizeInTwips(iconSizeInTwips);
	}


void CApaIconPicture::Draw(CGraphicsContext& aGc,const TPoint& aTopLeft,const TRect& aClipRect,
						   MGraphicsDeviceMap* aMap) const
	{
	__ASSERT_DEBUG(iIcon,Panic(EDPanicNoIconInPicture));
	//
	TSize sizeInPixels(0,0);
	sizeInPixels.iWidth = aMap->HorizontalTwipsToPixels(iOriginalSizeInTwips.iWidth);
	sizeInPixels.iHeight = aMap->VerticalTwipsToPixels(iOriginalSizeInTwips.iHeight);
	sizeInPixels.iWidth = (ScaleFactorWidth()*sizeInPixels.iWidth)/1000;
	sizeInPixels.iHeight = (ScaleFactorHeight()*sizeInPixels.iHeight)/1000;
	//
	TRect originalRectInPixels(aTopLeft,sizeInPixels);
	aGc.SetClippingRect(aClipRect);
	aGc.DrawBitmap(originalRectInPixels,iIcon);
	aGc.CancelClippingRect();
	}

	
void CApaIconPicture::InternalizeL(RReadStream& /*aStream*/)
	{}

	
void CApaIconPicture::ExternalizeL(RWriteStream& /*aStream*/)const
	{}


void CApaIconPicture::GetOriginalSizeInTwips(TSize& aOriginalSize) const
	{
	aOriginalSize = iOriginalSizeInTwips;
	}


void CApaIconPicture::SetScaleFactor(TInt aScaleFactorWidth,TInt aScaleFactorHeight)
	{
	iScaleFactorWidth = aScaleFactorWidth;
	iScaleFactorHeight = aScaleFactorHeight;
	TRAPD(ret,CreateIconL()); // ignore any error, just keep using the current icon instead
	}


TInt CApaIconPicture::ScaleFactorWidth() const
	{
	return iScaleFactorWidth;
	}


TInt CApaIconPicture::ScaleFactorHeight() const
	{
	return iScaleFactorHeight;
	}


TPictureCapability CApaIconPicture::Capability() const
	{
	return TPictureCapability(TPictureCapability::ENotScaleable,EFalse); // scalable, not cropable
	}
