Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 12:18, 15 April 2007.

Showing GIF animations

From Forum Nokia Wiki


CGif_Reader shows a simple GIF animation reader class that can be used to show a GIF animation in CCoeControl based containers. To construct the CGif_Reader add the following lines to the ConstructL() method inside your container:

iGif_Reader = new(ELeave)CGif_Reader(*this);
iGif_Reader->ConstructL(KTxtFileName);

KTxtFileName is the GIF file name (with drive, full path, name, and extension). To draw the GIF animation in your container you implement the container's Draw() method:

void CMycontainer::Draw(const TRect& aRect) const
{
 	CWindowGc& gc = SystemGc(); 	
 
 	if(iGif_Reader)
 	{
 		if(iGif_Reader->Bitmap())
 		{
 			if(iGif_Reader->Bitmap()->Handle())
 			{
 				gc.DrawBitmap(aRect, iGif_Reader->Bitmap());		
 			}
 		}	
 	}
}

Gif_Reader.cpp

#include "Gif_Reader.h"
 
#include <cntfield.h>
#include <cntdef.h> 
#include <cntitem.h>
#include <cntfldst.h>
#include <cntdb.h>
#include <COEMAIN.H>
#include <akniconutils.h> 
 
_LIT8(KtxTypeImageGif_8			,"image/gif");
 
const TInt KFrameTimeOut = 200000;// 0.2 sec frame timeout
 
 
CGif_Reader::CGif_Reader(CCoeControl& aParent)
:
CActive(0), iParent(aParent), iCurrImg(-1)
    {
    }
 
CGif_Reader::~CGif_Reader()
{
	Cancel();
	delete iExampleTimer;
	delete iImageDecoder;
	delete iFrame;
	delete iFrameImg;
	delete iFrameMsk;
	
	delete iBitmapDevice;
	delete iGraphicsContext;
}
 
 
void CGif_Reader::ConstructL(const TDesC& aFileName)
{
	CActiveScheduler::Add(this);
	iImageDecoder = CImageDecoder::FileNewL(CCoeEnv::Static()->FsSession(),
aFileName, KtxTypeImageGif_8);
	iCurrCount = iImageDecoder->FrameCount();
	
	if(iCurrCount > 0)
	{
		iFrame = new(ELeave)CFbsBitmap();
		iFrame->Create(iImageDecoder->FrameInfo(0).iOverallSizeInPixels,
iImageDecoder->FrameInfo(0).iFrameDisplayMode);
				
		iBitmapDevice = CFbsBitmapDevice::NewL(iFrame);
		User::LeaveIfError(iBitmapDevice->CreateContext(iGraphicsContext));
	}
}
 
void CGif_Reader::TimerExpired(TAny* /*aTimer*/, TInt /*aError*/)
{
	Cancel();
	NextImageL();
}
 
 
void CGif_Reader::NextImageL(void)
{
	iCurrImg++;
	if(iCurrImg >= iCurrCount || iCurrImg < 0)
	{
		iCurrImg = 0;
	}
	
	delete iFrameImg;
	iFrameImg = NULL;
	iFrameImg = new(ELeave)CFbsBitmap();
	iFrameImg->Create(iImageDecoder->FrameInfo(iCurrImg).iOverallSizeInPixels,
iImageDecoder->FrameInfo(iCurrImg).iFrameDisplayMode);
		
	delete iFrameMsk;
	iFrameMsk = NULL;
	iFrameMsk = new(ELeave)CFbsBitmap();
	iFrameMsk->Create(iImageDecoder->FrameInfo(iCurrImg).iOverallSizeInPixels,
EGray2);
 
	iImageDecoder->Convert(&iStatus, *iFrameImg, *iFrameMsk, iCurrImg);
	SetActive();	
}
 
 
void CGif_Reader::DoCancel()
{
	iImageDecoder->Cancel();
}
 
CFbsBitmap* CGif_Reader::Bitmap()
{
	return iFrame;
}
 
	
void CGif_Reader::RunL()
{
	if(iFrameMsk && iFrameImg && iFrame && iGraphicsContext)
	{
		if(iFrameMsk->Handle() && iFrameImg->Handle() && iFrame->Handle())
		{
			if(TFrameInfo::ERestoreToBackground & iImageDecoder->FrameInfo(iCurrImg).iFlags)
			{
				iGraphicsContext->DrawBitmap(
TRect(0, 0, iFrame->SizeInPixels().iWidth, iFrame->SizeInPixels().iHeight),
iFrameImg);
			}
			else
			{
				iGraphicsContext->DrawBitmapMasked(iImageDecoder->FrameInfo(iCurrImg).iFrameCoordsInPixels,
iFrameImg, TRect(0, 0, iFrameImg->SizeInPixels().iWidth, iFrameImg->SizeInPixels().iHeight),
iFrameMsk, EFalse);
			}
		}
	}
	
	iParent.DrawNow();	
	
	if(iStatus.Int() != KErrCancel)
	{
		if(!iExampleTimer)
		{
			iExampleTimer = CExampleTimer::NewL(CActive::EPriorityStandard, *this);
		}	
		
		iExampleTimer->After(KFrameTimeOut);
	}
}

Gif_Reader.h

#include <e32base.h>
#include <coecntrl.h>
#include <w32std.h>
#include <e32std.h>
#include <cntdef.h>
#include <cntdb.h> 
#include <ImageConversion.h>
 
#include "CExampleTimer.h"
 
 
	
	class CGif_Reader : public CActive,MExampleTimerNotify
	{
	public:
	    CGif_Reader(CCoeControl& aParent);
	    void ConstructL(const TDesC& aFileName);
	    ~CGif_Reader();
	    CFbsBitmap* Bitmap();
	protected:
		void TimerExpired(TAny* aTimer,TInt aError);
		void DoCancel();
		void RunL();
	private:
		void NextImageL(void);
		void FinnishReadL(void);
	private:
		CCoeControl& 		iParent;
		TInt 				iCurrImg,iCurrCount;
		CImageDecoder*		iImageDecoder;
		CFbsBitmap*			iFrame;
		CFbsBitmap*			iFrameMsk;
		CFbsBitmap*			iFrameImg;
		CExampleTimer*		iExampleTimer;
		CFbsBitGc* 			iGraphicsContext;
		CFbsBitmapDevice* 	iBitmapDevice;
	};
Related Discussions
Thread Thread Starter Forum Replies Last Post
gif animation problem bojkar General Symbian C++ 5 2007-03-16 09:04
convert .gif (animated) to .sis file - impossible ? MAT-33 Symbian Media (Graphics & Sounds) 3 2006-02-03 13:40
Streamed image in the Nokia 9210 Communicator WAP browser ask_expert General Browsing 1 2002-06-17 19:04
6600 + DirectGraphics smb101 Mobile Java Media (Graphics & Sounds) 2 2005-01-05 11:21
JSP in WAP gchuaay General Browsing 2 2007-04-12 00:04
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX