windowing/windowserver/test/t_stress/src/compwin.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/test/t_stress/src/compwin.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,466 @@
+// Copyright (c) 2008-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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent
+*/
+
+#include "compwin.h"
+#include "utils.h"
+#include "crpwin.h"
+#include "edgedwin.h"
+#include "coordinatewin.h"
+#include "backedupwin.h"
+#include "enormouswin.h"
+#include "spritewin.h"
+#include "animatedwin.h"
+
+#include "test_step_logger.h"
+#include "test_step_comparison.h"
+#include "stresslet.h"
+#include "comparison.h"
+
+//static configuration data, definitions and default assignments
+TInt CCompWin::sBackgroundAlpha = 0;
+
+//configuration parameter names
+_LIT(KT_WservStressParamBackgroundAlpha, "background_alpha");
+
+
+/**
+BASE COMPARISON WINDOW
+*/
+CCompWin* CCompWin::NewLC(RWsSession& aWs, RWindowGroup* aGroup, CCompWin* aParent, CWindowGc& aGc)
+	{
+	typedef CCompWin* (*TPtrNewLC)(RWsSession&, RWindowGroup*, CCompWin*, CWindowGc&);
+	TPtrNewLC winFactory[8];
+	TInt numEnabledWindows = 0;
+
+	//setup an array of factory functions, one for each enabled window type
+	if (CAnimatedWin::IsEnabled())   
+		{
+		winFactory[numEnabledWindows++] = TPtrNewLC(CAnimatedWin::NewLC);
+		}
+	if (CCoordinateWin::IsEnabled()) 
+		{
+		winFactory[numEnabledWindows++] = TPtrNewLC(CCoordinateWin::NewLC);
+		}
+	if (CBackedupWin::IsEnabled())   
+		{
+		winFactory[numEnabledWindows++] = TPtrNewLC(CBackedupWin::NewLC);
+		}
+	if (CEnormousWin::IsEnabled())   
+		{
+		winFactory[numEnabledWindows++] = TPtrNewLC(CEnormousWin::NewLC);
+		}
+	if (CCrpWin::IsEnabled())        
+		{
+		winFactory[numEnabledWindows++] = TPtrNewLC(CCrpWin::NewLC);
+		}
+	if (CEdgedWin::IsEnabled())      
+		{
+		winFactory[numEnabledWindows++] = TPtrNewLC(CEdgedWin::NewLC);
+		}
+	if (CSpritedWin::IsEnabled())    
+		{
+		winFactory[numEnabledWindows++] = TPtrNewLC(CSpritedWin::NewLC);
+		}
+
+	if (numEnabledWindows == 0)
+		{
+		aWs.LogMessage(_L("Error: No window-type is enabled(see ini file)"));
+		User::Leave(KErrNotFound);
+		}
+	
+	TInt winType = TRnd::rnd(numEnabledWindows);
+	CCompWin* self = winFactory[ winType ](aWs, aGroup, aParent, aGc);
+	return self;
+	}
+
+void CCompWin::LoadConfiguration(const MTestStepConfigurationContext* aContext)
+	{
+	aContext->GetInt(KT_WservStressParamBackgroundAlpha, sBackgroundAlpha);
+	}
+
+/**
+ Get a random TDrawMode value.
+ */
+CGraphicsContext::TDrawMode CCompWin::GetRandomDrawMode()
+	{
+	static CGraphicsContext::TDrawMode modes[] =
+		{
+		CGraphicsContext::EDrawModeAND, CGraphicsContext::EDrawModeNOTAND, 
+		CGraphicsContext::EDrawModePEN, CGraphicsContext::EDrawModeANDNOT,
+		CGraphicsContext::EDrawModeXOR, CGraphicsContext::EDrawModeOR, 
+		CGraphicsContext::EDrawModeNOTANDNOT, CGraphicsContext::EDrawModeNOTXOR,
+		CGraphicsContext::EDrawModeNOTSCREEN, CGraphicsContext::EDrawModeNOTOR, 
+		CGraphicsContext::EDrawModeNOTPEN, CGraphicsContext::EDrawModeORNOT,
+		CGraphicsContext::EDrawModeNOTORNOT, CGraphicsContext::EDrawModeWriteAlpha
+		};
+	return modes[TRnd::rnd(sizeof(modes)/sizeof(CGraphicsContext::TDrawMode))];
+	}
+
+CGraphicsContext::TPenStyle CCompWin::GetRandomPenStyle()
+	{
+	static CGraphicsContext::TPenStyle styles[] = 
+		{
+		CGraphicsContext::ENullPen,
+		CGraphicsContext::ESolidPen,
+		CGraphicsContext::EDottedPen,
+		CGraphicsContext::EDashedPen,
+		CGraphicsContext::EDotDashPen,
+		CGraphicsContext::EDotDotDashPen
+		};
+	return styles[TRnd::rnd(sizeof(styles)/sizeof(CGraphicsContext::TPenStyle))];
+	}
+
+CGraphicsContext::TBrushStyle CCompWin::GetRandomBrushStyle()
+	{
+	//CGraphicsContext::EPatternedBrush is not joined in the test in current version.
+	static CGraphicsContext::TBrushStyle styles[] = 
+		{
+		CGraphicsContext::ENullBrush,
+		CGraphicsContext::ESolidBrush,
+		CGraphicsContext::EVerticalHatchBrush,
+		CGraphicsContext::EForwardDiagonalHatchBrush,
+		CGraphicsContext::EHorizontalHatchBrush,
+		CGraphicsContext::ERearwardDiagonalHatchBrush,
+		CGraphicsContext::ESquareCrossHatchBrush,
+		CGraphicsContext::EDiamondCrossHatchBrush
+		};
+	return styles[TRnd::rnd(sizeof(styles)/sizeof(CGraphicsContext::TBrushStyle))];
+	}
+
+CCompWin::CCompWin(RWsSession& aWs, RWindowGroup* aGroup, CCompWin* aParent, CWindowGc& aGc) :
+	iWs(aWs),
+	iGroup(aGroup),
+	iParent(aParent),
+	iWsGc(aGc)
+	{
+	}
+
+CCompWin::~CCompWin()
+	{
+	iChildren.ResetAndDestroy();
+	
+	if (iParent)
+		{
+		iParent->RemoveChild(this);
+		}
+
+	if (iWindow)
+		{
+		iWindow->Close();
+		delete iWindow;
+		}
+	}
+
+void CCompWin::PreConstructL(TBool aTransparency, TBool aBackedup)
+	{
+	if (aBackedup)
+		{
+		iWindow = iBackedupWindow = new(ELeave) RBackedUpWindow(iWs);
+		if (iParent)
+			{
+			User::LeaveIfError(iBackedupWindow->Construct(*iParent->Window(), EColor64K, (TUint32)(this)));
+			iParent->AddChildL(this);
+			}
+		else
+			{
+			User::LeaveIfError(iBackedupWindow->Construct(*iGroup, EColor64K, (TUint32)(this)));
+			}
+		}
+	else
+		{
+		iWindow = iRedrawWindow = new(ELeave) RWindow(iWs);
+		if (iParent)
+			{
+			User::LeaveIfError(iRedrawWindow->Construct(*iParent->Window(), (TUint32)(this)));
+			iParent->AddChildL(this);
+			}
+		else
+			{
+			User::LeaveIfError(iRedrawWindow->Construct(*iGroup, (TUint32)(this)));
+			}
+		}
+	if (iRedrawWindow)
+		{
+		if (aTransparency)
+			{
+			iRedrawWindow->SetTransparencyAlphaChannel();
+			}
+		/* Note: if background color is set to include a transparent background
+		 * and AUTOCLEAR is set to 1 in wsini.ini, window's background will not be
+		 * totaly cleared.
+		 */
+		iRedrawWindow->SetBackgroundColor(BackgroundColor());
+		}
+
+	iPos.iX = TRnd::rnd(KPosLimit);
+	iPos.iY = TRnd::rnd(KPosLimit);
+	iSize.iWidth = TRnd::rnd(KPosLimit);
+	iSize.iHeight = TRnd::rnd(KPosLimit);
+	iPos.iX -= iSize.iWidth / 2;
+	iPos.iY -= iSize.iHeight / 2;
+	SetPos(iPos);
+	SetSize(iSize);
+	iWindow->SetOrdinalPosition(0);
+	}
+	
+void CCompWin::PostConstructL()
+	{
+	iVisible = ETrue;
+	iWindow->Activate();
+	}
+	
+void CCompWin::SetPos(const TPoint & aPos)
+	{
+	iPos = aPos;
+	iWindow->SetPosition(iPos);
+	}
+
+void CCompWin::SetSize(const TSize & aSize)
+	{
+	iSize = aSize;
+	TInt err = iWindow->SetSizeErr(iSize);
+	if (err != KErrNone)
+		{
+		__DEBUGGER();
+		}
+	if (iRedrawWindow)
+		{
+		iRedrawWindow->Invalidate();
+		}
+	else if (iBackedupWindow)
+		{
+		Redraw(aSize);
+		}
+	}
+
+
+void CCompWin::BringToFrontL()
+	{
+	if (iParent)
+		{
+		iParent->RemoveChild(this);
+		iParent->AddChildL(this);
+		}
+	iWindow->SetOrdinalPosition(0);
+	}
+
+void CCompWin::SendToBackL()
+	{
+	if (iParent)
+		{
+		iParent->RemoveChild(this);
+		iParent->iChildren.Insert(this, 0);
+		iWindow->SetOrdinalPosition(-1);
+		}
+	}
+
+void CCompWin::RemoveChild(CCompWin* aChild)
+	{
+	TInt num = iChildren.Find(aChild);
+	if (num != KErrNotFound)
+		{
+		iChildren.Remove(num);
+		}
+	}
+
+void CCompWin::AddChildL(CCompWin* aChild)
+	{
+	CleanupStack::PushL(aChild);
+	User::LeaveIfError(iChildren.Append(aChild));
+	CleanupStack::Pop(aChild);
+	}
+
+CCompWin * CCompWin::RandomWindow()
+	{
+	TInt num = TRnd::rnd(iChildren.Count() + 1);
+	
+	if (num == iChildren.Count())
+		{
+		return this;
+		}
+	else
+		{
+		return iChildren[num]->RandomWindow();
+		}
+	}
+
+void CCompWin::ToggleVisible()
+	{
+	iVisible = !iVisible;
+	iWindow->SetVisible(iVisible);
+	}
+
+void CCompWin::Dump(RFile& aFile, TPoint& aOrigin, TInt aDepth, CCompWin * aMark)
+	{
+	TPoint abs = aOrigin + iPos;
+	static TBuf8<256> buf;
+	buf.SetLength(0);
+	for (TInt d = 0; d < aDepth; ++d)
+		{
+		buf.Append(_L8("  "));
+		}
+	buf.Append(_L8("rel ["));
+	buf.AppendNum((TInt64)iPos.iX);
+	buf.Append(_L8(","));
+	buf.AppendNum((TInt64)iPos.iY);
+	buf.Append(_L8("] abs ["));
+	buf.AppendNum((TInt64)abs.iX);
+	buf.Append(_L8(","));
+	buf.AppendNum((TInt64)abs.iY);
+	buf.Append(_L8("] size ["));
+	buf.AppendNum((TInt64)iSize.iWidth);
+	buf.Append(_L8(","));
+	buf.AppendNum((TInt64)iSize.iHeight);
+	buf.Append(_L8("] "));
+	if (iVisible)
+		{
+		buf.Append(_L8("visible "));
+		}
+	else
+		{
+		buf.Append(_L8("invisible "));
+		}
+	buf.Append(TypeName());
+	if (this == aMark)
+		{
+		buf.Append(_L8(" <active>"));
+		}
+	buf.Append(_L8("\r\n"));
+	aFile.Write(buf);
+	
+	DumpDetails(aFile, aDepth);
+	
+	for (TInt num = 0; num < iChildren.Count(); ++num)
+		{
+		iChildren[num]->Dump(aFile, abs, aDepth + 1, aMark);
+		}
+	}
+
+void CCompWin::DumpDetails(RFile&, TInt)
+	{
+	}
+
+void CCompWin::HandleRedraw(TWsRedrawEvent& aEvent)
+	{
+	Redraw(aEvent.Rect());
+	}
+
+void CCompWin::DrawBitmap(CFbsBitGc* aGc, TRect& aClip, TPoint& aOrigin)
+	{
+	if (aClip.Width() > 0 && aClip.Height() > 0)
+		{
+		TPoint origin = iPos + aOrigin;
+		TRect clip(origin, iSize);
+		clip.Intersection(aClip);
+
+		for (TInt num = 0; num < iChildren.Count(); ++num)
+			{
+			if (iChildren[num]->iVisible)
+				{
+				iChildren[num]->DrawBitmap(aGc, clip, origin);
+				}
+			}
+		}
+	}
+
+/**
+ Fills window's background with it's background color, 
+ then iterates visible children
+ */
+void CCompWin::ClearBitmapBackground(CFbsBitGc* aGc, TRect& aClip, TPoint& aOrigin)
+	{
+	if (aClip.Width() > 0 && aClip.Height() > 0)
+		{
+		TPoint origin = iPos + aOrigin;
+		TRect clip(origin, iSize);
+		clip.Intersection(aClip);
+
+		aGc->Reset();
+		aGc->SetOrigin(TPoint(0,0));
+		aGc->SetPenColor(BackgroundColor());
+		aGc->SetBrushColor(BackgroundColor());
+		aGc->SetPenStyle(CGraphicsContext::ESolidPen);
+		aGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+		aGc->DrawRect(clip);
+
+		for (TInt num = 0; num < iChildren.Count(); ++num)
+			{
+			if (iChildren[num]->iVisible)
+				{
+				iChildren[num]->ClearBitmapBackground(aGc, clip, origin);
+				}
+			}
+		}
+	}
+
+TBool CCompWin::QueryReadyForVerification()
+	{
+	TBool res = ETrue;
+	
+	TInt idx = 0;
+
+	while ( idx < iChildren.Count() && res )
+		{
+		res = iChildren[ idx ]->QueryReadyForVerification();
+		idx++;
+		}
+	
+	return res;	
+	}
+
+/**	
+ Subtracts window region from the supplied region 
+ then calls all children to subtract themsleves
+ @param aRegion region from which current window are should be subtructed
+ @param aClip clipping area provided by the parent window
+ @param aOrigin absolute origin of parent
+ */
+void CCompWin::SubSelfFromRegion(TRegion& aRegion, const TRect& aClip, const TPoint& aOrigin)
+	{
+	if (!iVisible)
+		{
+		return;
+		}
+	TPoint origin = iPos + aOrigin;
+	TRect clip(origin, iSize);
+	clip.Intersection(aClip);
+	aRegion.SubRect(clip);
+	for (TInt num = 0; num < iChildren.Count(); ++num)
+		{
+		if (iChildren[num]->iVisible)
+			{
+			iChildren[num]->SubSelfFromRegion(aRegion, clip, origin);
+			}
+		}
+	}
+
+void CCompWin::SetVerifyTick(TUint32 aTick)
+	{
+	iVerifyTick = aTick;
+	for (TInt num = 0; num < iChildren.Count(); ++num)
+		{
+		if (iChildren[num]->iVisible)
+			{
+			iChildren[num]->SetVerifyTick(aTick);
+			}
+		}
+	}
+