// EIKIMAGE.CPP
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#include <fbs.h>
#include <coeutils.h>
#include <eikimage.h>
#include <eikenv.h>
#include <barsread.h>

const TInt KFullEmphasis			= 0x01;
const TInt KPictureOwnedExternally	= 0x10;
const TInt KSameBitmapAndMask		= 0x20;

EXPORT_C CEikImage::~CEikImage()
	{
    if (!(iImFlags&KPictureOwnedExternally))
		{
    	delete CONST_CAST(CFbsBitmap*,iBitmap);		
		if (~iImFlags&KSameBitmapAndMask)
			delete CONST_CAST(CFbsBitmap*,iMaskBitmap);
		}
	}

EXPORT_C CEikImage::CEikImage()
	{
	__DECLARE_NAME(_S("CEikImage"));
	}

EXPORT_C void CEikImage::CreatePictureFromFileL(const TDesC& aFilename,TInt aMainId,TInt aMaskId)
	{
	iImFlags&=~KSameBitmapAndMask;
	iBitmap=iEikonEnv->CreateBitmapL(aFilename,aMainId);
	if (aMaskId==aMainId)
		{
		iMaskBitmap=iBitmap;
		iImFlags|=KSameBitmapAndMask;
		}
	else if (aMaskId>=0)
		iMaskBitmap=iEikonEnv->CreateBitmapL(aFilename,aMaskId);
	}

EXPORT_C void CEikImage::SetPicture(const CFbsBitmap* aBitmap,const CFbsBitmap* aMaskBitmap)
	{
	if (!(iImFlags&KPictureOwnedExternally))
		{
    	delete CONST_CAST(CFbsBitmap*,iBitmap);
		if (iMaskBitmap && !(iImFlags&KSameBitmapAndMask))
			delete CONST_CAST(CFbsBitmap*,iMaskBitmap);
		}
	iMaskBitmap=NULL;
	iImFlags&=~KSameBitmapAndMask;
	if (aMaskBitmap)
		{
		iMaskBitmap=aMaskBitmap;
		if (aBitmap==aMaskBitmap)
			iImFlags|=KSameBitmapAndMask;
		}
	iBitmap=aBitmap;
	}

EXPORT_C void CEikImage::Draw(const TRect& /*aRect*/) const
	{
	CWindowGc& gc=SystemGc();
	if (iImFlags&KFullEmphasis)
		{
		gc.SetBrushColor(KRgbBlack);
		gc.SetDrawMode(CGraphicsContext::EDrawModeNOTPEN);
		}
	const TRect rect(Rect());
	TRect inner=iMargin.InnerRect(rect);
	TSize bmpSize=iBitmap->SizeInPixels();
	const TSize innerSize=inner.Size();
	inner=iAlignment.InnerRect(inner,bmpSize);
	if (innerSize.iWidth<bmpSize.iWidth || innerSize.iHeight<bmpSize.iHeight)
		DrawPicture(gc,inner,ETrue);
	else
		DrawPicture(gc,inner,EFalse);
	gc.SetDrawMode(CGraphicsContext::EDrawModePEN);
	EikDrawUtils::ClearBetweenRects(gc,rect,inner);
	}

void CEikImage::DrawPicture(CBitmapContext& aGc,const TRect& aRect,TBool aToBeClipped) const
	{
	const TSize size=(aToBeClipped? aRect.Size() : iBitmap->SizeInPixels());
	const TRect rect(size);
	if (IsDimmed())
		{
		aGc.BitBltMasked(aRect.iTl,iEikonEnv->GrayBitmap(),rect,iMaskBitmap,ETrue);
		return;
		}
	if (iMaskBitmap)
		{
		aGc.BitBltMasked(aRect.iTl,iBitmap,rect,iMaskBitmap,ETrue);
		return;
		}
	aGc.BitBlt(aRect.iTl,iBitmap,rect);
	}

EXPORT_C TSize CEikImage::MinimumSize()
	{
	TSize size=iBitmap->SizeInPixels();
	size+=iMargin.SizeDelta();
	return size;
	}

EXPORT_C void CEikImage::SetEmphasis(TBool aEmphasis)
	{
	iImFlags&=~KFullEmphasis;
	if (aEmphasis)
		iImFlags|=KFullEmphasis;
	}

EXPORT_C void CEikImage::SetPictureOwnedExternally(TBool aOwnership)
	{
	if (aOwnership)
		iImFlags|=KPictureOwnedExternally;
	else
		iImFlags&=~KPictureOwnedExternally;
	}

EXPORT_C void CEikImage::ConstructFromResourceL(TResourceReader& aReader)
	{
	iAlignment.SetHAlignment((TCoeHAlignment)aReader.ReadInt16());
	iAlignment.SetVAlignment((TCoeVAlignment)aReader.ReadInt16());
	const TPtrC bmpFile=aReader.ReadTPtrC();
	const TInt bmpId=aReader.ReadInt16();
	const TInt bmpMask=aReader.ReadInt16();
	CreatePictureFromFileL(bmpFile,bmpId,bmpMask);
	}

EXPORT_C void CEikImage::Reserved_1()
	{}
EXPORT_C void CEikImage::Reserved_2()
	{}
