author | Gareth Stockwell <gareth.stockwell@accenture.com> |
Fri, 22 Oct 2010 11:38:29 +0100 | |
branch | bug235_bringup_0 |
changeset 206 | c170e304623f |
parent 0 | 5d03bc08d59c |
permissions | -rw-r--r-- |
// 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 //