sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent sl@0: */ sl@0: sl@0: #include "stressanim.h" sl@0: #include "stressanimcmd.h" sl@0: #include "panic.h" sl@0: #include sl@0: sl@0: EXPORT_C CAnimDll *CreateCAnimDllL() //lint -e714 Suppress 'not referenced' sl@0: sl@0: { sl@0: return new (ELeave) CStressAnimDll(); sl@0: } sl@0: sl@0: CAnim *CStressAnimDll::CreateInstanceL(TInt /*aType*/) sl@0: { sl@0: return new (ELeave) CStressWindowAnim(); sl@0: } sl@0: sl@0: void CStressWindowAnim::Animate(TDateTime *) sl@0: { sl@0: if (!iDoAnimation) sl@0: { sl@0: return; sl@0: } sl@0: iLastAnimShot = User::NTickCount(); sl@0: if (!iWindowFunctions->IsHidden()) sl@0: { sl@0: iWindowFunctions->ActivateGc(); sl@0: if (iPolyList) sl@0: { sl@0: DrawPolyLine(); sl@0: } sl@0: } sl@0: if (iPolyList) sl@0: { sl@0: iPolyState=(iPolyState+1)%4; sl@0: TweakPolyList(iPolyState); sl@0: } sl@0: if (!iWindowFunctions->IsHidden()) sl@0: { sl@0: if (iPolyList) sl@0: { sl@0: DrawPolyLine(); sl@0: } sl@0: DrawText(); sl@0: } sl@0: iColor=(iColor+16)&0xFF; sl@0: iDoAnimation = EFalse; sl@0: } sl@0: sl@0: void CStressWindowAnim::DrawPolyLine() sl@0: { sl@0: iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR); sl@0: iGc->SetPenColor(TRgb(255,255,255)); sl@0: iGc->DrawPolyLine(static_cast*>(iPolyList)); sl@0: iGc->SetDrawMode(CGraphicsContext::EDrawModePEN); sl@0: iGc->SetPenColor(TRgb(0,0,0)); sl@0: } sl@0: sl@0: void CStressWindowAnim::DrawBitmap() sl@0: { sl@0: iGc->SetClippingRegion(TRegionFix<1>(TRect(iPos,iSize))); sl@0: CFbsBitmap *bitmap=iFunctions->FlashStateOn() ? &iBitmap1 : &iBitmap2; sl@0: if (iMasked) sl@0: { sl@0: iGc->BitBltMasked(iPos,bitmap, TRect(iSize), &iMask,EFalse); sl@0: } sl@0: else sl@0: { sl@0: iGc->BitBlt(iPos,bitmap); sl@0: } sl@0: iGc->CancelClippingRegion(); sl@0: } sl@0: sl@0: void CStressWindowAnim::AppendTime(TDes& aTimeText,const TTime& aTime) const sl@0: { sl@0: _LIT(TimeFormat,"%:0%H%:1%T%:2%S"); sl@0: TRAPD(err,aTime.FormatL(aTimeText,TimeFormat)); sl@0: if (err!=KErrNone) sl@0: { sl@0: _LIT(DummyTime,"######"); sl@0: aTimeText.Append(DummyTime); sl@0: } sl@0: } sl@0: sl@0: void CStressWindowAnim::DrawText() sl@0: { sl@0: if (iHasFocus) sl@0: { sl@0: iGc->UseFont(iFont); sl@0: TBuf<0x20> timebuf; sl@0: TUint64 elapsedMs = iLastAnimShot * iKernelTicksPeriod; sl@0: TTime time(elapsedMs); sl@0: sl@0: AppendTime( timebuf , time ); sl@0: sl@0: TSize winSize = iWindowFunctions->WindowSize(); sl@0: sl@0: TInt textWidth = iFont->MeasureText( timebuf ); sl@0: sl@0: TInt textHalf = textWidth / 2; sl@0: sl@0: TInt centerX = winSize.iWidth / 2; sl@0: TInt centerY = winSize.iHeight / 2; sl@0: sl@0: TRect rect(centerX - textHalf, centerY - iFont->AscentInPixels(), sl@0: centerX + textHalf, centerY - iFont->AscentInPixels() + iFont->HeightInPixels()); sl@0: sl@0: sl@0: iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); sl@0: iGc->DrawText(timebuf,rect,iFont->AscentInPixels()); sl@0: rect.Move(0,iFont->HeightInPixels()); sl@0: iGc->DrawText(timebuf,rect,iFont->AscentInPixels()); sl@0: } sl@0: } sl@0: sl@0: void CStressWindowAnim::Redraw() sl@0: { sl@0: DrawText(); sl@0: if (iPolyList) sl@0: { sl@0: DrawPolyLine(); sl@0: } sl@0: } sl@0: sl@0: void CStressWindowAnim::ConstructL(TAny *aArgs, TBool aHasFocus) sl@0: { sl@0: iHasFocus=aHasFocus; sl@0: iPos=((TStressTestAnimParams *)aArgs)->pos; sl@0: iFunctions->SetInterval(((TStressTestAnimParams *)aArgs)->interval); sl@0: if (iBitmap1.Duplicate(((TStressTestAnimParams *)aArgs)->bit1)!=KErrNone || sl@0: iBitmap2.Duplicate(((TStressTestAnimParams *)aArgs)->bit2)!=KErrNone || sl@0: iMask.Duplicate(((TStressTestAnimParams *)aArgs)->mask)!=KErrNone) sl@0: { sl@0: iFunctions->Panic(); sl@0: } sl@0: iSize.iWidth=Min(iBitmap1.SizeInPixels().iWidth,iBitmap2.SizeInPixels().iWidth); sl@0: iSize.iHeight=Min(iBitmap1.SizeInPixels().iHeight,iBitmap2.SizeInPixels().iHeight); sl@0: iWiggleSize=10; sl@0: iFont=iFunctions->DuplicateFontL(((TStressTestAnimParams *)aArgs)->font); sl@0: iDoAnimation = ETrue; sl@0: HAL::Get( HAL::ENanoTickPeriod, iKernelTicksPeriod ); sl@0: iFunctions->SetSync( MAnimGeneralFunctions::ESyncSecond ); sl@0: } sl@0: sl@0: void CStressWindowAnim::SetPolyList(const TRect &aRect) sl@0: { sl@0: iPolyRect=aRect; sl@0: TSize halfsize=aRect.Size(); sl@0: __ASSERT_ALWAYS(halfsize.iWidth >= 0, Panic(EPanic10)); sl@0: __ASSERT_ALWAYS(halfsize.iHeight >= 0, Panic(EPanic11)); sl@0: halfsize.iWidth>>=1; //lint !e702 Shift right of signed quantity (int) sl@0: halfsize.iHeight>>=1; //lint !e702 Shift right of signed quantity (int) sl@0: (*iPolyList)[0]=aRect.iTl; sl@0: (*iPolyList)[1]=TPoint(aRect.iTl.iX+iWiggleSize,aRect.iTl.iY+halfsize.iHeight); sl@0: (*iPolyList)[2]=TPoint(aRect.iTl.iX,aRect.iBr.iY); sl@0: (*iPolyList)[3]=TPoint(aRect.iTl.iX+halfsize.iWidth,aRect.iBr.iY-iWiggleSize); sl@0: (*iPolyList)[4]=aRect.iBr; sl@0: (*iPolyList)[5]=TPoint(aRect.iBr.iX-iWiggleSize,aRect.iTl.iY+halfsize.iHeight); sl@0: (*iPolyList)[6]=TPoint(aRect.iBr.iX,aRect.iTl.iY); sl@0: (*iPolyList)[7]=TPoint(aRect.iTl.iX+halfsize.iWidth,aRect.iTl.iY+iWiggleSize); sl@0: (*iPolyList)[8]=aRect.iTl; sl@0: TweakPolyList(iPolyState); sl@0: } sl@0: sl@0: void CStressWindowAnim::TweakPolyList(TInt aState) sl@0: { sl@0: TSize halfsize=iPolyRect.Size(); sl@0: __ASSERT_ALWAYS(halfsize.iWidth >= 0, Panic(EPanic12)); sl@0: __ASSERT_ALWAYS(halfsize.iHeight >= 0, Panic(EPanic13)); sl@0: halfsize.iWidth>>=1; //lint !e702 Shift right of signed quantity (int) sl@0: halfsize.iHeight>>=1; //lint !e702 Shift right of signed quantity (int) sl@0: switch(aState) sl@0: { sl@0: case 0: sl@0: (*iPolyList)[7]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iTl.iY+iWiggleSize); sl@0: (*iPolyList)[1]=TPoint(iPolyRect.iTl.iX,iPolyRect.iTl.iY+halfsize.iHeight); sl@0: break; sl@0: case 1: sl@0: (*iPolyList)[1]=TPoint(iPolyRect.iTl.iX+iWiggleSize,iPolyRect.iTl.iY+halfsize.iHeight); sl@0: (*iPolyList)[3]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iBr.iY); sl@0: break; sl@0: case 2: sl@0: (*iPolyList)[3]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iBr.iY-iWiggleSize); sl@0: (*iPolyList)[5]=TPoint(iPolyRect.iBr.iX,iPolyRect.iTl.iY+halfsize.iHeight); sl@0: break; sl@0: case 3: sl@0: (*iPolyList)[5]=TPoint(iPolyRect.iBr.iX-iWiggleSize,iPolyRect.iTl.iY+halfsize.iHeight); sl@0: (*iPolyList)[7]=TPoint(iPolyRect.iTl.iX+halfsize.iWidth,iPolyRect.iTl.iY); sl@0: break; sl@0: default: sl@0: __ASSERT_ALWAYS(EFalse, Panic(EPanic14)); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: void CStressWindowAnim::InvalidateText() sl@0: { sl@0: TRect invalidate; sl@0: invalidate.iTl.iX=iTextPos.iX; sl@0: invalidate.iTl.iY=iTextPos.iY-iFont->AscentInPixels(); sl@0: invalidate.iBr.iX=iTextPos.iX+iFont->TextWidthInPixels(_L("Overstressed ANIM")); sl@0: invalidate.iBr.iY=iTextPos.iY+iFont->DescentInPixels(); sl@0: iWindowFunctions->Invalidate(invalidate); sl@0: } sl@0: sl@0: void CStressWindowAnim::InvalidateBitmap() sl@0: { sl@0: iWindowFunctions->Invalidate(TRect(iPos,iSize)); sl@0: } sl@0: sl@0: void CStressWindowAnim::Command(TInt aOpcode, TAny *aArgs) sl@0: { sl@0: switch(aOpcode) sl@0: { sl@0: case EADllOpcodeMove: sl@0: { sl@0: InvalidateBitmap(); sl@0: iPos=((TStressTestAnimParams *)aArgs)->pos; sl@0: iWindowFunctions->ActivateGc(); sl@0: DrawBitmap(); sl@0: iFunctions->SetInterval(((TStressTestAnimParams *)aArgs)->interval); sl@0: } sl@0: break; sl@0: case EADllTextPos: sl@0: { sl@0: InvalidateText(); sl@0: iTextPos=((TStressTestAnimParams *)aArgs)->pos; sl@0: iWindowFunctions->ActivateGc(); sl@0: DrawText(); sl@0: } sl@0: break; sl@0: case EADllToggleBitmapMask: sl@0: iMasked=!iMasked; sl@0: InvalidateBitmap(); sl@0: break; sl@0: default: sl@0: __ASSERT_ALWAYS(EFalse, Panic(EPanic15)); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: TInt CStressWindowAnim::CommandReplyL(TInt aOpcode, TAny *aArgs) sl@0: { sl@0: sl@0: TInt res = KErrNone; sl@0: sl@0: switch(aOpcode) sl@0: { sl@0: case EADllOpcodePolyLineRect: sl@0: iWindowFunctions->ActivateGc(); sl@0: if (!iPolyList) sl@0: { sl@0: iPolyList=new(ELeave) CArrayFixFlat(ENumPolyPoints); sl@0: TPoint zeropoint; sl@0: for(TInt i=0;iAppendL(zeropoint); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: DrawPolyLine(); sl@0: } sl@0: SetPolyList(*((TRect *)aArgs)); sl@0: DrawPolyLine(); sl@0: break; sl@0: sl@0: case EADllQuerySync: sl@0: res = iLastAnimShot; sl@0: iDoAnimation = ETrue; sl@0: break; sl@0: sl@0: default: sl@0: iFunctions->Panic(); sl@0: } sl@0: sl@0: return res; sl@0: } sl@0: sl@0: CStressWindowAnim::~CStressWindowAnim() sl@0: { sl@0: delete iPolyList; sl@0: iFunctions->CloseFont(iFont); sl@0: } sl@0: sl@0: void CStressWindowAnim::FocusChanged(TBool aNewState) sl@0: { sl@0: iHasFocus=aNewState; sl@0: InvalidateText(); sl@0: InvalidateBitmap(); sl@0: } sl@0: sl@0: TBool CStressWindowAnim::OfferRawEvent(const TRawEvent &/*aRawEvent*/) sl@0: { sl@0: return EFalse; sl@0: }