windowing/windowserver/test/tanim/TANIMDLL.CPP
changeset 110 7f25ef56562d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/tanim/TANIMDLL.CPP	Wed Jun 23 19:41:15 2010 +0300
@@ -0,0 +1,317 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Test Animated DLL
+// 
+//
+
+#include <e32std.h>
+#include <w32std.h>
+#include <w32adll.h>
+#include <bitstd.h>
+#include "ANIMDLL.H"
+
+#define ANIM_TEST_TEXT _L("Testing 123")
+
+class CTestAnim : public CWindowAnim
+	{
+	enum {ENumPolyPoints=9};
+public:
+	~CTestAnim();
+	virtual void ConstructL(TAny *aArgs, TBool aHasFocus);
+	virtual void Animate(TDateTime *aDateTime);
+	virtual void Redraw();
+	virtual void Command(TInt aOpcode, TAny *aArgs);
+	virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs);
+	void SetPolyList(const TRect &aRect);
+	void DrawPolyLine();
+	void DrawBitmap();
+	void DrawText();
+	void TweakPolyList(TInt aState);
+	void FocusChanged(TBool aState);
+	void InvalidateText();
+	void InvalidateBitmap();
+	//Pure virtual function from MEventHandler
+	virtual TBool OfferRawEvent(const TRawEvent &aRawEvent);
+private:
+	void AppendTime(TDes& aTimeText,const TTime& aTime) const;
+private:
+	TPoint iPos;
+	TSize iSize;
+	TInt iColor;
+	TBool iMasked;
+	TRect iPolyRect;
+	TInt iPolyState;
+	TInt iWiggleSize;
+	TPoint iTextPos;
+	TBool iHasFocus;
+	CArrayFixFlat<TPoint> *iPolyList;
+	CFbsBitmap iBitmap1;
+	CFbsBitmap iBitmap2;
+	CFbsBitmap iMask;
+	CFbsFont *iFont;
+	};
+
+class CTestAnimDll : public CAnimDll 
+	{
+public:
+	CAnim *CreateInstanceL(TInt aType);
+private:
+	};
+
+/*#if defined(__WINS__)
+#pragma data_seg(".E32_UID")
+__WINS_UID(0, KWservAnimDllUidValue, 0)
+#pragma data_seg()
+#endif*/
+
+EXPORT_C CAnimDll *CreateCAnimDllL()
+	{
+	return(new(ELeave) CTestAnimDll());
+	}
+
+// Instance code //
+
+void CTestAnim::Animate(TDateTime *)
+	{
+	if (!iWindowFunctions->IsHidden())
+		{
+		iWindowFunctions->ActivateGc();
+		if (iPolyList)
+			DrawPolyLine();
+		}
+	if (iPolyList)	
+		{
+		iPolyState=(iPolyState+1)%4;
+		TweakPolyList(iPolyState);
+		}
+	if (!iWindowFunctions->IsHidden())
+		{
+		if (iPolyList)
+			DrawPolyLine();
+		DrawText();
+		DrawBitmap();
+		}
+	iColor=(iColor+16)&0xFF;
+	}
+
+void CTestAnim::DrawPolyLine()
+	{
+	iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR);
+	iGc->SetPenColor(TRgb(255,255,255));
+	iGc->DrawPolyLine(iPolyList);
+	iGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+	iGc->SetPenColor(TRgb(0,0,0));
+	}
+
+void CTestAnim::DrawBitmap()
+	{
+	iGc->SetClippingRegion(TRegionFix<1>(TRect(iPos,iSize)));
+	CFbsBitmap *bitmap=iFunctions->FlashStateOn() ? &iBitmap1 : &iBitmap2;
+	if (iMasked)
+		iGc->BitBltMasked(iPos,bitmap, TRect(iSize), &iMask,EFalse);
+	else
+		iGc->BitBlt(iPos,bitmap);
+	iGc->CancelClippingRegion();
+	}
+
+void CTestAnim::AppendTime(TDes& aTimeText,const TTime& aTime) const
+	{
+	_LIT(TimeFormat,"%:0%H%:1%T%:2%S");
+	TRAPD(err,aTime.FormatL(aTimeText,TimeFormat));
+	if (err!=KErrNone)
+		{
+		_LIT(DummyTime,"######");
+		aTimeText.Append(DummyTime);
+		}
+	}
+
+void CTestAnim::DrawText()
+	{
+	if (iHasFocus)
+		{
+		iGc->UseFont(iFont);
+		TBuf<0x20> timebuf;
+		TTime time(iFunctions->SystemTime());
+		AppendTime(timebuf,time);
+		TRect rect(iTextPos.iX,iTextPos.iY-iFont->AscentInPixels(),iTextPos.iX+iFont->TextWidthInPixels(timebuf),iTextPos.iY-iFont->AscentInPixels()+iFont->HeightInPixels());
+		iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+		iGc->DrawText(timebuf,rect,iFont->AscentInPixels());
+		time.UniversalTime();
+		AppendTime(timebuf,time);
+		rect.Move(0,iFont->HeightInPixels());
+		iGc->DrawText(timebuf,rect,iFont->AscentInPixels());
+		}
+	}
+
+void CTestAnim::Redraw()
+	{
+	DrawText();
+	DrawBitmap();
+	if (iPolyList)
+		DrawPolyLine();
+	}
+
+void CTestAnim::ConstructL(TAny *aArgs, TBool aHasFocus)
+	{
+	iHasFocus=aHasFocus;
+	iPos=((CTAParams *)aArgs)->pos;
+	iFunctions->SetInterval(((CTAParams *)aArgs)->interval);
+	if (iBitmap1.Duplicate(((CTAParams *)aArgs)->bit1)!=KErrNone || 
+		iBitmap2.Duplicate(((CTAParams *)aArgs)->bit2)!=KErrNone ||
+		iMask.Duplicate(((CTAParams *)aArgs)->mask)!=KErrNone)
+		iFunctions->Panic();
+	iSize.iWidth=Min(iBitmap1.SizeInPixels().iWidth,iBitmap2.SizeInPixels().iWidth);
+	iSize.iHeight=Min(iBitmap1.SizeInPixels().iHeight,iBitmap2.SizeInPixels().iHeight);
+	iWiggleSize=10;
+	iFont=iFunctions->DuplicateFontL(((CTAParams *)aArgs)->font);
+	}
+
+void CTestAnim::SetPolyList(const TRect &aRect)
+	{
+	iPolyRect=aRect;
+	TSize halfsize=aRect.Size();
+	halfsize.iWidth>>=1;
+	halfsize.iHeight>>=1;
+	(*iPolyList)[0]=aRect.iTl;
+	(*iPolyList)[1]=TPoint(aRect.iTl.iX+iWiggleSize,aRect.iTl.iY+halfsize.iHeight);
+	(*iPolyList)[2]=TPoint(aRect.iTl.iX,aRect.iBr.iY);
+	(*iPolyList)[3]=TPoint(aRect.iTl.iX+halfsize.iWidth,aRect.iBr.iY-iWiggleSize);
+	(*iPolyList)[4]=aRect.iBr;
+	(*iPolyList)[5]=TPoint(aRect.iBr.iX-iWiggleSize,aRect.iTl.iY+halfsize.iHeight);
+	(*iPolyList)[6]=TPoint(aRect.iBr.iX,aRect.iTl.iY);
+	(*iPolyList)[7]=TPoint(aRect.iTl.iX+halfsize.iWidth,aRect.iTl.iY+iWiggleSize);
+	(*iPolyList)[8]=aRect.iTl;
+	TweakPolyList(iPolyState);
+	}
+
+void CTestAnim::TweakPolyList(TInt aState)
+	{
+	TSize halfsize=iPolyRect.Size();
+	halfsize.iWidth>>=1;
+	halfsize.iHeight>>=1;
+	switch(aState)
+		{
+		case 0:
+			(*iPolyList)[7]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iTl.iY+iWiggleSize);
+			(*iPolyList)[1]=TPoint(iPolyRect.iTl.iX,iPolyRect.iTl.iY+halfsize.iHeight);
+			break;
+		case 1:
+			(*iPolyList)[1]=TPoint(iPolyRect.iTl.iX+iWiggleSize,iPolyRect.iTl.iY+halfsize.iHeight);
+			(*iPolyList)[3]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iBr.iY);
+			break;
+		case 2:
+			(*iPolyList)[3]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iBr.iY-iWiggleSize);
+			(*iPolyList)[5]=TPoint(iPolyRect.iBr.iX,iPolyRect.iTl.iY+halfsize.iHeight);
+			break;
+		case 3:
+			(*iPolyList)[5]=TPoint(iPolyRect.iBr.iX-iWiggleSize,iPolyRect.iTl.iY+halfsize.iHeight);
+			(*iPolyList)[7]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iTl.iY);
+			break;
+		}
+	}
+
+void CTestAnim::InvalidateText()
+	{
+	TRect invalidate;
+	invalidate.iTl.iX=iTextPos.iX;
+	invalidate.iTl.iY=iTextPos.iY-iFont->AscentInPixels();
+	invalidate.iBr.iX=iTextPos.iX+iFont->TextWidthInPixels(ANIM_TEST_TEXT);
+	invalidate.iBr.iY=iTextPos.iY+iFont->DescentInPixels();
+	iWindowFunctions->Invalidate(invalidate);
+	}
+
+void CTestAnim::InvalidateBitmap()
+	{
+	iWindowFunctions->Invalidate(TRect(iPos,iSize));
+	}
+
+void CTestAnim::Command(TInt aOpcode, TAny *aArgs)
+	{
+	switch(aOpcode)
+		{
+		case EADllOpcodeMove:
+			{
+			InvalidateBitmap();
+			iPos=((CTAParams *)aArgs)->pos;
+			iWindowFunctions->ActivateGc();
+			DrawBitmap();
+			iFunctions->SetInterval(((CTAParams *)aArgs)->interval);
+			}
+			break;
+		case EADllTextPos:
+			{
+			InvalidateText();
+			iTextPos=((CTAParams *)aArgs)->pos;
+			iWindowFunctions->ActivateGc();
+			DrawText();
+			}
+			break;
+		case EADllToggleBitmapMask:
+			iMasked=!iMasked;
+			InvalidateBitmap();
+			break;
+		}
+	}
+
+TInt CTestAnim::CommandReplyL(TInt aOpcode, TAny *aArgs)
+	{
+	switch(aOpcode)
+		{
+		case EADllOpcodePolyLineRect:
+			iWindowFunctions->ActivateGc();
+			if (!iPolyList)
+				{
+				iPolyList=new(ELeave) CArrayFixFlat<TPoint>(ENumPolyPoints);
+				TPoint zeropoint;
+				for(TInt i=0;i<ENumPolyPoints;i++)
+					iPolyList->AppendL(zeropoint);
+				}
+			else
+				DrawPolyLine();
+			SetPolyList(*((TRect *)aArgs));
+			DrawPolyLine();
+			break;
+		default:
+			iFunctions->Panic();
+		}
+	return(KErrNone);
+	}
+
+CTestAnim::~CTestAnim()
+	{
+	delete iPolyList;
+	iFunctions->CloseFont(iFont);
+	}
+
+void CTestAnim::FocusChanged(TBool aNewState)
+	{
+	iHasFocus=aNewState;
+	InvalidateText();
+	InvalidateBitmap();
+	}
+
+TBool CTestAnim::OfferRawEvent(const TRawEvent &/*aRawEvent*/)
+	{
+	return EFalse;
+	}
+
+// DLL code //
+
+CAnim *CTestAnimDll::CreateInstanceL(TInt )
+	{
+	return(new(ELeave) CTestAnim());
+	}
+
+// Dummy E32Dll needed by E32 to build //
+