--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/TREDRAW.CPP Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1586 @@
+// Copyright (c) 1996-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:
+// Window redraw/validate/invalidate tests
+//
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "TREDRAW.H"
+
+LOCAL_D TSize FullScreenModeSize;
+
+const TRgb KRed = TRgb(255,0,0);
+const TRgb KBlack = TRgb(0,0,0);
+const TRgb KWhite = TRgb(255,255,255);
+const TRgb KTransBisque = TRgb(255,228,196,128);
+const TRgb KTransLightSalmon = TRgb(255,160,122,128);
+const TRgb KLightSteelBlue = TRgb(176,196,222);
+const TRgb KCadetBlue = TRgb(95,158,160);
+
+TInt CTRedrawOrderWindow::iRedrawNumber=0;
+
+#define InvalidRegionLogging
+#if defined(InvalidRegionLogging)
+#define BLOG_MESSAGE(p) (const_cast<CTRedrawTest*>(&iGraphicsTest))->LogMessage(((TText8*)__FILE__), __LINE__,(p))
+#endif
+
+//
+// //
+//
+
+CTCheckDefectWin* CTCheckDefectWin::NewL(TPoint aPos,TSize aWinSize)
+ {
+ CTCheckDefectWin* win=new(ELeave) CTCheckDefectWin;
+ win->ConstructExtLD(*TheClient->iGroup,aPos,aWinSize);
+ win->BaseWin()->SetRequiredDisplayMode(EColor256);
+ win->AssignGC(*TheClient->iGc);
+ win->BaseWin()->SetShadowDisabled(ETrue);
+ win->BaseWin()->SetShadowHeight(0);
+ TheClient->Flush();
+ return win;
+ }
+
+CRedrawWindow::CRedrawWindow(CTRedrawTest *aTest) : CTWin(), iTest(aTest)
+ {
+ }
+
+CRedrawWindow::~CRedrawWindow()
+ {
+ iInvalid.Close();
+ }
+
+void CRedrawWindow::Draw()
+ {
+ ReceivedDrawRequest();
+ DrawPattern(iTest->WinContent());
+ }
+
+void CRedrawWindow::ReceivedDrawRequest()
+ {
+ iDrawRequests++;
+ }
+
+TInt CRedrawWindow::DrawRequests() const
+ {
+ return iDrawRequests;
+ }
+
+void CRedrawWindow::DrawPattern(TInt aPattern)
+ {
+ iGc->Clear();
+ TPoint drawBase(-10,-20);
+ TSize drawSize(iSize.iWidth-2*drawBase.iX,iSize.iHeight-2*drawBase.iY);
+ TPoint offset=drawBase+iOffset;
+ switch(aPattern)
+ {
+ case EDrawGraphPaperlHatched:
+ {
+ iGc->DrawRect(TRect(drawBase,drawBase+drawSize));
+ iGc->SetPenColor(TRgb(85,85,85));
+ iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR);
+ TInt xpos;
+ for(xpos=0;xpos<drawSize.iWidth;xpos+=15)
+ iGc->DrawLine(TPoint(xpos,0)+offset,TPoint(xpos,drawSize.iHeight)+offset);
+ TInt ypos;
+ for(ypos=0;ypos<drawSize.iHeight;ypos+=15)
+ iGc->DrawLine(TPoint(0,ypos)+offset,TPoint(drawSize.iWidth,ypos)+offset);
+ break;
+ }
+ case EDrawSlantingHatched:
+ {
+ iGc->SetPenColor(TRgb(255,255,255));
+ iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR);
+ for(TInt xpos=0;xpos<drawSize.iWidth;xpos+=16)
+ {
+ iGc->DrawLine(TPoint(xpos,0)+offset,TPoint(drawSize.iWidth,xpos*drawSize.iHeight/drawSize.iWidth)+offset);
+ iGc->DrawLine(TPoint(xpos,0)+offset,TPoint(0,drawSize.iHeight-xpos*drawSize.iHeight/drawSize.iWidth)+offset);
+ iGc->DrawLine(TPoint(xpos,drawSize.iHeight)+offset,TPoint(drawSize.iWidth,drawSize.iHeight-xpos*drawSize.iHeight/drawSize.iWidth)+offset);
+ iGc->DrawLine(TPoint(xpos,drawSize.iHeight)+offset,TPoint(0,xpos*drawSize.iHeight/drawSize.iWidth)+offset);
+ }
+ }
+ break;
+ case EDrawCenteredRectangle:
+ {
+ TRect rect(5,iSize.iHeight/4,iSize.iWidth-5,iSize.iHeight/2);
+ iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR);
+ iGc->SetPenColor(TRgb(255,255,255));
+ iGc->DrawRect(rect);
+ }
+ break;
+ default:
+ // Other pattern values requested are ignored
+ break;
+ }
+ }
+
+void CRedrawWindow::Reset()
+ {
+ iOffset=TPoint(0,0);
+ iWin.Invalidate();
+ iInvalid.Clear();
+ }
+
+/**
+ * Calculate the window region minus the region covered by the child
+ * window; this is the "visible region"
+ */
+void CRedrawWindow::VisibleRegion(RRegion &aRegion)
+ {
+ aRegion.Clear();
+ aRegion.AddRect(TRect(Size()));
+ TRect child;
+ child.iTl=Child()->BaseWin()->InquireOffset(iWin);
+ child.iBr=child.iTl+Child()->Size();
+ aRegion.SubRect(child);
+ }
+
+
+void CRedrawWindow::ValidateAndClear()
+ {
+ Win()->Invalidate();
+ Win()->BeginRedraw();
+ iGc->Activate(*Win());
+ iGc->Clear();
+ iGc->Deactivate();
+ Win()->EndRedraw();
+ }
+
+void CRedrawWindow::ActivateAndDraw(TInt aPattern, TRegion *aRegion)
+ {
+ iGc->Activate(*Win());
+ if (aRegion)
+ iGc->SetClippingRegion(*aRegion);
+ DrawPattern(aPattern);
+ iGc->Deactivate();
+ }
+
+CReferenceComparisonRedrawWindow::CReferenceComparisonRedrawWindow(CTRedrawTest *aTest) : CRedrawWindow(aTest)
+ {}
+
+/**
+ * Prepare the invalid region.
+ *
+ * Update the invalid region with a rectangle where such a rectangle is minus
+ * any area covered by a child window.
+ *
+ * @param aRect Rectangle to be added to the invalid region
+ */
+void CReferenceComparisonRedrawWindow::PrepareInvalidation(const TRect &aRect)
+ {
+ RRegion clipped_visible;
+ VisibleRegion(clipped_visible);
+ clipped_visible.ClipRect(aRect);
+ iInvalid.Union(clipped_visible);
+ clipped_visible.Close();
+ iInvalid.Tidy();
+ }
+
+/**
+ * Mop up all pending invalid regions and simulate a Draw().
+ *
+ * Normally, we would rely on WServ to call this window's Draw() method
+ * to obtain drawing operations to cover the currently invalid regions
+ * of the window.
+ *
+ * This method does that task by marking all invalid regions as clean and
+ * then performs the drawing required in the invalid portions of the screen.
+ *
+ * The purpose of this is to then allow a comparison to be made against a
+ * different window which does rely on the WServ framework calling back
+ * to do a Draw().
+ *
+ * @post the window has no outstanding invalid regions
+ */
+void CReferenceComparisonRedrawWindow::PerformInvalidation()
+ {
+ for(TInt index=0;index<iInvalid.Count();index++)
+ {
+ iWin.Invalidate(iInvalid[index]);
+ iWin.BeginRedraw(iInvalid[index]);
+ iWin.EndRedraw();
+ }
+ iWin.BeginRedraw(iInvalid.BoundingRect());
+ iGc->Activate(iWin);
+ iGc->SetClippingRegion(iInvalid);
+ DrawPattern(iTest->WinContent());
+ iGc->Deactivate();
+ iWin.EndRedraw();
+ }
+
+CRedrawWindow2::CRedrawWindow2(CTRedrawTest *aTest) : CRedrawWindow(aTest)
+ {
+ }
+
+void CRedrawWindow2::Draw()
+ {
+ ReceivedDrawRequest();
+ if (iClipped)
+ iGc->SetClippingRegion(iInvalid);
+ DrawPattern(iTest->WinContent());
+ if (iClipped)
+ iGc->CancelClippingRegion();
+ }
+
+/**
+ * Prepare the invalid region.
+ * @param aRect rectangle to be added to the invalid region
+ */
+void CRedrawWindow2::PrepareInvalidation(const TRect &aRect)
+ {
+ iInvalid.Clear();
+ iInvalid.AddRect(aRect);
+ }
+
+/**
+ * Perform invalidation by setting the window's invalid region.
+ *
+ * The purpose of this method is to stimulate a call from WServ to the
+ * Draw() method of this class.
+ */
+void CRedrawWindow2::PerformInvalidation()
+ {
+ iWin.Invalidate(iInvalid.BoundingRect());
+ }
+
+void CRedrawWindow2::Reset()
+ {
+ CRedrawWindow::Reset();
+ iClipped=EFalse;
+ }
+
+CRedrawWindow3::CRedrawWindow3(CTRedrawTest *aTest) : CRedrawWindow(aTest)
+ {
+ }
+
+void CRedrawWindow3::Draw()
+ {
+ ReceivedDrawRequest();
+ iGc->Clear();
+ iGc->SetPenStyle(CGraphicsContext::ENullPen);
+ iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+ iGc->SetBrushColor(TRgb(0,255,255));
+ iGc->DrawRect(TRect(TPoint(0,0),TSize(50,50)));
+ }
+
+void CRedrawWindow3::PrepareInvalidation(const TRect &aRect)
+ {
+ iInvalid.Clear();
+ iInvalid.AddRect(aRect);
+ }
+
+void CRedrawWindow3::PerformInvalidation()
+ {
+ iWin.Invalidate(iInvalid.BoundingRect());
+ }
+
+void CRedrawWindow3::SetUp1L(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+ {
+ ConstructL(*parent);
+ SetExtL(pos,size);
+ AssignGC(aGc);
+ }
+
+void CRedrawWindow3::Redraw(const TRect &aRect)
+ {
+ if(!isActive)
+ {//make an empty redraw
+ iWin.BeginRedraw(aRect);
+ iWin.EndRedraw();
+ }
+ else
+ {
+ CTWin::Redraw(aRect);
+ }
+ }
+
+void CRedrawWindow3::Activate()
+ {
+ isActive = ETrue;
+ Win()->Activate();
+ }
+
+//
+
+CTRedrawOrderWindow::CTRedrawOrderWindow(TInt aOrder, CTRedrawTest *aTest) : iTest(aTest), iOrder(aOrder)
+ {}
+
+CTRedrawOrderWindow* CTRedrawOrderWindow::NewLC(TInt aOrder,CTWinBase* aParent,const TPoint& aPos,const TSize& aSize,CTRedrawTest* aTest)
+ {
+ CTRedrawOrderWindow* self=new(ELeave) CTRedrawOrderWindow(aOrder,aTest);
+ CleanupStack::PushL(self);
+ self->SetUpL(aPos,aSize,aParent,*TheGc);
+ return self;
+ }
+
+void CTRedrawOrderWindow::Draw()
+ {
+ iGc->SetBrushColor(TRgb::Gray16(iOrder*2));
+ iGc->Clear();
+ }
+
+void CTRedrawOrderWindow::ResetRedrawNumber()
+ {
+ iRedrawNumber=0;
+ }
+
+void CTRedrawOrderWindow::Redraw(const TRect &aRect)
+ {
+ if (++iRedrawNumber!=iOrder)
+ iTest->Failed(iOrder);
+ CTWin::Redraw(aRect);
+ }
+
+//
+
+TInt DestructCallback(TAny *aParam)
+ {
+ ((CTRedrawTest *)aParam)->doDestruct();
+ return(0);
+ }
+
+CTRedrawTest::CTRedrawTest(CTestStep* aStep):
+ CTWsGraphicsBase(aStep)//, iInvalidRegionChecker(*this)
+ {}
+
+void CTRedrawTest::doDestruct()
+ {
+ BaseWin->SetVisible(ETrue);
+ TestWin->SetVisible(ETrue);
+ delete iBaseRedrawWin;
+ delete iTestRedrawWin;
+ delete iBaseChildWin;
+ delete iTestChildWin;
+ }
+
+CTRedrawTest::~CTRedrawTest()
+ {
+ TCallBack callBack(DestructCallback,this);
+ TheClient->SetRedrawCancelFunction(callBack);
+ delete iInvalidRegionChecker;
+ }
+
+void CTRedrawTest::ConstructL()
+ {
+#if defined(InvalidRegionLogging)
+ LOG_MESSAGE(_L(" CTRedrawTest::ConstructL()"));
+ LOG_MESSAGE4(_L(" Ex Wins 0x%08x, 0x%08x, 0x%08x"), BaseWin, TestWin, &(TheClient->StdLogWindow()));
+#endif
+
+ iInvalidRegionChecker = new(ELeave)CInvalidRegionChecker(*this);
+ User::LeaveIfError(iInvalidRegionChecker->AddExcludedWindow(BaseWin));
+ User::LeaveIfError(iInvalidRegionChecker->AddExcludedWindow(TestWin));
+ User::LeaveIfError(iInvalidRegionChecker->AddExcludedWindow(&(TheClient->StdLogWindow())));
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+ iWinContent=0;
+ BaseWin->SetVisible(EFalse);
+ TestWin->SetVisible(EFalse);
+ FullScreenModeSize=TheClient->iGroup->Size();
+ TInt winWidth=(FullScreenModeSize.iWidth/3)-10;
+ TInt winHeight=FullScreenModeSize.iHeight-10;
+ iBaseRedrawWin=new(ELeave) CReferenceComparisonRedrawWindow(this);
+ iBaseRedrawWin->SetUpL(TPoint(FullScreenModeSize.iWidth/3+5,5),TSize(winWidth,winHeight),TheClient->iGroup,*TheClient->iGc);
+ iTestRedrawWin=new(ELeave) CRedrawWindow2(this);
+ iTestRedrawWin->SetUpL(TPoint(FullScreenModeSize.iWidth/3*2+5,5),TSize(winWidth,winHeight),TheClient->iGroup,*TheClient->iGc);
+ iBaseChildWin=new(ELeave) CBlankWindow();
+ iBaseChildWin->SetUpL(TPoint(winWidth>>2,winHeight>>2),TSize(winWidth>>1,winHeight>>1),iBaseRedrawWin,*TheClient->iGc);
+ iTestChildWin=new(ELeave) CBlankWindow();
+ iTestChildWin->SetUpL(TPoint(winWidth>>2,winHeight>>2),TSize(winWidth>>1,winHeight>>1),iTestRedrawWin,*TheClient->iGc);
+
+#if defined(InvalidRegionLogging)
+ LOG_MESSAGE5(_L(" In Wins %08x, %08x, %08x, %08x"), iBaseRedrawWin, iBaseChildWin, iTestRedrawWin, iTestChildWin);
+#endif
+
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+#if defined(InvalidRegionLogging)
+ LOG_MESSAGE(_L(" Done"));
+#endif
+ }
+
+void CTRedrawTest::CheckRedrawWindows()
+ {
+ _LIT(KTest,"Redraw Test, SubTest %d ");
+ TBuf<64> buf;
+ buf.Format(KTest,iTest->iState);
+ CheckRect(iBaseRedrawWin,iTestRedrawWin,TRect(iBaseRedrawWin->Size()),buf);
+ }
+
+void CTRedrawTest::InvalidateTestWins(const TRect &aRect)
+ {
+ iBaseRedrawWin->PrepareInvalidation(aRect);
+ iTestRedrawWin->PrepareInvalidation(aRect);
+ iBaseRedrawWin->PerformInvalidation();
+ iTestRedrawWin->PerformInvalidation();
+ }
+
+inline TInt CTRedrawTest::WinContent()
+ {
+ return iWinContent;
+ }
+
+void CTRedrawTest::SetBackground(const TRgb &aRgb)
+ {
+ iBaseRedrawWin->iWin.SetBackgroundColor(aRgb);
+ iTestRedrawWin->iWin.SetBackgroundColor(aRgb);
+ }
+
+void CTRedrawTest::DumpRegion(const TRegion &aRegion)
+ {
+ _LIT(KLog,"RegionRect %d: (%d,%d,%d,%d)");
+ for (TInt ii=0;ii<aRegion.Count();++ii)
+ {
+ const TRect& rect=aRegion[ii];
+ LOG_MESSAGE6(KLog,ii,rect.iTl.iX,rect.iTl.iY,rect.iBr.iX,rect.iBr.iY);
+ }
+ }
+
+/**
+ * Compare Regions to see if the region we think we have dirtied can be
+ * completely covered by the WServ invalid region.
+ *
+ * @param aDirtyRegion Region we have made dirty
+ * @param aWservInvalidRegion Region WServ thinks is dirty
+ */
+void CTRedrawTest::CompareRegionsL(const TRegion &aDirtyRegion,const TRegion &aWservInvalidRegion)
+ {
+ _LIT(KDirty,"Dirty Region, %d Rects");
+ _LIT(KInvalid,"Invalid Region, %d Rects");
+ _LIT(KDiff,"Diff Region, %d Rects");
+ RRegion tmp;
+ TBool loggedRegions=EFalse;
+ tmp.Copy(aDirtyRegion);
+ tmp.SubRegion(aWservInvalidRegion);
+ if (tmp.CheckError())
+ User::Leave(KErrNoMemory);
+ TBool isEmpty=tmp.IsEmpty();
+ TEST(isEmpty);
+ if (!isEmpty)
+ {
+ _LIT(KLog,"DirtyRegion contains area not in WservInvalidRegion");
+ LOG_MESSAGE(KLog);
+ loggedRegions=ETrue;
+ LOG_MESSAGE2(KDirty,aDirtyRegion.Count());
+ DumpRegion(aDirtyRegion);
+ LOG_MESSAGE2(KInvalid,aWservInvalidRegion.Count());
+ DumpRegion(aWservInvalidRegion);
+ LOG_MESSAGE2(KDiff,tmp.Count());
+ DumpRegion(tmp);
+ }
+ tmp.Copy(aWservInvalidRegion);
+ tmp.SubRegion(aDirtyRegion);
+ if (tmp.CheckError())
+ User::Leave(KErrNoMemory);
+ isEmpty=tmp.IsEmpty();
+ //TEST(isEmpty); //This test currently fails and a defect will be raises about it
+ if (!isEmpty)
+ {
+ _LIT(KLog,"WservInvalidRegion contains area not in DirtyRegion");
+ LOG_MESSAGE(KLog);
+ if (!loggedRegions)
+ {
+ LOG_MESSAGE2(KDirty,aDirtyRegion.Count());
+ DumpRegion(aDirtyRegion);
+ LOG_MESSAGE2(KInvalid,aWservInvalidRegion.Count());
+ DumpRegion(aWservInvalidRegion);
+ }
+ LOG_MESSAGE2(KDiff,tmp.Count());
+ DumpRegion(tmp);
+ }
+ tmp.Close();
+ }
+
+void CTRedrawTest::MoveInvalidAreaL()
+ {
+ TPoint old=iTestRedrawWin->iWin.Position();
+ TSize screenSize=TheClient->iGroup->Size();
+ iBaseRedrawWin->iWin.Invalidate();
+ iTestRedrawWin->iWin.Invalidate();
+ iTestRedrawWin->iWin.SetPosition(TPoint(10,10));
+ iTestRedrawWin->iWin.SetPosition(TPoint(0,0));
+ iTestRedrawWin->iWin.SetPosition(TPoint(-10,-10));
+ iTestRedrawWin->iWin.SetPosition(TPoint(screenSize.iWidth-10,screenSize.iHeight-10));
+ iTestRedrawWin->iWin.SetPosition(TPoint(screenSize.iWidth,screenSize.iHeight));
+ iTestRedrawWin->iWin.SetPosition(TPoint(screenSize.iWidth+10,screenSize.iHeight+10));
+ iTestRedrawWin->iWin.SetPosition(old);
+ RRegion baseInvalidRegion;
+ RRegion testInvalidRegion;
+ iBaseRedrawWin->iWin.GetInvalidRegion(baseInvalidRegion);
+ iTestRedrawWin->iWin.GetInvalidRegion(testInvalidRegion);
+ CompareRegionsL(baseInvalidRegion,testInvalidRegion);
+ baseInvalidRegion.Close();
+ testInvalidRegion.Close();
+ }
+
+void CTRedrawTest::GetInvalidRegionTestsL()
+ {
+ TSize stdWinSize(iTest->StdTestWindowSize());
+ CArrayFixFlat<TRect>* rectList=new(ELeave) CArrayFixFlat<TRect>(3);
+ rectList->AppendL(TRect(1,1,5,2));
+ rectList->AppendL(TRect(stdWinSize.iWidth>>1,stdWinSize.iHeight>>1,stdWinSize.iWidth,stdWinSize.iHeight));
+ rectList->AppendL(TRect(2,0,4,5));
+ TestGetInvalidRegionL(rectList);
+ rectList->Reset();
+ rectList->AppendL(TRect(-1000,-1,10000,5));
+ rectList->AppendL(TRect(0,0,stdWinSize.iWidth>>1,stdWinSize.iHeight>>1));
+ rectList->AppendL(TRect(2,100,2*stdWinSize.iWidth,105));
+ TestGetInvalidRegionL(rectList);
+ delete rectList;
+ }
+
+void CTRedrawTest::TestGetInvalidRegionL(const CArrayFixFlat<TRect> *aRectList)
+ {
+ RRegion invalidRegion;
+ RRegion region;
+ iTestRedrawWin->iWin.BeginRedraw();
+ iTestRedrawWin->iWin.EndRedraw();
+ for (TInt index=0;index<aRectList->Count();index++)
+ {
+ iTestRedrawWin->iWin.Invalidate((*aRectList)[index]);
+ region.AddRect((*aRectList)[index]);
+ }
+ //Currently WSERV includes areas under a child or other window in the invalid region
+ //This is arguable the incorrect thing to do
+ /*TRect subRect;
+ subRect.iTl=iTestChildWin->BaseWin()->InquireOffset(iTestRedrawWin->iWin);
+ subRect.SetSize(iTestChildWin->Size());
+ region.SubRect(subRect);*/
+ region.ClipRect(TRect(iTestRedrawWin->Size()));
+ iTestRedrawWin->iWin.GetInvalidRegion(invalidRegion);
+ CompareRegionsL(region,invalidRegion);
+ region.Close();
+ invalidRegion.Close();
+ }
+
+void CTRedrawTest::Failed(TInt aOrder)
+ {
+ _LIT(KLog,"Redraw Order Error, Window Drawn at Position %d should be drawn at Position %d");
+ LOG_MESSAGE3(KLog,CTRedrawOrderWindow::RedrawNumber(),aOrder);
+ if (iRedrawNo==0)
+ iRedrawNo=CTRedrawOrderWindow::RedrawNumber();
+ }
+
+void CTRedrawTest::CheckOrderL()
+ {
+ _LIT(KLog,"Fail in redraw order test, first position of error is %d");
+ iRedrawNo=0;
+ CTRedrawOrderWindow* order1;
+ CTRedrawOrderWindow* order2;
+ CTRedrawOrderWindow* order3;
+ CTRedrawOrderWindow* order4;
+ CTRedrawOrderWindow* order5;
+ CTRedrawOrderWindow* order6;
+ CTRedrawOrderWindow* order7;
+ order6=CTRedrawOrderWindow::NewLC(6,TheClient->iGroup,TPoint(100,10),TSize(40,40),this);
+ order7=CTRedrawOrderWindow::NewLC(7,order6,TPoint(0,0),TSize(20,20),this);
+ order1=CTRedrawOrderWindow::NewLC(1,TheClient->iGroup,TPoint(10,10),TSize(60,40),this);
+ order4=CTRedrawOrderWindow::NewLC(4,order1,TPoint(20,0),TSize(20,40),this);
+ order5=CTRedrawOrderWindow::NewLC(5,order4,TPoint(0,0),TSize(20,20),this);
+ order2=CTRedrawOrderWindow::NewLC(2,order1,TPoint(0,0),TSize(20,40),this);
+ order3=CTRedrawOrderWindow::NewLC(3,order2,TPoint(0,0),TSize(20,20),this);
+ TheClient->iWs.Finish(); // Fix for DEF133199 - Intermittant failure with windows out of order
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions); // Check order is correct after initial creation
+ TEST(order1!=NULL && order2!=NULL && order3!=NULL && order4!=NULL && order5!=NULL && order6!=NULL && order7!=NULL); // redundant check to shut up the compiler
+ TEST(iRedrawNo==0);
+ if (iRedrawNo>0)
+ LOG_MESSAGE2(KLog,iRedrawNo);
+
+ CTRedrawOrderWindow::ResetRedrawNumber();
+ iRedrawNo=0;
+ CTUser::Splat(TheClient,TRect(0,0,200,60),TRgb(0,0,0));
+ TheClient->iWs.Flush();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions); // Check it's still correct on subsequent redraws
+ TEST(iRedrawNo==0);
+ if (iRedrawNo>0)
+ LOG_MESSAGE2(KLog,iRedrawNo);
+ CTRedrawOrderWindow::ResetRedrawNumber();
+ CleanupStack::PopAndDestroy(7,order6);
+ }
+
+// For reproducing INC049554
+void CTRedrawTest::CheckDefectINC049554L()
+ {
+ if(TransparencySupportedL() == KErrNotSupported) //the defect only happens when transparency enabled
+ return;
+ TSize screenSize=TheClient->iScreen->SizeInPixels();
+ TPoint winPos(screenSize.iWidth/3,0);
+ TSize winSize(screenSize.iWidth/3,screenSize.iHeight);
+ CTCheckDefectWin* lowerWin=CTCheckDefectWin::NewL(winPos,winSize);
+ CleanupStack::PushL(lowerWin);
+ lowerWin->Activate();
+ TheClient->Flush();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+ winPos.iX+=screenSize.iWidth/12;
+
+ CTCheckDefectWin* upperWin=CTCheckDefectWin::NewL(winPos,winSize);
+ CleanupStack::PushL(upperWin);
+ upperWin->Activate();
+ TheClient->Flush();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+ // Invalidate the lower win and while drawing its content, move top window
+ lowerWin->Invalidate();
+ lowerWin->Win()->BeginRedraw();
+ TheClient->iGc->Activate(*lowerWin->DrawableWin());
+ TheClient->iGc->SetPenStyle(CGraphicsContext::ENullPen);
+ TheClient->iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+ TheClient->iGc->SetBrushColor(TRgb(0,255,0));
+ TheClient->iGc->DrawRect(TRect(TPoint(0,0),TSize(50,50)));
+
+ winPos.iX+=screenSize.iWidth/12;
+ upperWin->SetExt(winPos,winSize);
+
+ TheClient->iGc->SetBrushColor(TRgb(255,0,0));
+ TheClient->iGc->DrawRect(TRect(TPoint(0,0),TSize(50,50)));
+ TheClient->iGc->Deactivate();
+ lowerWin->Win()->EndRedraw();
+
+ TheClient->Flush();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+ CleanupStack::PopAndDestroy(upperWin);
+
+ // Create 2 transaprent windows, slightly over lapping the background window
+ winPos.iX=screenSize.iWidth/3;
+ TPoint winPosTop(winPos.iX-screenSize.iWidth/6,0);
+ TSize winSizeTop(screenSize.iWidth/3+screenSize.iWidth/6,screenSize.iHeight/2);
+
+ CTCheckDefectWin* leftWin=CTCheckDefectWin::NewL(winPosTop,winSizeTop);
+ CleanupStack::PushL(leftWin);
+ leftWin->Win()->SetTransparencyAlphaChannel();
+ leftWin->Win()->SetBackgroundColor(TRgb(0,0,0, 128));
+ leftWin->Activate();
+ TheClient->iWs.Finish();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+ CTCheckDefectWin* rightWin=CTCheckDefectWin::NewL(winPos,winSizeTop);
+ CleanupStack::PushL(rightWin);
+ rightWin->Win()->SetTransparencyAlphaChannel();
+ rightWin->Win()->SetBackgroundColor(TRgb(0,0,0, 128));
+ rightWin->Activate();
+ TheClient->iWs.Finish();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+ lowerWin->Invalidate();
+ lowerWin->Win()->BeginRedraw();
+ TheClient->iGc->Activate(*lowerWin->DrawableWin());
+ TheClient->iGc->SetPenStyle(CGraphicsContext::ENullPen);
+ TheClient->iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+ TheClient->iGc->SetBrushColor(TRgb(0,255,0));
+ TheClient->iGc->DrawRect(TRect(TPoint(0,0),TSize(50,50)));
+
+ TheClient->iGc->SetBrushColor(TRgb(255,0,0));
+ TheClient->iGc->DrawRect(TRect(TPoint(0,0),TSize(50,50)));
+ TheClient->iGc->Deactivate();
+ lowerWin->Win()->EndRedraw();
+
+ TheClient->iWs.Finish();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+
+ CleanupStack::PopAndDestroy(3,lowerWin);
+ }
+
+
+TInt myKK=1;
+_LIT(KSnap,"c:\\TestRect%2i.mbm");
+_LIT(KSnapE,"c:\\TestRect%2iErr.mbm");
+void CTRedrawTest::TestRect()
+ {
+
+ TBuf<50> snapshotFileName;
+ snapshotFileName.Zero();
+ CFbsBitmap *snapshot=new(ELeave) CFbsBitmap();
+ CleanupStack::PushL(snapshot);
+ User::LeaveIfError(snapshot->Create(TheClient->iScreen->SizeInPixels(),TheClient->iScreen->DisplayMode()));
+
+ User::LeaveIfError(TheClient->iScreen->CopyScreenToBitmap(snapshot));
+
+ TRect rect1=TRect(TPoint(),TSize(FullScreenModeSize.iWidth/2,FullScreenModeSize.iHeight));
+ TRect rect2=TRect(TPoint(FullScreenModeSize.iWidth/2,0),TSize(FullScreenModeSize.iWidth/2,FullScreenModeSize.iHeight));
+ TBool retVal = TheClient->iScreen->RectCompare(rect1,rect2);
+
+ RDebug::Printf("Picture %i !!!: Rect1: (%i,%i)->(%i,%i) - Rect2: (%i,%i)->(%i,%i)",myKK,
+ rect1.iTl.iX,rect1.iTl.iY,rect1.iBr.iX,rect1.iBr.iY,
+ rect2.iTl.iX,rect2.iTl.iY,rect2.iBr.iX,rect2.iBr.iY);
+
+
+ if (retVal)
+ {
+ snapshotFileName.Format(KSnap,myKK);
+ }
+ else
+ {
+ snapshotFileName.Format(KSnapE,myKK);
+ }
+ snapshot->Save(snapshotFileName);
+ CleanupStack::PopAndDestroy(snapshot);
+ myKK++;
+
+
+
+ TEST(retVal);
+ if(!retVal)
+ INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value - Expected: %d, Actual: %d"), ETrue, retVal);
+ }
+
+void CTRedrawTest::ConstructAndSetBlankWinLC(RBlankWindow& aWindow, TSize aSize, TPoint aPoint/*=TPoint()*/,
+ TRgb aBackgroundColor/*=TRgb(0,0,0)*/)
+ {
+ User::LeaveIfError(aWindow.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle));
+ CleanupClosePushL(aWindow);
+ aWindow.SetExtent(aPoint, aSize);
+ aWindow.SetColor(aBackgroundColor);
+ aWindow.Activate();
+ }
+
+void CTRedrawTest::ConstructWindowLC(RWindow& aWindow, TSize aSize, TPoint aPoint/*=TPoint()*/,
+ TRgb aBackgroundColor/*=TRgb(255,255,255)*/, TBool aTransparencyByAlpha/*=EFalse*/,
+ TDisplayMode aDisplayMode/*=EColor64K*/)
+ {
+ User::LeaveIfError(aWindow.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle));
+ CleanupClosePushL(aWindow);
+ aWindow.SetExtent(aPoint,aSize);
+ aWindow.SetBackgroundColor(aBackgroundColor);
+ aWindow.SetRequiredDisplayMode(aDisplayMode);
+ if (aTransparencyByAlpha)
+ {
+ aWindow.SetTransparencyAlphaChannel();
+ }
+ aWindow.Activate();
+ }
+
+void CTRedrawTest::ActivateAndSetGc(CWindowGc& aGc, RWindow& aWindow, CGraphicsContext::TBrushStyle aBrushStyle/*=CGraphicsContext::ESolidBrush*/, TRgb aBrushColor/*=TRgb(0,0,0)*/,
+ CGraphicsContext::TPenStyle aPenStyle/*=CGraphicsContext::ENullPen*/, TRgb aPenColor/*=TRgb(0,0,0)*/)
+ {
+ aGc.Activate(aWindow);
+ aGc.Reset();
+ aGc.SetBrushStyle(aBrushStyle);
+ aGc.SetBrushColor(aBrushColor);
+ aGc.SetPenStyle(aPenStyle);
+ aGc.SetPenColor(aPenColor);
+ }
+
+void CTRedrawTest::DrawWin(CWindowGc& aGc, RWindow& aWin, TSize aWinSize, TRgb aRectColor1, TRgb aRectColor2, TInt aNewOrdinalPos/*=0*/, RWindow* aWinToMove/*=NULL*/, TBool aDrawAllPixels/*=EFalse*/)
+ {
+ const TUint startX = 10;
+ const TUint endX = aWinSize.iWidth - startX;
+ const TUint startY = 10;
+ const TUint sHeight = (aWinSize.iHeight >> 1) - startY;
+ ActivateAndSetGc(aGc,aWin);
+ aWin.BeginRedraw();
+ if(aDrawAllPixels)
+ {
+ aGc.SetBrushColor(KWhite);
+ aGc.DrawRect(TRect(aWinSize));
+ }
+ aGc.SetBrushColor(aRectColor1);
+ aGc.DrawRect(TRect(startX, startY, endX, sHeight));
+ if (aWinToMove)
+ {
+ aWinToMove->SetOrdinalPosition(aNewOrdinalPos);
+ TheClient->iWs.Finish();
+ }
+ aGc.SetBrushColor(aRectColor2);
+ aGc.DrawRect(TRect(startX, sHeight + startY, endX, aWinSize.iHeight - startY));
+ aWin.EndRedraw();
+ aGc.Deactivate();
+ }
+
+void CTRedrawTest::CheckOrdinalPositionDefectL()
+ {
+ if(TransparencySupportedL() == KErrNotSupported) //the defect only happens when transparency enabled
+ {
+ return;
+ }
+
+ const TRgb KTransWinColor = TRgb(0,0,255,128);
+ const TUint hWidth = FullScreenModeSize.iWidth >> 1;
+ const TSize windowSize = TSize(hWidth,FullScreenModeSize.iHeight);
+ const TPoint rightWinStartPt = TPoint(hWidth,0);
+
+ // A Blank Window to clear the screen.
+ // It is required to clear all the pixels on the screen.
+ RBlankWindow clrWin(TheClient->iWs);
+ ConstructAndSetBlankWinLC(clrWin, FullScreenModeSize);
+
+ // Transparent window
+ RWindow winLeftT(TheClient->iWs);
+ ConstructWindowLC(winLeftT, windowSize, TPoint(), KTransWinColor,ETrue);
+
+ CWindowGc& gc = *(TheClient->iGc);
+ // Draw the Transparent Window (winLeftT) on the Left side
+ DrawWin(gc, winLeftT, windowSize, KTransBisque, KTransLightSalmon);
+
+ // Invisible window
+ RWindow winRightI(TheClient->iWs);
+ User::LeaveIfError(winRightI.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle));
+ CleanupClosePushL(winRightI);
+ winRightI.SetExtent(rightWinStartPt, windowSize);
+ winRightI.SetVisible(EFalse);
+ winRightI.Activate();
+
+ // Transparent window
+ RWindow winRightT(TheClient->iWs);
+ ConstructWindowLC(winRightT, windowSize, rightWinStartPt, KTransWinColor,ETrue);
+
+ // Draw the Transparent Window (winRightT) on the Right side and change the
+ // Ordinal Position for Invisible Window (winRightI) to move it front
+ // to the Transparent Window.
+ // Invisible window is behind the Transparent Window
+
+ DrawWin(gc, winRightT, windowSize, KTransBisque, KTransLightSalmon, 0, &winRightI); // Move winRightI to Front of winRightT
+ TestRect();
+
+ CleanupStack::PopAndDestroy(4, &clrWin);
+ }
+
+// For reproducing PDEF099892
+void CTRedrawTest::CheckDefectPDEF099892L()
+ {
+ if(TransparencySupportedL() == KErrNotSupported) //the defect only happens when transparency enabled
+ {
+ return;
+ }
+
+ const TRgb KTransWinColor = TRgb(0,0,255,128);
+ const TUint hWidth = FullScreenModeSize.iWidth >> 1;
+ const TUint hHeight = FullScreenModeSize.iHeight >> 1;
+ const TSize windowSize = TSize(hWidth,FullScreenModeSize.iHeight);
+ const TSize transWinSize = TSize(hWidth,hHeight + 10);
+ const TPoint rightWinStartPt = TPoint(hWidth,0);
+
+ // A Blank Window to clear the screen.
+ // It is required to clear all the pixels on the screen.
+ RBlankWindow clrWin(TheClient->iWs);
+ ConstructAndSetBlankWinLC(clrWin, FullScreenModeSize);
+
+ // Create an Opaque and a Transparent Window and Draw them on the
+ // Left Side of the Screen. Opaque Window is Behind the Transparent Window.
+
+ // Opaque Window
+ RWindow winLeftOpq(TheClient->iWs);
+ ConstructWindowLC(winLeftOpq, windowSize, TPoint(), KRed);
+
+ // Transparent window
+ RWindow winLeftT(TheClient->iWs);
+ ConstructWindowLC(winLeftT, transWinSize, TPoint(), KTransWinColor, ETrue);
+
+ CWindowGc& gc = *(TheClient->iGc);
+ // Draw the transparent Window (winLeftT) on the Left side
+ DrawWin(gc, winLeftT, transWinSize, KTransBisque, KTransLightSalmon);
+
+ // Draw the Opaque Window (winLeftOpq) on the Left side
+ DrawWin(gc, winLeftOpq, windowSize, KLightSteelBlue, KCadetBlue, 0, NULL, ETrue);
+
+ // Create an Invisible, an Opaque and a Transparent Window and Draw them on the
+ // Right Side of the Screen. Invisible Window is Behind the Opaque Window and
+ // Opaque Window is Behind the Transparent Window.
+ // While drawing the Transparent Window, move the Invisible Window to the Front of Opaque Window.
+ // And while Drawing the Opaque Window move the Invisible Window again Behind the Opaque Window.
+
+ // Invisible window
+ RWindow winRightI(TheClient->iWs);
+ User::LeaveIfError(winRightI.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle));
+ CleanupClosePushL(winRightI);
+ winRightI.SetExtent(rightWinStartPt, windowSize);
+ winRightI.SetVisible(EFalse);
+ winRightI.Activate();
+
+ // Opaque Window
+ RWindow winRightOpq(TheClient->iWs);
+ ConstructWindowLC(winRightOpq, windowSize, rightWinStartPt, KRed);
+
+ // Transparent window
+ RWindow winRightT(TheClient->iWs);
+ ConstructWindowLC(winRightT, transWinSize, rightWinStartPt, KTransWinColor, ETrue);
+
+ // Draw the transparent Window (winRightT) on the Right side
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 1, &winRightI );
+
+ // Draw the Opaque Window (winRightOpq) on the Right side
+ DrawWin(gc, winRightOpq, windowSize, KLightSteelBlue, KCadetBlue, 2, &winRightI, ETrue);
+
+ // Compare the Left and Right side Rectangles
+ TestRect();
+
+ CleanupStack::PopAndDestroy(6, &clrWin);
+ }
+
+void CTRedrawTest::CheckMMSDefectL(TBool aMoveBlankWindow)
+ {
+ if(TransparencySupportedL() == KErrNotSupported) //the defect only happens when transparency enabled
+ {
+ return;
+ }
+
+ const TRgb KTransWinColor = TRgb(0,0,255,128);
+ const TUint hWidth = FullScreenModeSize.iWidth >> 1;
+ const TUint hHeight = FullScreenModeSize.iHeight >> 1;
+ const TSize windowSize = TSize(hWidth,FullScreenModeSize.iHeight);
+ const TSize transWinSize = TSize(hWidth - 20,hHeight + 10);
+ const TPoint rightWinStartPt = TPoint(hWidth,0);
+
+ // A Blank Window to clear the screen.
+ // It is required to clear all the pixels on the screen.
+ RBlankWindow clrWin(TheClient->iWs);
+ ConstructAndSetBlankWinLC(clrWin, FullScreenModeSize);
+
+ // Create an Opaque and a Transparent Window and Draw them on the
+ // Left Side of the Screen. Opaque Window is Behind the Transparent Window.
+
+ // Opaque Window
+ RWindow winLeftOpq(TheClient->iWs);
+ ConstructWindowLC(winLeftOpq, windowSize, TPoint(), KRed);
+ CWindowGc& gc = *(TheClient->iGc);
+ // Draw the Opaque Window (winLeftOpq) on the Left side
+ DrawWin(gc, winLeftOpq, windowSize, KLightSteelBlue, KCadetBlue, 0, NULL, ETrue);
+
+ // Another Window - A Blank Window
+ RBlankWindow winLeftBlank(TheClient->iWs);
+ ConstructAndSetBlankWinLC(winLeftBlank, TSize(100,100), TPoint(20,20), TRgb(128,128,128));
+
+ // Transparent window
+ RWindow winLeftT(TheClient->iWs);
+ ConstructWindowLC(winLeftT, transWinSize, TPoint(10, 10), KTransWinColor, ETrue);
+ // Draw the Transparent Window (winLeftT) on the Left side
+ DrawWin(gc, winLeftT, transWinSize, KTransBisque, KTransLightSalmon);
+
+ // Invisible window
+ RWindow winRightI(TheClient->iWs);
+ User::LeaveIfError(winRightI.Construct(*TheClient->iGroup->GroupWin(), ENullWsHandle));
+ CleanupClosePushL(winRightI);
+ winRightI.SetExtent(rightWinStartPt, windowSize);
+ winRightI.SetVisible(EFalse);
+ winRightI.Activate();
+
+ // Opaque Window
+ RWindow winRightOpq(TheClient->iWs);
+ ConstructWindowLC(winRightOpq, windowSize, rightWinStartPt, KRed);
+
+ // Draw the Opaque Window (winRightOpq) on the Right side
+ DrawWin(gc, winRightOpq, windowSize, KLightSteelBlue, KCadetBlue, 0, NULL, ETrue);
+
+ // Another Window - A Blank Window
+ RBlankWindow winRightBlank(TheClient->iWs);
+ ConstructAndSetBlankWinLC(winRightBlank, TSize(100,100), rightWinStartPt + TPoint(20,20), TRgb(128,128,128));
+
+ // Transparent window
+ RWindow winRightT(TheClient->iWs);
+ ConstructWindowLC(winRightT, transWinSize, rightWinStartPt + TPoint(10,10), KTransWinColor, ETrue);
+
+ if (aMoveBlankWindow)
+ {
+ winRightBlank.SetOrdinalPosition(0); // Move the Blank Window to the front of the Transparent Window
+ TheClient->iWs.Finish();
+ }
+ // Draw the transparent Window (winRightT) on the Right side
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 2, &winRightI);
+ if (aMoveBlankWindow)
+ {
+ winRightBlank.SetOrdinalPosition(1); // Move the Blank Window back to behind the Transparent Window
+ TheClient->iWs.Finish();
+ }
+ TestRect();
+
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 0, &winRightI);
+ TestRect(); // if aMoveBlankWindow is ETrue then this will test the Defect PDEF099892
+
+ // Rest of the lines are just to check other possibilities.
+ // But,currently, they are not affecting the result.
+ // i.e. the DrawWin() functions called after this line will draw the same thing
+ // as it was drawn for the DrawWin() called just before this line.
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 1, &winRightI);
+ TestRect();
+
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 0, &winRightI);
+ TestRect();
+
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 2, &winRightI);
+ TestRect();
+
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 1, &winRightI);
+ TestRect();
+
+ DrawWin(gc, winRightT, transWinSize, KTransBisque, KTransLightSalmon, 3, &winRightI);
+ TestRect();
+
+ CleanupStack::PopAndDestroy(8, &clrWin);
+ }
+
+/**
+
+The test window is receiving a draw request before it activates,
+doing an empty redraw, then activating itself, and drawing itself properly in
+response to the next redraw request.
+
+Without the fix the next redraw request will not be received and it will be drawn blank.
+*/
+void CTRedrawTest::CheckDefectPDEF117784L()
+ {
+ TSize winSize = BaseWin->Size();
+
+ TInt winWidth=(FullScreenModeSize.iWidth/3)-10;
+ TInt winHeight=FullScreenModeSize.iHeight-10;
+
+ CRedrawWindow3* baseRedrawWin = new(ELeave) CRedrawWindow3(this);
+ CleanupStack::PushL(baseRedrawWin);
+ TPoint ptBase = TPoint(FullScreenModeSize.iWidth/3*2+5,5);
+ baseRedrawWin->SetUp1L(ptBase,TSize(winWidth,winHeight),TheClient->iGroup,*TheClient->iGc);
+ baseRedrawWin->SetVisible(ETrue);
+ baseRedrawWin->Activate();
+
+ CRedrawWindow3* testRedrawWin = new(ELeave) CRedrawWindow3(this);
+ CleanupStack::PushL(testRedrawWin);
+ TPoint ptTest = TPoint(FullScreenModeSize.iWidth/3+5,5);
+ testRedrawWin->SetUp1L(ptTest,TSize(winWidth,winHeight),TheClient->iGroup,*TheClient->iGc);
+ testRedrawWin->SetVisible(ETrue);
+ testRedrawWin->Activate();
+
+ TheClient->iWs.Finish();
+ User::LeaveIfError(iInvalidRegionChecker->AddExcludedWindow(testRedrawWin));
+ TBool retVal = WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+ TEST(retVal == KErrNone);
+ if(retVal != KErrNone)
+ {
+ ERR_PRINTF2(_L("CTRedrawTest::WaitForRedrawsToFinish failed with error: %d"), retVal);
+ }
+ iInvalidRegionChecker->RemoveExcludedWindow(testRedrawWin);
+
+ TheClient->iWs.Finish();
+ retVal = WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+ TEST(retVal == KErrNone);
+ if(retVal != KErrNone)
+ {
+ ERR_PRINTF2(_L("CTRedrawTest::WaitForRedrawsToFinish failed with error: %d"), retVal);
+ }
+
+ retVal = TheClient->iScreen->RectCompare(TRect(TPoint(ptBase),TSize(winWidth,winHeight)),TRect(TPoint(ptTest),TSize(winWidth,winHeight)));
+ TEST(retVal);
+ if(!retVal)
+ {
+ ERR_PRINTF1(_L("New activated window has lost redraw request"));
+ }
+
+ CleanupStack::PopAndDestroy(2, baseRedrawWin);
+ }
+
+CInvalidRegionChecker::CInvalidRegionChecker(const CTRedrawTest& aGraphicsTest)
+ : iGraphicsTest(aGraphicsTest)
+ {}
+
+CInvalidRegionChecker::~CInvalidRegionChecker()
+ {
+ iExcludedWindowArray.Close();
+ }
+
+TInt CInvalidRegionChecker::AddExcludedWindow(const CTWinBase* aExcludedWindow)
+ {
+ TInt error = KErrNone;
+ const CTWinBase** emptySlot = NULL;
+ for(TInt win=iExcludedWindowArray.Count()-1; win>=0; win--)
+ {
+ if(iExcludedWindowArray[win]==aExcludedWindow)
+ {
+ // window is already excluded, we don't want to add it twice
+ return error;
+ }
+ if(!emptySlot && iExcludedWindowArray[win]==NULL)
+ {
+ emptySlot = &iExcludedWindowArray[win];
+ }
+ }
+
+ if(emptySlot)
+ {
+ // re-use the emptyslot
+ *emptySlot=aExcludedWindow; // re-use the element
+ }
+ else
+ {
+ // no empty elements re-used, so add a new one
+ error = iExcludedWindowArray.Append(aExcludedWindow);
+ }
+ return error;
+ };
+
+void CInvalidRegionChecker::RemoveExcludedWindow(const CTWinBase* aExcludedWindow)
+ {
+ if(iExcludedWindowArray.Count())
+ {
+ for(TInt win=iExcludedWindowArray.Count()-1; win>=0; win--)
+ {
+ if(iExcludedWindowArray[win]==aExcludedWindow)
+ {
+ iExcludedWindowArray[win]=NULL; // Not worth deleting the array element, just mark it as NULL
+ return;
+ }
+ }
+ }
+ };
+
+TBool CInvalidRegionChecker::ExcludedWindow(const CTWinBase* aWin) const
+ {
+ for(TInt win=iExcludedWindowArray.Count()-1; win>=0; win--)
+ {
+ if(aWin == iExcludedWindowArray[win])
+ {
+#if defined(InvalidRegionLogging)
+ {
+ _LIT(KText, " Excluded Window %08x");
+ TLogMessageText buf;
+ buf.Format(KText, aWin);
+ BLOG_MESSAGE(buf);
+ }
+#endif
+ return ETrue;
+ }
+ }
+ return EFalse;
+ }
+
+void CInvalidRegionChecker::ProcessWindow(const CTWinBase* aTWinBase)
+ {
+#if defined(InvalidRegionLogging)
+ {
+ _LIT(KText, " ProcessWindow %08x %d - Child(%08x), Next(%08x), Prev(%08x)");
+ TLogMessageText buf;
+ buf.Format(KText, aTWinBase, iInvalidRegionCount, aTWinBase->Child(), aTWinBase->NextSibling(), aTWinBase->PrevSibling());
+ BLOG_MESSAGE(buf);
+ }
+#endif
+
+ if(aTWinBase && !ExcludedWindow(aTWinBase))
+ {
+ RRegion invalidRegion;
+ static_cast<const CTWin *>(aTWinBase)->Win()->GetInvalidRegion(invalidRegion);
+ iInvalidRegionCount += invalidRegion.Count();
+
+#if defined(InvalidRegionLogging)
+ if(invalidRegion.Count())
+ {
+ _LIT(KText, " IR Found for %08x %d");
+ TLogMessageText buf;
+ buf.Format(KText, aTWinBase, invalidRegion.Count());
+ BLOG_MESSAGE(buf);
+ }
+#endif
+
+ invalidRegion.Close();
+
+ if(0==iInvalidRegionCount)
+ {
+ ProcessChildWindow(aTWinBase->Child());
+ }
+ }
+ }
+
+void CInvalidRegionChecker::ProcessChildWindow(const CTWinBase* aTWinBase)
+ {
+ if(aTWinBase)
+ {
+ // get the first sibling window
+ const CTWinBase *sibling=aTWinBase;
+ const CTWinBase *prevSibling=sibling->PrevSibling();
+ while(prevSibling)
+ {
+ sibling=prevSibling;
+ prevSibling=sibling->PrevSibling();
+ }
+ // process all siblings inc. self
+ while(sibling && (0==iInvalidRegionCount))
+ {
+ ProcessWindow(sibling);
+ sibling=sibling->NextSibling();
+ }
+ }
+ }
+
+
+void CInvalidRegionChecker::ProcessWindowGroup(const CTWinBase* aTWinBase)
+ {
+ if(aTWinBase && !ExcludedWindow(aTWinBase))
+ {
+ ProcessChildWindow(aTWinBase->Child());
+ }
+ }
+
+TInt CInvalidRegionChecker::CheckInvalidRegions(const CTWindowGroup* aGroup)
+ {
+ iInvalidRegionCount=0;
+ ProcessWindowGroup(aGroup);
+#if defined(InvalidRegionLogging)
+ {
+ _LIT(KText, " CheckInvalidRegions %d");
+ TLogMessageText buf;
+ buf.Format(KText, iInvalidRegionCount);
+ BLOG_MESSAGE(buf);
+ }
+#endif
+ return iInvalidRegionCount;
+ }
+
+TInt CTRedrawTest::WaitForRedrawsToFinish(TRedrawCheckType aRedrawCheckType)
+ {
+ TInt error=KErrNone;
+#define EnableCheckInvalidRegions
+#if defined(EnableCheckInvalidRegions)
+ if(aRedrawCheckType == ECheckRedrawActiveObjectAndInvalidRegions)
+ {
+ TInt regions = 0;
+ TInt count = 0;
+ //We do not want to cycle round forever or too long, a limit of 10 has
+ //been added but this is arbitrary. If CTClient::WaitForRedrawsToFinish
+ //fails too many times then possibly something else us wrong.
+ do
+ {
+ count++;
+ error = TheClient->WaitForRedrawsToFinish();
+ if(error != KErrNone)
+ {
+ RDebug::Printf("CTRedrawTest::WaitForRedrawsToFinish, error %d", error);
+ }
+ regions = iInvalidRegionChecker->CheckInvalidRegions(TheClient->iGroup);
+ if(regions)
+ {
+ // Give the server a chance to do the redraws because
+ // the Animation Scheduler is an idle priority AO
+ const TUint KOneSecond = 1000000; // us
+ User::After(KOneSecond>>2); // 0.25s
+ }
+ } while (0 < regions && 10 < count);
+ }
+ else // ECheckRedrawActiveObjectOnly
+#endif // CheckInvalidRegions
+ {
+ error = TheClient->WaitForRedrawsToFinish();
+ }
+ return error;
+ }
+
+void CTRedrawTest::RunTestCaseL(TInt /*aCurTestCase*/)
+ {
+ _LIT(Redraw0,"Redraw1");
+ _LIT(Redraw1,"Redraw2");
+ _LIT(Redraw2,"GetInvalid");
+ _LIT(Redraw3,"MoveInvalid");
+ _LIT(Redraw4,"CheckOrder");
+ _LIT(Redraw5,"Defect 49554");
+ _LIT(Redraw6,"Check Ordinal Position");
+ _LIT(Redraw7,"Defect 99892");
+ _LIT(Redraw8,"Check MMS Defect 1");
+ _LIT(Redraw9,"Check MMS Defect 2");
+ _LIT(Redraw10,"Redraw inactive window");
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+
+ TInt testWindowDraws = -1; // to prevent RVCT 546-D warning
+ _LIT(KLog,"RunTestCase %d");
+ if (++iTest->iState<6)
+ LOG_MESSAGE2(KLog,iTest->iState);
+ switch(iTest->iState)
+ {
+/**
+@SYMTestCaseID GRAPHICS-WSERV-0265
+
+@SYMDEF DEF081259
+
+@SYMTestCaseDesc Test invalidation a test window and check it
+ redraws correctly
+
+@SYMTestPriority High
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Invalidate a test window causing it to redraw
+
+@SYMTestExpectedResults The test window redraws correctly
+*/
+ case 1:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0265"));
+ iTest->LogSubTest(Redraw0);
+ SetBackground(TRgb::Gray256(128));
+ iDrawRequestsFromTestWindow=iTestRedrawWin->DrawRequests();
+ InvalidateTestWins(TRect(10,10,50,50));
+ break;
+ case 2:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0265"));
+ TheClient->iWs.Finish();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+ testWindowDraws=iTestRedrawWin->DrawRequests();
+ if (iDrawRequestsFromTestWindow+1!=testWindowDraws)
+ {
+ LOG_MESSAGE3(_L("wrong number of test window draw requests %d %d"),
+ iDrawRequestsFromTestWindow,
+ testWindowDraws);
+ TEST(EFalse);
+ }
+ CheckRedrawWindows();
+ ++iWinContent;
+ iTestRedrawWin->Reset();
+ iBaseRedrawWin->Reset();
+ TheClient->Flush();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+ break;
+/**
+@SYMTestCaseID GRAPHICS-WSERV-0266
+
+@SYMDEF DEF081259
+
+@SYMTestCaseDesc Test invalidation a test window and check it
+ redraws correctly
+
+@SYMTestPriority High
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Invalidate a test window causing it to redraw
+
+@SYMTestExpectedResults The test window redraws correctly
+*/
+ case 3:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0266"));
+ iTest->LogSubTest(Redraw1);
+ InvalidateTestWins(TRect(1,1,150,20));
+ TheClient->iWs.Finish();
+ WaitForRedrawsToFinish(ECheckRedrawActiveObjectAndInvalidRegions);
+ break;
+ case 4:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0266"));
+ CheckRedrawWindows();
+ ++iWinContent;
+ iTestRedrawWin->Reset();
+ iBaseRedrawWin->Reset();
+ TheClient->iWs.Flush();
+ break;
+/**
+@SYMTestCaseID GRAPHICS-WSERV-0267
+
+@SYMDEF DEF081259
+
+@SYMTestCaseDesc Test invalidation a region of a test window and check it
+ redraws correctly
+
+@SYMTestPriority High
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Invalidate a region of a test window causing it to redraw
+
+@SYMTestExpectedResults The test window redraws correctly
+*/
+ case 5:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0267"));
+ iTest->LogSubTest(Redraw2);
+ GetInvalidRegionTestsL();
+ break;
+/**
+@SYMTestCaseID GRAPHICS-WSERV-0268
+
+@SYMDEF DEF081259
+
+@SYMTestCaseDesc Test moving an invalid region of a test window and check it
+ redraws correctly
+
+@SYMTestPriority High
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Move an invalid region of a test window causing it to redraw
+
+@SYMTestExpectedResults The test window redraws correctly
+*/
+ case 6:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0268"));
+ iTest->LogSubTest(Redraw3);
+ MoveInvalidAreaL();
+ break;
+
+/**
+@SYMTestCaseID GRAPHICS-WSERV-0270
+
+@SYMDEF DEF081259
+
+@SYMTestCaseDesc Test the order redraws occur in a test window
+
+@SYMTestPriority High
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Set up a number of redraws for a test window and
+ invalidate it
+
+@SYMTestExpectedResults The order the test window redraws occur is correct
+*/
+
+ case 7:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0270"));
+ iTest->LogSubTest(Redraw4);
+ CheckOrderL();
+ break;
+/**
+@SYMTestCaseID GRAPHICS-WSERV-0271
+
+@SYMDEF DEF081259
+
+@SYMTestCaseDesc Test defect INC049554L does not occur
+
+@SYMTestPriority High
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Check that defect INC049554L does not occur when a test
+ window is redrawn
+
+@SYMTestExpectedResults Defect INC049554L does not occur
+*/
+ case 8:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0271"));
+ iTest->LogSubTest(Redraw5);
+ CheckDefectINC049554L();
+ break;
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0359
+
+ @SYMDEF PDEF099892
+
+ @SYMTestCaseDesc Ensure that changing the Ordinal postion of an Invisible Window
+ does not affect the Transparent Window or Opaque Window redrawing.
+
+ @SYMTestPriority Medium
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create an Invisible Window
+ Create a Transparent Window
+ Inside the Begin and End Redraw for the Transparent Window,
+ change the Ordinal Position for Invisible Window to move it
+ front to the Transparent Window.
+
+ @SYMTestExpectedResults Changing the Ordinal postion for Invisible Window should not
+ affect the Transparent Window redrawing.
+*/
+ case 9:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0359"));
+ iTest->LogSubTest(Redraw6);
+ CheckOrdinalPositionDefectL();
+ break;
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0360
+
+ @SYMDEF PDEF099892
+
+ @SYMTestCaseDesc Ensure that changing the Ordinal postion of an Invisible window
+ does not affect the Transparent Window or Opaque Window redrawing.
+
+ @SYMTestPriority Medium
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create an Invisible Window
+ Create an Opaque Window
+ Create a Transparent Window
+ Invisible Window is Behind the Opaque Window
+ and Opaque Window is Behind the Transparent Window.
+ While drawing the Transparent Window, move the Invisible Window
+ to the Front of Opaque Window. And while Drawing the Opaque Window
+ move the Invisible Window again Behind the Opaque Window.
+
+ @SYMTestExpectedResults Changing the Ordinal postion for Invisible window should not
+ affect the Transparent Window or Opaque Window redrawing.
+*/
+ case 10:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0360"));
+ iTest->LogSubTest(Redraw7);
+ CheckDefectPDEF099892L();
+ break;
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0361
+
+ @SYMDEF DEF101548
+
+ @SYMTestCaseDesc Ensure that changing the Ordinal postion of an Invisible window
+ does not affect the Transparent Window redrawing.
+
+ @SYMTestPriority Low
+
+ @SYMTestStatus Implemented
+
+ @SYMTestActions Create an Invisible Window
+ Create an Opaque Window
+ Create a Blank Window
+ Create a Transparent Window
+ Invisible Window is Behind the Opaque Window
+ Opaque Window is Behind the Blank Window
+ and Blank Window is Behind the Transparent Window.
+ While drawing the Transparent Window, move the Invisible Window
+ to the Front/Back to one or all the Other Windows.
+ Also move the Blank Window Front/Back to the Transparent Window for other scenario.
+
+ @SYMTestExpectedResults Changing the Ordinal postion for Invisible window should not
+ affect the Transparent Window redrawing.
+*/
+ case 11:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0361"));
+ iTest->LogSubTest(Redraw8);
+ CheckMMSDefectL(EFalse);
+ case 12:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0361"));
+ iTest->LogSubTest(Redraw9);
+ CheckMMSDefectL(ETrue);// In this case we will move Blank Window Front/Back to the Transparent Window to Test Defect PDEF099892
+ break;
+ case 13:
+ iTest->LogSubTest(Redraw10);
+/**
+ @SYMTestCaseID GRAPHICS-WSERV-0362
+
+ @SYMDEF PDEF117784
+
+ @SYMTestCaseDesc Ensure that drawing request for non active window will not
+ impact following redrawings
+
+ @SYMTestPriority High
+
+ @SYMTestStatus Implemented
+
+
+ @SYMTestActions Create test window as in active
+ Create base window in active mode.
+
+ The test window is receiving a draw request before it activates,
+ doing an empty redraw,
+ Activate test window
+ Draw test window properly in response to the next redraw request.
+
+ @SYMTestExpectedResults The next redraw request will be received and it will be drawn correctly.
+*/
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0362"));
+ CheckDefectPDEF117784L();
+ break;
+ case 14:
+ ((CTRedrawTestStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+ ((CTRedrawTestStep*)iStep)->CloseTMSGraphicsStep();
+ TestComplete();
+ break;
+ default:
+ TEST(EFalse);
+ }
+ ((CTRedrawTestStep*)iStep)->RecordTestResultL();
+ }
+
+__WS_CONSTRUCT_STEP__(RedrawTest)