windowing/windowserver/tauto/TScreenModeScaling.cpp
changeset 0 5d03bc08d59c
equal deleted inserted replaced
-1:000000000000 0:5d03bc08d59c
       
     1 // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Test code for screen mode scaling CR
       
    15 // Test code for the Scaling part of Change Request PHAR-5SJGAM 
       
    16 // ("Enable screen mode positioning and scaling").
       
    17 // Tests screen scale being configurable for a screen mode -  
       
    18 // eg it is now possible to set in wsini.ini amount by which a screen 
       
    19 // mode's screen will be scaled when drawn on the physical screen. 
       
    20 // 
       
    21 //
       
    22 
       
    23 /**
       
    24  @file
       
    25  @test
       
    26  @internalComponent - Internal Symbian test code
       
    27 */
       
    28 
       
    29 #include "TScreenModeScaling.h"
       
    30 
       
    31 #define MY_TEST_BITMAP _L("Z:\\WSTEST\\MYTEST.MBM")
       
    32 
       
    33 LOCAL_D TSize FullScreenModeSize;
       
    34 LOCAL_D TInt Copy2ndHalfOfScreen;
       
    35 
       
    36 void ClearBitmap(CFbsBitmap* aBitMap)
       
    37 	{
       
    38 	// clear the content of bitmap before it is used for copying
       
    39 	CFbsBitmapDevice *device=CFbsBitmapDevice::NewL(aBitMap);
       
    40 	CleanupStack::PushL(device);
       
    41 	CFbsBitGc *gc=NULL;
       
    42 	User::LeaveIfError(device->CreateContext(gc));
       
    43 	CleanupStack::PushL(gc);
       
    44 	gc->Clear();
       
    45 	CleanupStack::PopAndDestroy(2,device);
       
    46 	}
       
    47 
       
    48 /*CBitMapWin*/
       
    49 
       
    50 void CBitMapWin::Draw()
       
    51 	{
       
    52 	iGc->BitBlt(TPoint(),&iBackup->Bitmap());
       
    53 	}
       
    54 
       
    55 /*CTestSpriteWin*/
       
    56 
       
    57 CTestSpriteWin::~CTestSpriteWin()
       
    58 	{
       
    59 	}
       
    60 
       
    61 void CTestSpriteWin::UpdateWin(TPoint aOrigin)
       
    62 	{
       
    63 	SetOrigin(aOrigin);
       
    64 	DrawNow();
       
    65 	}
       
    66 
       
    67 void CTestSpriteWin::Draw()
       
    68 	{
       
    69 	iGc->BitBlt(iOrigin,&iSpriteBitmap);
       
    70 	}
       
    71 
       
    72 /*CTScreenModeScaling*/
       
    73 
       
    74 CTScreenModeScaling::CTScreenModeScaling(CTestStep* aStep) : CTWsGraphicsBase(aStep)
       
    75 	{
       
    76 	}
       
    77 	
       
    78 CTScreenModeScaling::~CTScreenModeScaling()
       
    79 	{
       
    80 	delete iTestWin;
       
    81 	delete iBlankWin;
       
    82 	delete iBackedUpWin;
       
    83 	delete iTestChildWin;
       
    84 	delete iScreenBitmap;
       
    85 	delete iBitmapWin;
       
    86 	delete iCheckWin;
       
    87 	delete iTransWin;
       
    88 	delete iBackgroundWin;
       
    89 	delete iCheckBitmap;
       
    90 	delete iTransparencyBitmap;
       
    91 	delete iBackgroundBitmap;
       
    92 	delete iForegroundBitmap;
       
    93 	}
       
    94 
       
    95 void CTScreenModeScaling::ConstructL()
       
    96 	{
       
    97 	iDisplayMode=TheClient->iScreen->DisplayMode();
       
    98 	if (iDisplayMode<EColor256)
       
    99 		iDisplayMode=EColor256;
       
   100 	User::LeaveIfError(iSpriteBitmap.Load(MY_TEST_BITMAP,0));
       
   101 
       
   102 	TheClient->iScreen->SetAppScreenMode(TheClient->iScreenModes[0]);
       
   103 	FullScreenModeSize=TheClient->iScreen->SizeInPixels();
       
   104 	iBlankWin=new(ELeave) CTBlankWindow();
       
   105 	iBlankWin->ConstructL(*TheClient->iGroup);
       
   106 	User::LeaveIfError(iBlankWin->BaseWin()->SetRequiredDisplayMode(EColor256));
       
   107 	iBlankWin->SetExt(TPoint(),FullScreenModeSize);
       
   108 	iBlankWin->Activate();
       
   109 
       
   110 	iTestWin=new(ELeave) CBasicWin;
       
   111 	iTestWin->ConstructExtLD(*TheClient->iGroup,TPoint(),FullScreenModeSize);
       
   112 	User::LeaveIfError(iTestWin->BaseWin()->SetRequiredDisplayMode(EColor256));
       
   113 	iTestWin->AssignGC(*TheClient->iGc);
       
   114 	iTestWin->SetVisible(EFalse);
       
   115 	iTestWin->Activate();
       
   116 	iTestWin->BaseWin()->SetShadowDisabled(ETrue);
       
   117 	iTestWin->BaseWin()->SetShadowHeight(0);
       
   118 
       
   119 	iBackedUpWin=new(ELeave) CTBackedUpWin(iDisplayMode);
       
   120 	iBackedUpWin->ConstructExtLD(*iTestWin,TPoint(),FullScreenModeSize);
       
   121 	iBackedUpWin->SetVisible(EFalse);
       
   122 	iBackedUpWin->Activate();
       
   123 
       
   124 	iTestChildWin=new(ELeave) CTBlankWindow();
       
   125 	iTestChildWin->ConstructL(*iTestWin);
       
   126 	User::LeaveIfError(iTestChildWin->BaseWin()->SetRequiredDisplayMode(EColor256));
       
   127 	iTestChildWin->BaseWin()->SetShadowDisabled(ETrue);
       
   128 	iTestChildWin->SetColor(KRgbGreen);
       
   129 	iTestChildWin->BaseWin()->SetVisible(EFalse);
       
   130 	iTestChildWin->Activate();
       
   131 
       
   132 	iScreenBitmap=new(ELeave) CFbsBitmap();
       
   133 	User::LeaveIfError(iScreenBitmap->Create(TSize(FullScreenModeSize.iWidth/2,FullScreenModeSize.iHeight),iDisplayMode));
       
   134 
       
   135 	iBitmapWin=new(ELeave) CBmpWin(*iScreenBitmap);
       
   136 	iBitmapWin->ConstructExtLD(*TheClient->iGroup,TPoint(),iScreenBitmap->SizeInPixels());
       
   137 	User::LeaveIfError(iBitmapWin->BaseWin()->SetRequiredDisplayMode(EColor256));
       
   138 	iBitmapWin->AssignGC(*TheClient->iGc);
       
   139 	iBitmapWin->Activate();
       
   140 	iBitmapWin->SetVisible(EFalse);
       
   141 	iBitmapWin->BaseWin()->SetShadowDisabled(ETrue);
       
   142 	iBitmapWin->BaseWin()->SetShadowHeight(0);
       
   143 
       
   144 	//.. Create all the bitmaps and transparent windows
       
   145 	iWinSize.SetSize(20,20);
       
   146 	iTransparencyBitmap=CBitmap::NewL(iWinSize,EGray256);
       
   147 	iBackgroundBitmap=CBitmap::NewL(iWinSize,iDisplayMode);
       
   148 	iForegroundBitmap=CBitmap::NewL(iWinSize,iDisplayMode);
       
   149 
       
   150 	CBitMapWin* backgroundWin=new(ELeave) CBitMapWin(iBackgroundBitmap);
       
   151 	backgroundWin->ConstructExtLD(*TheClient->iGroup,TPoint(),iWinSize);
       
   152 	iBackgroundWin=backgroundWin;
       
   153 	User::LeaveIfError(iBackgroundWin->BaseWin()->SetRequiredDisplayMode(EColor256));
       
   154 	iBackgroundWin->SetVisible(EFalse);
       
   155 	iBackgroundWin->BaseWin()->SetShadowDisabled(ETrue);
       
   156 	iBackgroundWin->BaseWin()->SetShadowHeight(0);
       
   157 	iBackgroundWin->AssignGC(*TheClient->iGc);
       
   158 	iBackgroundWin->Activate();
       
   159 
       
   160 	CBitMapWin* transWin=new(ELeave) CBitMapWin(iForegroundBitmap);
       
   161 	transWin->ConstructExtLD(*TheClient->iGroup,TPoint(),iWinSize);
       
   162 	iTransWin=transWin;
       
   163 	RWindowBase& transWinB=*iTransWin->BaseWin();
       
   164 	User::LeaveIfError(transWinB.SetRequiredDisplayMode(EColor256));
       
   165 	transWinB.SetShadowDisabled(ETrue);
       
   166 	transWinB.SetShadowHeight(0);
       
   167 	iTransWin->SetVisible(EFalse);
       
   168 	iTransWin->AssignGC(*TheClient->iGc);
       
   169 	iTransWin->Win()->SetTransparencyBitmap(iTransparencyBitmap->Bitmap());
       
   170 	iTransWin->Activate();
       
   171 
       
   172 	CTBackedUpWin* checkWin=new(ELeave) CTBackedUpWin(iDisplayMode);
       
   173 	checkWin->ConstructExtLD(*TheClient->iGroup,TPoint(iWinSize.iWidth+1,0),iWinSize);
       
   174 	iCheckWin=checkWin;
       
   175 	RBackedUpWindow& win=*iCheckWin->BackedUpWin();
       
   176 	win.SetShadowHeight(0);
       
   177 	iCheckWin->Activate();
       
   178 	win.MaintainBackup();
       
   179 	iCheckBitmap=CBitmap::NewL(win.BitmapHandle());
       
   180 	iCheckWin->BaseWin()->SetShadowDisabled(ETrue);
       
   181 	iCheckWin->BaseWin()->SetShadowHeight(0);
       
   182 	iCheckWin->BaseWin()->SetVisible(EFalse);
       
   183 	TheClient->Flush();
       
   184 	TheClient->WaitForRedrawsToFinish();
       
   185 	}
       
   186 
       
   187 void CTScreenModeScaling::TestTopClientWindowPositionAPIs(TPoint aPos,RWindowBase* aWin)
       
   188 	{
       
   189 	TEST(aWin->AbsPosition()==aPos);
       
   190 	TEST(aWin->Position()==aPos);
       
   191 	TEST(aWin->InquireOffset(*TheClient->iGroup->GroupWin())==aPos);
       
   192 	}
       
   193 
       
   194 void CTScreenModeScaling::TestChildWindowPositionAPIs(TPoint aPos,TPoint aParentPos,RWindowBase* aWin,RWindowBase* aParentWin)
       
   195 	{
       
   196 	TEST(aWin->AbsPosition()==aParentPos+aPos);
       
   197 	TEST(aWin->Position()==aPos);
       
   198 	TEST(aWin->InquireOffset(*TheClient->iGroup->GroupWin())==aParentPos+aPos);
       
   199 	TEST(aWin->InquireOffset(*aParentWin)==aPos);
       
   200 	}
       
   201 
       
   202 void CTScreenModeScaling::TestRect()
       
   203 	{
       
   204 	// Here if the width or height of the screen cannot be divided by 2 
       
   205 	// then make both the rect size same by reducing the first or second which ever is smaller
       
   206 	// and make sure that top left corner is not disturbed.
       
   207 	TRect rect1=TRect(PhysicalToLogical(TPoint()-iCurrentScreenModeOrigin,iCurrentScreenModeScale),
       
   208 					  PhysicalToLogical(TPoint(FullScreenModeSize.iWidth/2,FullScreenModeSize.iHeight)-iCurrentScreenModeOrigin,
       
   209 										iCurrentScreenModeScale)
       
   210 					  );
       
   211 	TRect rect2=TRect(PhysicalToLogical(TPoint(FullScreenModeSize.iWidth/2,0)-iCurrentScreenModeOrigin,
       
   212 										iCurrentScreenModeScale),
       
   213 					  PhysicalToLogical(FullScreenModeSize.AsPoint()-iCurrentScreenModeOrigin,
       
   214 										iCurrentScreenModeScale)
       
   215 					  );
       
   216 	if ((Abs(rect1.iBr.iX-rect1.iTl.iX)>Abs(rect2.iBr.iX-rect2.iTl.iX)) || (Abs(rect1.iBr.iY-rect1.iTl.iY)>Abs(rect2.iBr.iY-rect2.iTl.iY)))
       
   217 		{
       
   218 		rect1.SetRect(rect1.iTl,rect2.Size());
       
   219 		}
       
   220 	if ((Abs(rect1.iBr.iX-rect1.iTl.iX)<Abs(rect2.iBr.iX-rect2.iTl.iX)) || (Abs(rect1.iBr.iY-rect1.iTl.iY)<Abs(rect2.iBr.iY-rect2.iTl.iY)))
       
   221 		{
       
   222 		rect2.SetRect(rect2.iTl,rect1.Size());
       
   223 		}
       
   224 	TBool retVal = TheClient->iScreen->RectCompare(rect1,rect2);
       
   225 	TEST(retVal);
       
   226 	if (!retVal)
       
   227 		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare(rect1,rect2) return value  - Expected: %d, Actual: %d"), ETrue, retVal);		
       
   228 	}
       
   229 
       
   230 void CTScreenModeScaling::CompareRegionsL(const TRegion &aRegion1,const TRegion &aRegion2)
       
   231 	{
       
   232 	RRegion tmp;
       
   233 	tmp.Copy(aRegion1);
       
   234 	tmp.SubRegion(aRegion2);
       
   235 	if (tmp.CheckError())
       
   236 		User::Leave(KErrNoMemory);	
       
   237 	TBool retVal = tmp.IsEmpty();
       
   238 	TEST(retVal);
       
   239 	if (!retVal)
       
   240 		INFO_PRINTF3(_L("RRegion1.IsEmpty() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		
       
   241 	tmp.Copy(aRegion2);
       
   242 	tmp.SubRegion(aRegion1);
       
   243 	if (tmp.CheckError())
       
   244 		User::Leave(KErrNoMemory);
       
   245 	retVal = tmp.IsEmpty();
       
   246 	TEST(retVal);
       
   247 	if (!retVal)
       
   248 		INFO_PRINTF3(_L("RRegion2.IsEmpty() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		
       
   249 
       
   250 	tmp.Close();
       
   251 	}
       
   252 
       
   253 void CTScreenModeScaling::SetUpSpriteLC(RWsSprite &aSprite, RWsSession &aSession, RWindowTreeNode &aWindow,TInt aFlags)
       
   254 	{
       
   255 	aSprite=RWsSprite(aSession);
       
   256 	User::LeaveIfError(aSprite.Construct(aWindow,TPoint(),aFlags));
       
   257 	CleanupClosePushL(aSprite);
       
   258 	TSpriteMember member;
       
   259 	iTest->SetUpMember(member);
       
   260 	member.iBitmap=&iSpriteBitmap;
       
   261 	User::LeaveIfError(aSprite.AppendMember(member));
       
   262 	User::LeaveIfError(aSprite.Activate());
       
   263 	}
       
   264 
       
   265 void CTScreenModeScaling::TestGetInvalidRegionL(TRect& aRect)
       
   266 	{
       
   267 	RRegion testRegion;
       
   268 	RRegion invalid;
       
   269 	iTestWin->Invalidate(aRect);
       
   270 	testRegion.AddRect(aRect);
       
   271 	iTestWin->Win()->GetInvalidRegion(invalid);
       
   272 	CleanupClosePushL(testRegion);
       
   273 	CleanupClosePushL(invalid);
       
   274 	CompareRegionsL(testRegion, invalid);
       
   275 	CleanupStack::PopAndDestroy(2, &testRegion);
       
   276 	TheClient->WaitForRedrawsToFinish();
       
   277 	}
       
   278 
       
   279 void CTScreenModeScaling::CopyAndCompareL()
       
   280 	{
       
   281 	TInt oldOrdinalPriority = TheClient->iGroup->GroupWin()->OrdinalPriority();
       
   282 	TInt oldOrdinalPosition = TheClient->iGroup->GroupWin()->OrdinalPosition();
       
   283 	// the following line makes sure that a console object hidden outside of
       
   284 	// screens range doesn't affect test results ocerlapping the bitmap window
       
   285 	TheClient->iGroup->GroupWin()->SetOrdinalPosition(0, 65535); 
       
   286 
       
   287 	// clear the content of bitmap before it is used for copying
       
   288 	ClearBitmap(iScreenBitmap);	
       
   289 
       
   290 	// Copy first half or second half of the screen to a bitmap then paste it to second or first half of the screen
       
   291 	TRect testWinRect(PhysicalToLogical(TPoint((Copy2ndHalfOfScreen ? FullScreenModeSize.iWidth/2 : 0),0)-iCurrentScreenModeOrigin,iCurrentScreenModeScale),
       
   292 					  PhysicalToLogical(TPoint((Copy2ndHalfOfScreen ? FullScreenModeSize.iWidth : FullScreenModeSize.iWidth/2),FullScreenModeSize.iHeight)-iCurrentScreenModeOrigin,iCurrentScreenModeScale)
       
   293 					  );
       
   294 	TheClient->iScreen->CopyScreenToBitmap(iScreenBitmap,testWinRect);
       
   295 	iBitmapWin->SetExt(PhysicalToLogical(TPoint((Copy2ndHalfOfScreen ? 0 : FullScreenModeSize.iWidth/2),0)-iCurrentScreenModeOrigin,iCurrentScreenModeScale),testWinRect.Size());
       
   296 	iBitmapWin->SetVisible(ETrue);
       
   297 	iBitmapWin->DrawNow();
       
   298 	TheClient->Flush();
       
   299 	TestRect();
       
   300 	iBitmapWin->SetVisible(EFalse);
       
   301 	iTestWin->SetVisible(EFalse);
       
   302 	TheClient->Flush();
       
   303 
       
   304 	TheClient->iGroup->GroupWin()->SetOrdinalPosition(oldOrdinalPosition, oldOrdinalPriority); 
       
   305 	}
       
   306 
       
   307 /**
       
   308 @SYMTestCaseID		GRAPHICS-WSERV-0093
       
   309 
       
   310 @SYMDEF             DEF081259, DEF111847
       
   311 
       
   312 @SYMTestCaseDesc    Window tests
       
   313 					REQUIREMENT: PREQ673 (Screen Scaling)
       
   314 					API: RWindowBase::InquireOffset(), RWindowBase::AbsPosition(),RWindowBase::Position()
       
   315 
       
   316 @SYMTestPriority    High
       
   317 
       
   318 @SYMTestStatus      Implemented
       
   319 
       
   320 @SYMTestActions     Loops through all the screen modes present in the wsini file, and then moves to the test screen
       
   321 	mode where it goes on changing the screen scale and origin. In each of the wsini screen modes and test
       
   322 	screen modes, it checks the test window's API's RWindowBase::InquireOffset(), RWindowBase::AbsPosition()
       
   323 	RWindowBase::Position(). Then it copies the content from either first or second half to second or first
       
   324 	half and compares both the regions so that its content are same.
       
   325 	Additionally, as part of defect fix DEF111847, this also loops through all the display modes, and if possible
       
   326 	tests each with the above described method. Previously, it use to only test Color256.
       
   327 
       
   328 @SYMTestExpectedResults The content of both halves of the screen should match.
       
   329 */		
       
   330 void CTScreenModeScaling::WindowTestsL()
       
   331 	{
       
   332 	INFO_PRINTF1(_L("AUTO  WindowTests : "));
       
   333 	
       
   334 	TDisplayMode curDispMode; // Holds the current display mode being tested 
       
   335 	
       
   336 	for(curDispMode = EGray2; curDispMode < EColorLast; curDispMode = TDisplayMode(curDispMode+1))
       
   337 		{
       
   338 		if (curDispMode == ERgb)
       
   339 			{
       
   340 			continue;
       
   341 			}
       
   342 		CTClient* client=new(ELeave) CTClient();
       
   343 		CleanupStack::PushL(client);
       
   344 		client->SetScreenNumber(iTest->iScreenNumber);
       
   345 		client->ConstructL();
       
   346 		client->iGroup=new(ELeave) TestWindowGroup(client);
       
   347 		client->iGroup->ConstructL();
       
   348 		client->iGroup->WinTreeNode()->SetOrdinalPosition(1);
       
   349 		RBlankWindow testWindow(client->iWs);
       
   350 		User::LeaveIfError(testWindow.Construct(*TheClient->iGroup->GroupWin(),ENullWsHandle));
       
   351 		CleanupClosePushL(testWindow);
       
   352 	
       
   353 		TInt setDispMode; // Holds the actual display mode that was set
       
   354 		setDispMode = testWindow.SetRequiredDisplayMode(curDispMode);
       
   355 		
       
   356 		//Only do the tests if the requested mode was actually set
       
   357 		if(curDispMode == setDispMode)
       
   358 			{
       
   359 			//Create and show DisplayMode details message
       
   360 			_LIT(KModeDetails, "Display Mode: ");
       
   361 			TBuf<30> modeDetailsMessage(KModeDetails);
       
   362 			modeDetailsMessage.Append(DisplayModeAsString(curDispMode));
       
   363 			LOG_MESSAGE(modeDetailsMessage);
       
   364 			
       
   365 			testWindow.Activate();
       
   366 			TheClient->iGroup->GroupWin()->EnableScreenChangeEvents();
       
   367 			TInt numOfModes=TheClient->iScreenModes.Count();
       
   368 			TInt ii;
       
   369 			for (ii=0; ii<numOfModes; ++ii)
       
   370 				{
       
   371 				INFO_PRINTF1(_L(" Start of Loop"));
       
   372 				iCurrentMode=TheClient->iScreenModes[ii];
       
   373 				TPixelsAndRotation pixelsAndRotation;
       
   374 				iCurrentScreenModeOrigin=TheClient->iScreen->GetScreenModeOrigin(iCurrentMode);
       
   375 				iCurrentScreenModeScale=TheClient->iScreen->GetScreenModeScale(iCurrentMode);
       
   376 				TheClient->iScreen->GetScreenModeSizeAndRotation(iCurrentMode,pixelsAndRotation);
       
   377 				if (pixelsAndRotation.iRotation==CFbsBitGc::EGraphicsOrientationNormal)
       
   378 					{
       
   379 					INFO_PRINTF1(_L(" Do Tests"));
       
   380 					TRAPD(ret,DoWindowTestsL());
       
   381 					TEST(ret==KErrNone);
       
   382 					if (ret!=KErrNone)
       
   383 						{
       
   384 						INFO_PRINTF3(_L("DoWindowTestsL() return value  - Expected: %d, Actual: %d"), KErrNone, ret);		
       
   385 						}
       
   386 
       
   387 					INFO_PRINTF1(_L(" Window Trees"));
       
   388 					client->iScreen->SetAppScreenMode(iCurrentMode);
       
   389 					client->Flush();
       
   390 					}
       
   391 				}
       
   392 				TestDifferentScales(numOfModes-1);
       
   393 			}
       
   394 		CleanupStack::PopAndDestroy(2,client);
       
   395 		}
       
   396 	}
       
   397 
       
   398 void CTScreenModeScaling::TestDifferentScales(TInt aLastModeIdx)
       
   399 	{
       
   400 	if (aLastModeIdx<0) return;
       
   401 	TPixelsAndRotation pixelsAndRotation;
       
   402 	for (TInt modeCount=aLastModeIdx;modeCount>=0;--modeCount)
       
   403 		{
       
   404 		TheClient->iScreen->GetScreenModeSizeAndRotation(TheClient->iScreenModes[modeCount],pixelsAndRotation);
       
   405 		if (pixelsAndRotation.iRotation==CFbsBitGc::EGraphicsOrientationNormal)
       
   406 			break;
       
   407 		}
       
   408 	iCurrentMode=TheClient->iScreenModes[aLastModeIdx];
       
   409 	TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   410 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   411 	TSizeMode storeModeData=TheClient->iScreen->GetCurrentScreenModeAttributes();
       
   412 	TSizeMode testMode=storeModeData;
       
   413 	for (TInt xScale=1;xScale<4;++xScale)
       
   414 		{
       
   415 		for (TInt yScale=1;yScale<4;++yScale)
       
   416 			{
       
   417 			testMode.iScreenScale=TSize(xScale,yScale);
       
   418 			TestDifferentOrigin(testMode,TPoint(20,20));
       
   419 			TestDifferentOrigin(testMode,TPoint(20,30));
       
   420 			TestDifferentOrigin(testMode,TPoint(30,20));
       
   421 			TestDifferentOrigin(testMode,TPoint(FullScreenModeSize.iWidth/2+640/FullScreenModeSize.iWidth*10,60));
       
   422 			}
       
   423 		}
       
   424 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   425 	TheClient->iScreen->SetCurrentScreenModeAttributes(storeModeData);
       
   426 	TInt defaultMode=TheClient->iScreenModes[0];
       
   427 	TheClient->iScreen->SetAppScreenMode(defaultMode);
       
   428 	TheClient->iScreen->SetScreenMode(defaultMode);
       
   429 	}
       
   430 
       
   431 void CTScreenModeScaling::TestDifferentOrigin(TSizeMode &aMode,TPoint aOrigin)
       
   432 	{
       
   433 	TheClient->iScreen->SetScreenMode(iCurrentMode);//.. this is required because at the end of next screenmode test it will be set to zero screen mode
       
   434 	aMode.iOrigin=aOrigin;
       
   435 	TheClient->iScreen->SetCurrentScreenModeAttributes(aMode);
       
   436 	TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   437 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   438 	iCurrentScreenModeOrigin=TheClient->iScreen->GetScreenModeOrigin(iCurrentMode);
       
   439 	iCurrentScreenModeScale=TheClient->iScreen->GetScreenModeScale(iCurrentMode);
       
   440 	TRAPD(ret,DoWindowTestsL());
       
   441 	TEST(ret==KErrNone);
       
   442 	if (ret!=KErrNone)
       
   443 		INFO_PRINTF3(_L("DoWindowTestsL() return value  - Expected: %d, Actual: %d"), KErrNone, ret);		
       
   444 	}
       
   445 
       
   446 void CTScreenModeScaling::DoWindowTestsL()
       
   447 	{
       
   448 	TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   449 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   450 	Copy2ndHalfOfScreen=(iCurrentScreenModeOrigin.iX>FullScreenModeSize.iWidth/2? 1 : 0);
       
   451 	TRect testWinRect(PhysicalToLogical(TPoint(),iCurrentScreenModeScale),
       
   452 					  PhysicalToLogical(TPoint((Copy2ndHalfOfScreen ? FullScreenModeSize.iWidth 
       
   453 																	: FullScreenModeSize.iWidth/2),
       
   454 											   FullScreenModeSize.iHeight)-iCurrentScreenModeOrigin,iCurrentScreenModeScale) 
       
   455 					  );
       
   456 	testWinRect.Shrink(10,10);
       
   457 	iTestWinSize=testWinRect.Size();
       
   458 	PositionTestL(testWinRect.iTl);
       
   459 	testWinRect.Shrink(10,10);
       
   460 	iTestWinSize=testWinRect.Size();
       
   461 	PositionTestL(testWinRect.iTl);
       
   462 	BackedUpChildWindowTestL(testWinRect.iTl);
       
   463 	GetInvalidRegionTestL(testWinRect.iTl);
       
   464 	//NextScreenModeTestL(testWinRect.iTl);		//This test needs a lot more work ###
       
   465 	}
       
   466 
       
   467 void CTScreenModeScaling::PositionTestL(TPoint aPostion)
       
   468 	{
       
   469 	iTestWin->SetExt(aPostion,iTestWinSize);
       
   470 	iTestWin->SetVisible(ETrue);
       
   471 	iTestWin->Invalidate();
       
   472 	TheClient->Flush();
       
   473 	TheClient->WaitForRedrawsToFinish();
       
   474 	TestTopClientWindowPositionAPIs(aPostion,iTestWin->BaseWin());
       
   475 	CopyAndCompareL();
       
   476 	}
       
   477 
       
   478 void CTScreenModeScaling::BackedUpChildWindowTestL(TPoint aPostion)
       
   479 	{
       
   480 	iTestWin->SetVisible(ETrue);
       
   481 	TPoint backedUpWinPt=TPoint(iTestWinSize.iWidth/3,iTestWinSize.iHeight/4);
       
   482 	iBackedUpWin->SetExtL(backedUpWinPt,TSize(iTestWinSize.iWidth/6,iTestWinSize.iHeight/6));
       
   483 	iBackedUpWin->SetVisible(ETrue);
       
   484 	TestChildWindowPositionAPIs(backedUpWinPt,aPostion,iBackedUpWin->BaseWin(),iTestWin->BaseWin());
       
   485 	aPostion+=TPoint(10,10);
       
   486 	iTestWin->SetPos(aPostion);
       
   487 	TestTopClientWindowPositionAPIs(aPostion,iTestWin->BaseWin());
       
   488 	TestChildWindowPositionAPIs(backedUpWinPt,aPostion,iBackedUpWin->BaseWin(),iTestWin->BaseWin());
       
   489 	iTestWin->Invalidate();
       
   490 	TheClient->Flush();
       
   491 	TheClient->WaitForRedrawsToFinish();
       
   492 	TestTopClientWindowPositionAPIs(aPostion,iTestWin->BaseWin());
       
   493 	TestChildWindowPositionAPIs(backedUpWinPt,aPostion,iBackedUpWin->BaseWin(),iTestWin->BaseWin());
       
   494 	CopyAndCompareL();
       
   495 	iBackedUpWin->SetVisible(EFalse);
       
   496 	}
       
   497 
       
   498 void CTScreenModeScaling::NextScreenModeTestL(TPoint aPos)
       
   499 	{
       
   500 	TInt numOfModes=TheClient->iScreenModes.Count();
       
   501 	TInt defaultMode=TheClient->iScreenModes[0];
       
   502 	TInt lastMode=TheClient->iScreenModes[numOfModes-1];
       
   503 	TInt mode=(iCurrentMode<lastMode? iCurrentMode:defaultMode);
       
   504 	// find current mode index
       
   505 	TInt ii;
       
   506 	TInt modeIdx=0;
       
   507 	for (ii=0; ii<numOfModes; ++ii)
       
   508 		{
       
   509 		if (mode==TheClient->iScreenModes[ii])
       
   510 			{
       
   511 			modeIdx=ii;
       
   512 			break;
       
   513 			}
       
   514 		}
       
   515 	TPoint screenModeOrigin(0,0);
       
   516 	TPixelsAndRotation pixelsAndRotation;
       
   517 	while (screenModeOrigin==TPoint()||(pixelsAndRotation.iRotation!=CFbsBitGc::EGraphicsOrientationNormal))
       
   518 		{
       
   519 		mode=(mode==lastMode? defaultMode : TheClient->iScreenModes[++modeIdx]);
       
   520 		if (mode==iCurrentMode)
       
   521 			{
       
   522 			return;
       
   523 			}
       
   524 		screenModeOrigin=TheClient->iScreen->GetScreenModeOrigin(mode);
       
   525 		TheClient->iScreen->GetScreenModeSizeAndRotation(mode,pixelsAndRotation);
       
   526 		}
       
   527 	iTestWin->SetExt(aPos,iTestWinSize);
       
   528 	iTestWin->SetVisible(ETrue);
       
   529 	TheClient->Flush();
       
   530 	CBasicWin* basicWin=new(ELeave) CBasicWin;
       
   531 	CleanupStack::PushL(basicWin);
       
   532 	basicWin->ConstructExtLD(*iTestWin,TPoint(),TSize(iTestWinSize.iWidth/5,iTestWinSize.iHeight/5));
       
   533 	User::LeaveIfError(basicWin->BaseWin()->SetRequiredDisplayMode(EColor256));
       
   534 	basicWin->AssignGC(*TheClient->iGc);
       
   535 	basicWin->BaseWin()->SetShadowDisabled(ETrue);
       
   536 	basicWin->BaseWin()->SetShadowHeight(0);
       
   537 	basicWin->Activate();
       
   538 	TPoint pos(iTestWinSize.iWidth/3,iTestWinSize.iWidth/4);
       
   539 	basicWin->SetPos(pos);
       
   540 	TheClient->Flush();
       
   541 	TheClient->WaitForRedrawsToFinish();
       
   542 	TestChildWindowPositionAPIs(pos,aPos,basicWin->BaseWin(),iTestWin->BaseWin());
       
   543 	iCurrentScreenModeScale=TheClient->iScreen->GetScreenModeScale(mode);
       
   544 	iCurrentScreenModeOrigin=TheClient->iScreen->GetScreenModeOrigin(mode);
       
   545 	Copy2ndHalfOfScreen=(iCurrentScreenModeOrigin.iX>FullScreenModeSize.iWidth/2? 1 : 0);
       
   546 	TheClient->iScreen->SetAppScreenMode(mode);
       
   547 	TheClient->iScreen->SetScreenMode(mode);
       
   548 	iTestWin->SetVisible(ETrue);
       
   549 	CopyAndCompareL();
       
   550 	TheClient->iScreen->SetAppScreenMode(defaultMode);
       
   551 	TheClient->iScreen->SetScreenMode(defaultMode);
       
   552 	CleanupStack::PopAndDestroy(basicWin);
       
   553 	}
       
   554 
       
   555 void CTScreenModeScaling::GetInvalidRegionTestL(TPoint aPos)
       
   556 	{
       
   557 	iTestWin->SetExt(aPos,iTestWinSize);
       
   558 	iTestWin->SetVisible(ETrue);
       
   559 	iTestChildWin->SetExt(TPoint(iTestWinSize.iWidth>>2,iTestWinSize.iHeight>>2),TSize(iTestWinSize.iWidth>>1,iTestWinSize.iHeight>>1));
       
   560 	iTestChildWin->SetVisible(ETrue);
       
   561 	TheClient->Flush(); // ensure testchildwin is on-screen
       
   562 
       
   563 	CArrayFixFlat<TRect> *rectList=new(ELeave) CArrayFixFlat<TRect>(3);
       
   564 	CleanupStack::PushL(rectList);
       
   565 	rectList->AppendL(TRect(1,1,5,2));
       
   566 	rectList->AppendL(TRect(iTest->StdTestWindowSize().iWidth>>1,iTest->StdTestWindowSize().iHeight>>1,iTest->StdTestWindowSize().iWidth,iTest->StdTestWindowSize().iHeight));
       
   567 	rectList->AppendL(TRect(2,0,4,5));
       
   568 	
       
   569 	// set iTestWin to a 'clean state' before invalidating rects in the window
       
   570 	iTestWin->DrawNow();
       
   571 	TheClient->Flush();
       
   572 
       
   573 	// invalidate the various rectangles in iTestWin & then initiate a redraw of the window
       
   574 	RRegion invalidRegion;
       
   575 	RRegion region;
       
   576 	for (TInt index=0;index<rectList->Count();index++)
       
   577 		{
       
   578 		const TRect& myRect = (*rectList)[index];
       
   579 		iTestWin->Invalidate(myRect);
       
   580 		region.AddRect(myRect);
       
   581 		}
       
   582 	CleanupStack::PopAndDestroy(rectList);
       
   583 	CleanupClosePushL(invalidRegion);
       
   584 	CleanupClosePushL(region);
       
   585 	iTestWin->Win()->GetInvalidRegion(invalidRegion);
       
   586 	CompareRegionsL(region, invalidRegion);
       
   587 	CleanupStack::PopAndDestroy(2,&invalidRegion);
       
   588 	iTestChildWin->SetVisible(EFalse);
       
   589 
       
   590 	// ensure the test child win is removed
       
   591 	TheClient->Flush();
       
   592 	TheClient->WaitForRedrawsToFinish();
       
   593 
       
   594 	TRect rect1(iTestWinSize);
       
   595 	TestGetInvalidRegionL(rect1);
       
   596 	TInt width=iTestWinSize.iWidth;
       
   597 	TInt height=iTestWinSize.iHeight;
       
   598 	TRect rect2(TPoint(width/6,height/6),TSize(width/3,height/3));
       
   599 	TestGetInvalidRegionL(rect2);
       
   600 	
       
   601 	// invalidate the entire test window
       
   602 	iTestWin->Invalidate();
       
   603 	TheClient->Flush();
       
   604 
       
   605 	iTestWin->SetPos(TPoint(15,15));
       
   606 	iTestWin->SetPos(TPoint());
       
   607 	iTestWin->SetPos(TPoint(-15,-15));
       
   608 	iTestWin->SetPos(aPos);	
       
   609 	RRegion invalid;
       
   610 	RRegion testRegion(rect1);
       
   611 	CleanupClosePushL(invalid);
       
   612 	CleanupClosePushL(testRegion);
       
   613 	iTestWin->Win()->GetInvalidRegion(invalid);
       
   614 	TBool retVal = !invalid.CheckError();
       
   615 	TEST(retVal);
       
   616 	if (!retVal)
       
   617 		INFO_PRINTF3(_L("RRegion.CheckError() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		
       
   618 	TEST(invalid.BoundingRect().iBr.iX<=iTestWinSize.iWidth);
       
   619 	if (invalid.BoundingRect().iBr.iX>iTestWinSize.iWidth)
       
   620 		INFO_PRINTF3(_L("invalid.BoundingRect().iBr.iX<=iTestWinSize.iWidth  - Expected: %d, Actual: %d"), invalid.BoundingRect().iBr.iX, iTestWinSize.iWidth);		
       
   621 	CompareRegionsL(testRegion,invalid);
       
   622 	CleanupStack::PopAndDestroy(2,&invalid);
       
   623 
       
   624 	// redraw the test window & confirm
       
   625 	iTestWin->DrawNow();
       
   626 	TheClient->Flush();
       
   627 	CopyAndCompareL();
       
   628 	}
       
   629 
       
   630 /**
       
   631 @SYMTestCaseID		GRAPHICS-WSERV-0094
       
   632 
       
   633 @SYMDEF             DEF081259
       
   634 
       
   635 @SYMTestCaseDesc    SpriteTestL
       
   636 					REQUIREMENT: PREQ673 (Screen Scaling)
       
   637 					API: RWsSprite::SetPosition()
       
   638 
       
   639 @SYMTestPriority    High
       
   640 
       
   641 @SYMTestStatus      Implemented
       
   642 
       
   643 @SYMTestActions     In the same way as in window tests it shifts the screen modes.
       
   644 					In each screen modes it creates a sprite window and then it moves slightly
       
   645 					either side or bottom of the sprite, then it compares both the regions
       
   646 					to check whether content are same.
       
   647 
       
   648 @SYMTestExpectedResults The content of both halves of the screen should match.
       
   649 */		
       
   650 void CTScreenModeScaling::SpriteTestL()
       
   651 	{
       
   652 	CTClient* client=new(ELeave) CTClient();
       
   653 	CleanupStack::PushL(client);
       
   654 	client->SetScreenNumber(iTest->iScreenNumber);
       
   655 	client->ConstructL();
       
   656 	client->iGroup=new(ELeave) TestWindowGroup(client);
       
   657 	client->iGroup->ConstructL();
       
   658 	client->iGroup->WinTreeNode()->SetOrdinalPosition(1);
       
   659 	RBlankWindow color256(client->iWs);
       
   660 	User::LeaveIfError(color256.Construct(*TheClient->iGroup->GroupWin(),ENullWsHandle));
       
   661 	CleanupClosePushL(color256);
       
   662 	color256.SetRequiredDisplayMode(EColor256);
       
   663 	color256.Activate();
       
   664 	TInt numOfModes=TheClient->iScreenModes.Count();
       
   665 	TInt flushState=TheClient->iWs.SetAutoFlush(ETrue);
       
   666 	TInt ii;
       
   667 	for (ii=0; ii<numOfModes; ++ii)
       
   668 		{
       
   669 		iCurrentMode=TheClient->iScreenModes[ii];
       
   670 		TPixelsAndRotation pixelsAndRotation;
       
   671 		iCurrentScreenModeOrigin=TheClient->iScreen->GetScreenModeOrigin(iCurrentMode);
       
   672 		iCurrentScreenModeScale=TheClient->iScreen->GetScreenModeScale(iCurrentMode);
       
   673 		TheClient->iScreen->GetScreenModeSizeAndRotation(iCurrentMode,pixelsAndRotation);
       
   674 		DoSpriteTestsL();
       
   675 		client->iScreen->SetAppScreenMode(iCurrentMode);
       
   676 		client->Flush();
       
   677 		}
       
   678 	iCurrentMode=TheClient->iScreenModes[numOfModes-1];
       
   679 	TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   680 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   681 	TSizeMode storeModeData=TheClient->iScreen->GetCurrentScreenModeAttributes();
       
   682 	TSizeMode testMode=storeModeData;
       
   683 	for (TInt xScale=1;xScale<4;xScale++)
       
   684 		{
       
   685 		for (TInt yScale=1;yScale<4;yScale++)
       
   686 			{
       
   687 			testMode.iScreenScale=TSize(xScale,yScale);
       
   688 			TestDifferentOriginAndScaleForSpritesL(testMode,TPoint(20,20));
       
   689 			TestDifferentOriginAndScaleForSpritesL(testMode,TPoint(20,30));
       
   690 			TestDifferentOriginAndScaleForSpritesL(testMode,TPoint(30,20));
       
   691 			TestDifferentOriginAndScaleForSpritesL(testMode,TPoint(FullScreenModeSize.iWidth/2+10,60));
       
   692 			}
       
   693 		}
       
   694 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   695 	TheClient->iScreen->SetCurrentScreenModeAttributes(storeModeData);
       
   696 	TInt defaultMode=TheClient->iScreenModes[0];
       
   697 	TheClient->iScreen->SetAppScreenMode(defaultMode);
       
   698 	TheClient->iScreen->SetScreenMode(defaultMode);
       
   699 	CleanupStack::PopAndDestroy(2,client);
       
   700 	TheClient->iWs.SetAutoFlush(flushState);
       
   701 	}
       
   702 
       
   703 void CTScreenModeScaling::TestDifferentOriginAndScaleForSpritesL(TSizeMode &aMode, TPoint aOrigin)
       
   704 	{
       
   705 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   706 	aMode.iOrigin=aOrigin;
       
   707 	TheClient->iScreen->SetCurrentScreenModeAttributes(aMode);
       
   708 	iCurrentScreenModeOrigin=TheClient->iScreen->GetScreenModeOrigin(iCurrentMode);
       
   709 	iCurrentScreenModeScale=TheClient->iScreen->GetScreenModeScale(iCurrentMode);
       
   710 	DoSpriteTestsL();
       
   711 	}
       
   712 
       
   713 void CTScreenModeScaling::DoSpriteTestsL()
       
   714 	{
       
   715 	TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   716 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   717 	TPixelsAndRotation pixelsAndRotation;
       
   718 	TheClient->iScreen->GetScreenModeSizeAndRotation(iCurrentMode,pixelsAndRotation);
       
   719 	RWsSprite sprite;
       
   720 	TSize spriteSize=iSpriteBitmap.SizeInPixels();
       
   721 	if (spriteSize.iWidth*iCurrentScreenModeScale.iWidth>FullScreenModeSize.iWidth/2)
       
   722 		spriteSize.iWidth=(FullScreenModeSize.iWidth/2-20)/iCurrentScreenModeScale.iWidth;
       
   723 	SetUpSpriteLC(sprite,TheClient->iWs,*iBlankWin->BaseWin());
       
   724 	sprite.SetPosition(TPoint());
       
   725 	CTestSpriteWin* spriteWin=new(ELeave) CTestSpriteWin(iSpriteBitmap);
       
   726 	CleanupStack::PushL(spriteWin);
       
   727 	spriteWin->ConstructExtLD(*TheClient->iGroup,PhysicalToLogical(TPoint()-iCurrentScreenModeOrigin,iCurrentScreenModeScale),spriteSize);
       
   728 	User::LeaveIfError(spriteWin->BaseWin()->SetRequiredDisplayMode(EColor256));
       
   729 	spriteWin->AssignGC(*TheClient->iGc);
       
   730 	spriteWin->SetVisible(ETrue);
       
   731 	spriteWin->Activate();
       
   732 	spriteWin->UpdateWin(TPoint());
       
   733 	spriteWin->BaseWin()->SetShadowDisabled(ETrue);
       
   734 	spriteWin->BaseWin()->SetShadowHeight(0);
       
   735 	TheClient->Flush();
       
   736 	TheClient->WaitForRedrawsToFinish();
       
   737 	TPoint spritePosition;
       
   738 	if (iCurrentScreenModeOrigin.iX<=spriteSize.iWidth || iCurrentScreenModeOrigin.iY<=spriteSize.iHeight)
       
   739 		{
       
   740 		if (pixelsAndRotation.iRotation==CFbsBitGc::EGraphicsOrientationNormal || pixelsAndRotation.iRotation==CFbsBitGc::EGraphicsOrientationRotated180)
       
   741 			spritePosition=TPoint(spriteSize.iWidth+1,0);
       
   742 		else
       
   743 			spritePosition=TPoint(0,spriteSize.iHeight+1);
       
   744 		}
       
   745 	sprite.SetPosition(spritePosition);	
       
   746 	const TInt KAnimationGrace = 35000; //defined in server.cpp, but can be changed in wsini.ini
       
   747 	User::After(KAnimationGrace);
       
   748 	TBool retVal = TheClient->iScreen->RectCompare(TRect(PhysicalToLogical(TPoint()-iCurrentScreenModeOrigin,iCurrentScreenModeScale),spriteSize),TRect(spritePosition,spriteSize),CWsScreenDevice::EIncludeSprite);
       
   749 	TEST(retVal);
       
   750 	if (!retVal)
       
   751 		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare(rect1,rect2) return value  - Expected: %d, Actual: %d"), ETrue, retVal);		
       
   752 
       
   753 	sprite.SetPosition(TPoint());	
       
   754 	CleanupStack::PopAndDestroy(spriteWin);
       
   755 	CleanupStack::PopAndDestroy(&sprite);
       
   756 	}
       
   757 
       
   758 /**
       
   759 @SYMTestCaseID		GRAPHICS-WSERV-0095
       
   760 
       
   761 @SYMDEF             DEF081259
       
   762 
       
   763 @SYMTestCaseDesc    Rotation Tests
       
   764 					REQUIREMENT: PREQ673 (Screen Scaling)
       
   765 					API: RWindowBase::InquireOffset(), RWindowBase::AbsPosition(),RWindowBase::Position()
       
   766 
       
   767 @SYMTestPriority    High
       
   768 
       
   769 @SYMTestStatus      Implemented
       
   770 
       
   771 @SYMTestActions     For each of the screen mode with all its rotation it checks whether the window
       
   772 					is correctly placed in particular screen mode. Then it creates a child window
       
   773 					and checks whether it s correctly placed.
       
   774 
       
   775 @SYMTestExpectedResults Checks the windows are positioned correctly according to the origin,scale and rotation 
       
   776 					of the new screen mode.
       
   777 */		
       
   778 void CTScreenModeScaling::RotationTestsL()
       
   779 	{
       
   780 	CTClient* client=new(ELeave) CTClient();
       
   781 	CleanupStack::PushL(client);
       
   782 	client->SetScreenNumber(iTest->iScreenNumber);
       
   783 	client->ConstructL();
       
   784 	client->iGroup=new(ELeave) TestWindowGroup(client);
       
   785 	client->iGroup->ConstructL();
       
   786 	client->iGroup->WinTreeNode()->SetOrdinalPosition(1);
       
   787 	RBlankWindow color256(client->iWs);
       
   788 	User::LeaveIfError(color256.Construct(*TheClient->iGroup->GroupWin(),ENullWsHandle));
       
   789 	CleanupClosePushL(color256);
       
   790 	color256.SetRequiredDisplayMode(EColor256);
       
   791 	color256.Activate();
       
   792 	TInt oldCurrentMode=0;
       
   793 	TInt ii;
       
   794 	//TInt screenMode=TheClient->iScreen->CurrentScreenMode();
       
   795 	for (ii=0;ii<TheClient->iScreenModes.Count();)
       
   796 		{
       
   797 		iCurrentMode=TheClient->iScreenModes[ii];
       
   798 		if (iCurrentMode!=oldCurrentMode)
       
   799 			{
       
   800 			client->iScreen->SetAppScreenMode(iCurrentMode);
       
   801 			TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   802 			TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   803 			}
       
   804 		TPixelsAndRotation pixelsAndRotation;
       
   805 		TheClient->iScreen->GetDefaultScreenSizeAndRotation(pixelsAndRotation);
       
   806 		oldCurrentMode=iCurrentMode;
       
   807 		CArrayFixFlat<TInt>* rotations=new(ELeave) CArrayFixFlat<TInt>(1);
       
   808 		CleanupStack::PushL(rotations);
       
   809 		User::LeaveIfError(TheClient->iScreen->GetRotationsList(iCurrentMode,rotations));
       
   810 		TInt count=rotations->Count();
       
   811 		TInt jj=0;
       
   812 		if (count>1)
       
   813 			{
       
   814 			for (jj=0;jj<count;)
       
   815 				{
       
   816 				if ((*rotations)[jj++]==pixelsAndRotation.iRotation)
       
   817 					{
       
   818 					break;
       
   819 					}
       
   820 				}
       
   821 			if (jj==count)
       
   822 				{
       
   823 				jj=0;
       
   824 				}
       
   825 			}
       
   826 		if (jj==0)
       
   827 			{
       
   828 			ii++;
       
   829 			}
       
   830 		TInt currentRotation=(*rotations)[jj];
       
   831 		TheClient->iScreen->SetCurrentRotations(oldCurrentMode,REINTERPRET_CAST(CFbsBitGc::TGraphicsOrientation&,currentRotation));
       
   832 		CleanupStack::PopAndDestroy(rotations);
       
   833 		iCurrentScreenModeOrigin=TheClient->iScreen->GetScreenModeOrigin(oldCurrentMode);
       
   834 		iCurrentScreenModeScale=TheClient->iScreen->GetScreenModeScale(oldCurrentMode);
       
   835 		TRect testWinRect(PhysicalToLogical(TPoint(),iCurrentScreenModeScale),
       
   836 						  PhysicalToLogical(TPoint((Copy2ndHalfOfScreen ? FullScreenModeSize.iWidth : FullScreenModeSize.iWidth/2),FullScreenModeSize.iHeight)-iCurrentScreenModeOrigin,iCurrentScreenModeScale) 
       
   837 						 );
       
   838 		testWinRect.Shrink(10,10);
       
   839 		iTestWin->SetExtL(testWinRect.iTl,testWinRect.Size());
       
   840 		iTestWin->Invalidate();
       
   841 		iTestWin->SetVisible(ETrue);
       
   842 		TheClient->Flush();
       
   843 		TheClient->WaitForRedrawsToFinish();
       
   844 		TestTopClientWindowPositionAPIs(testWinRect.iTl,iTestWin->BaseWin());
       
   845 		TPoint backedUpWinPt=TPoint(testWinRect.Width()/3,testWinRect.Height()/4);
       
   846 		iBackedUpWin->SetVisible(ETrue);
       
   847 		iBackedUpWin->SetExtL(backedUpWinPt,TSize(testWinRect.Width()/6,testWinRect.Height()/6));
       
   848 		TestChildWindowPositionAPIs(backedUpWinPt,testWinRect.iTl,iBackedUpWin->BaseWin(),iTestWin->BaseWin());
       
   849 		iTestWin->SetVisible(EFalse);
       
   850 		iBackedUpWin->SetVisible(EFalse);
       
   851 		}
       
   852 	CleanupStack::PopAndDestroy(2,client);
       
   853 	}
       
   854 
       
   855 void CTScreenModeScaling::DrawTransparentWindows()
       
   856 	{
       
   857 	//.. First Draw on Backgroundbitmap
       
   858 	iBackgroundBitmap->Gc().SetBrushColor(TRgb(255,0,255));
       
   859 	iBackgroundBitmap->Gc().SetBrushStyle(CGraphicsContext::ESolidBrush);
       
   860 	iBackgroundBitmap->Gc().SetPenStyle(CGraphicsContext::ENullPen);
       
   861 	iBackgroundBitmap->Gc().DrawRect(iWinSize);
       
   862 	
       
   863 	//.. Invalidate the background bitmap and do bitBlt to iCheckBitmap also
       
   864 	iBackgroundWin->BaseWin()->SetVisible(ETrue);
       
   865 	iBackgroundWin->DrawNow();
       
   866 
       
   867 	//.. Copy to checkbitmap
       
   868 	iCheckBitmap->Gc().SetFaded(EFalse);
       
   869 	iCheckBitmap->Gc().BitBlt(TPoint(),&iBackgroundBitmap->Bitmap());
       
   870 
       
   871 	//.. Set the grade of transperency
       
   872 	iTransparencyBitmap->Gc().SetBrushColor(TRgb::Gray256(128));
       
   873 	iTransparencyBitmap->Gc().SetBrushStyle(CGraphicsContext::ESolidBrush);
       
   874 	iTransparencyBitmap->Gc().SetPenStyle(CGraphicsContext::ENullPen);
       
   875 	iTransparencyBitmap->Gc().DrawRect(iWinSize);
       
   876 
       
   877 	//.. Then draw to the fore ground bitmap and invalidate the second window
       
   878 	iForegroundBitmap->Gc().Reset();
       
   879 	iForegroundBitmap->Gc().SetPenStyle(CGraphicsContext::ESolidPen);
       
   880 	iForegroundBitmap->Gc().SetPenSize(TSize(1,1));
       
   881 	iForegroundBitmap->Gc().SetPenColor(TRgb(0,0,0));
       
   882 	iForegroundBitmap->Gc().DrawLine(TPoint(0,0),TPoint(iWinSize.iWidth,iWinSize.iHeight));
       
   883 	iForegroundBitmap->Gc().DrawLine(TPoint(iWinSize.iWidth,0),TPoint(0,iWinSize.iHeight));
       
   884 	iTransWin->BaseWin()->SetVisible(ETrue);
       
   885 	iTransWin->Invalidate();
       
   886 	iTransWin->DrawNow();
       
   887 
       
   888 	iCheckBitmap->Gc().AlphaBlendBitmaps(TPoint(0,0),&iForegroundBitmap->Bitmap(),&iCheckBitmap->Bitmap()
       
   889 													,TRect(iWinSize),TPoint(0,0),&iTransparencyBitmap->Bitmap(),TPoint(0,0));
       
   890 	iCheckWin->BaseWin()->SetVisible(ETrue);
       
   891 	iCheckWin->BackedUpWin()->UpdateScreen();
       
   892 	TheClient->Flush();
       
   893 	TheClient->WaitForRedrawsToFinish();
       
   894 	CheckRect(iTransWin,iCheckWin,TRect(iWinSize),_L("DrawTransparentWindows() CheckRect failed"));
       
   895 	}
       
   896 
       
   897 // !!! THE COMMENT BELOW IS DISABLED BECAUSE TransparentTests() METHOD IS NOT USED !!!
       
   898 //**
       
   899 //@SYMTestCaseID		GRAPHICS-WSERV-0096
       
   900 //
       
   901 //@SYMDEF             DEF081259
       
   902 //
       
   903 //@SYMTestCaseDesc    TransparentTests
       
   904 //					REQUIREMENT: PREQ673 (Screen Scaling)
       
   905 //					API: CWindowGc::AlphaBlendBitmaps()
       
   906 //
       
   907 //@SYMTestPriority    High
       
   908 //
       
   909 //@SYMTestStatus      Implemented
       
   910 //
       
   911 //@SYMTestActions     The main logic behind this test is to copy the content of the background window
       
   912 //					bitmap to checkwindow bitmap and then use the foreground window bitmap and transparency bitmap
       
   913 //					with the function AlphaBlendBitmaps() to get the content present on the combination of 
       
   914 //					foreground(transparent) window and background window. Then compare both the regions of the 
       
   915 //					window to check whether the content is same.
       
   916 //
       
   917 //@SYMTestExpectedResults The content of both halves of the screen should match.
       
   918 //*/		
       
   919 void CTScreenModeScaling::TransparentTestsL()
       
   920 	{
       
   921 	TInt flushState=TheClient->iWs.SetAutoFlush(ETrue);
       
   922 	TInt defaultMode=TheClient->iScreenModes[0];
       
   923 	TheClient->iScreen->SetAppScreenMode(defaultMode);
       
   924 	TheClient->iScreen->SetScreenMode(defaultMode);
       
   925 	CTClient* client=new(ELeave) CTClient();
       
   926 	CleanupStack::PushL(client);
       
   927 	client->SetScreenNumber(iTest->iScreenNumber);
       
   928 	client->ConstructL();
       
   929 	client->iGroup=new(ELeave) TestWindowGroup(client);
       
   930 	client->iGroup->ConstructL();
       
   931 	client->iGroup->WinTreeNode()->SetOrdinalPosition(1);
       
   932 	RBlankWindow color256(client->iWs);
       
   933 	User::LeaveIfError(color256.Construct(*TheClient->iGroup->GroupWin(),ENullWsHandle));
       
   934 	CleanupClosePushL(color256);
       
   935 	color256.SetRequiredDisplayMode(EColor256);
       
   936 	color256.Activate();
       
   937 	client->Flush();
       
   938 	DrawTransparentWindows();
       
   939 	iCurrentMode=TheClient->iScreenModes[TheClient->iScreenModes.Count()-1];
       
   940 	TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   941 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   942 	TSizeMode storeModeData=TheClient->iScreen->GetCurrentScreenModeAttributes();
       
   943 	TSizeMode testMode=storeModeData;
       
   944 	for (TInt xScale=1;xScale<4;xScale++)
       
   945 		{
       
   946 		for (TInt yScale=1;yScale<4;yScale++)
       
   947 			{
       
   948 			testMode.iScreenScale=TSize(xScale,yScale);
       
   949 			TestDifferentOriginAndScaleForTranspWin(testMode,TPoint(20,20));
       
   950 			TestDifferentOriginAndScaleForTranspWin(testMode,TPoint(20,30));
       
   951 			TestDifferentOriginAndScaleForTranspWin(testMode,TPoint(30,20));
       
   952 			TestDifferentOriginAndScaleForTranspWin(testMode,TPoint(FullScreenModeSize.iWidth/2+1,60));
       
   953 			}
       
   954 		}
       
   955 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   956 	TheClient->iScreen->SetCurrentScreenModeAttributes(storeModeData);
       
   957 	client->iScreen->SetAppScreenMode(iCurrentMode);
       
   958 	client->Flush();
       
   959 	TheClient->iScreen->SetAppScreenMode(defaultMode);
       
   960 	TheClient->iScreen->SetScreenMode(defaultMode);
       
   961 	TheClient->iWs.SetAutoFlush(flushState);
       
   962 	CleanupStack::PopAndDestroy(2,client);
       
   963 	}
       
   964 
       
   965 void CTScreenModeScaling::TestDifferentOriginAndScaleForTranspWin(TSizeMode &aMode,TPoint aOrigin)
       
   966 	{
       
   967 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   968 	aMode.iOrigin=aOrigin;
       
   969 	TheClient->iScreen->SetCurrentScreenModeAttributes(aMode);
       
   970 	TheClient->iScreen->SetAppScreenMode(iCurrentMode);
       
   971 	TheClient->iScreen->SetScreenMode(iCurrentMode);
       
   972 	TRAPD(ret,DrawTransparentWindows());
       
   973 	TEST(ret==KErrNone);
       
   974 	if (ret!=KErrNone)
       
   975 		INFO_PRINTF3(_L("DrawTransparentWindows() return value  - Expected: %d, Actual: %d"), KErrNone, ret);		
       
   976 
       
   977 	}
       
   978 
       
   979 /**
       
   980 @SYMTestCaseID		GRAPHICS-WSERV-0097
       
   981 
       
   982 @SYMDEF             DEF081259
       
   983 
       
   984 @SYMTestCaseDesc    AppScreenModeTest
       
   985 					REQUIREMENT: PREQ673 (Screen Scaling)
       
   986 					API: CWsScreenDevice::SetAppScreenMode()
       
   987 
       
   988 @SYMTestPriority    High
       
   989 
       
   990 @SYMTestStatus      Implemented
       
   991 
       
   992 @SYMTestActions     Enable the visibility of Test window, Call SetAppScreenMode() API with different
       
   993 					screen mode. Check the variable which is set in its draw function. 
       
   994 
       
   995 @SYMTestExpectedResults The variable should not be set when the application screen mode is different 
       
   996 					then current screen mode. 
       
   997 */
       
   998 void CTScreenModeScaling::AppScreenModeTestL()
       
   999 	{
       
  1000 	TheClient->iScreen->SetAppScreenMode(0);
       
  1001 	TheClient->iScreen->SetScreenMode(0);
       
  1002 	iTestWin->iDrawn=EFalse;
       
  1003 	iTestWin->SetExtL(TPoint(),TSize(FullScreenModeSize.iWidth/2,FullScreenModeSize.iHeight));
       
  1004 	iTestWin->SetVisible(ETrue);
       
  1005 	TheClient->Flush();
       
  1006 	TheClient->WaitForRedrawsToFinish();
       
  1007 	TEST(iTestWin->iDrawn);
       
  1008 	if (!iTestWin->iDrawn)
       
  1009 		INFO_PRINTF3(_L("iTestWin->iDrawn  - Expected: %d, Actual: %d"), ETrue, iTestWin->iDrawn);
       
  1010 
       
  1011 	iTestWin->iDrawn=EFalse;
       
  1012 	TheClient->iScreen->SetAppScreenMode(2);
       
  1013 	TheClient->iScreen->SetScreenMode(0);
       
  1014 	iTestWin->Invalidate();
       
  1015 	TheClient->Flush();
       
  1016 	TEST(!iTestWin->iDrawn);
       
  1017 	if (iTestWin->iDrawn)
       
  1018 		INFO_PRINTF3(_L("iTestWin->iDrawn  - Expected: %d, Actual: %d"), EFalse, iTestWin->iDrawn);
       
  1019 
       
  1020 	TheClient->iScreen->SetAppScreenMode(0);
       
  1021 	TheClient->Flush();
       
  1022 	TheClient->WaitForRedrawsToFinish();
       
  1023 	TEST(iTestWin->iDrawn);
       
  1024 	if (!iTestWin->iDrawn)
       
  1025 		INFO_PRINTF3(_L("iTestWin->iDrawn  - Expected: %d, Actual: %d"), ETrue, iTestWin->iDrawn);
       
  1026 
       
  1027 	iTestWin->iDrawn=EFalse;
       
  1028 	TheClient->iScreen->SetScreenMode(1);
       
  1029 	iTestWin->Invalidate();
       
  1030 	TheClient->Flush();
       
  1031 	TEST(!iTestWin->iDrawn);
       
  1032 	if (iTestWin->iDrawn)
       
  1033 		INFO_PRINTF3(_L("iTestWin->iDrawn  - Expected: %d, Actual: %d"), EFalse, iTestWin->iDrawn);
       
  1034 
       
  1035 	iTestWin->SetVisible(EFalse);
       
  1036 	TheClient->iScreen->SetAppScreenMode(0);
       
  1037 	TheClient->iScreen->SetScreenMode(0);
       
  1038 	}
       
  1039 
       
  1040 void CTScreenModeScaling::RunTestCaseL(TInt /*aCurTestCase*/)
       
  1041 	{
       
  1042 	_LIT(KWindowTests,"Window Tests");
       
  1043 	_LIT(KSpriteTest,"Sprite Test");
       
  1044 	_LIT(KRotationTests,"Rotation Tests");
       
  1045 	_LIT(KTransparentTests,"Transparent Tests");
       
  1046 	_LIT(KAppScreenModeTest,"AppScreenMode Test");
       
  1047 	_LIT(KScalling,"Scaling not Supported");
       
  1048 	_LIT(KModes,"Only one Screen Size Mode");
       
  1049 	
       
  1050 	((CTScreenModeScalingStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
       
  1051 	switch(++iTest->iState)
       
  1052 		{
       
  1053 		case 1:
       
  1054 			{
       
  1055 			((CTScreenModeScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0097"));
       
  1056 			TInt numScrModes=TheClient->iScreen->NumScreenModes();
       
  1057 			if (numScrModes<2 || !CheckScalingSupportedOrNot())
       
  1058 				{
       
  1059 				if (numScrModes<2)
       
  1060 					LOG_MESSAGE(KModes);
       
  1061 				else
       
  1062 					LOG_MESSAGE(KScalling);
       
  1063 				TestComplete();
       
  1064 				return;
       
  1065 				}
       
  1066 			iTest->LogSubTest(KAppScreenModeTest);
       
  1067 			AppScreenModeTestL();
       
  1068 			}
       
  1069 			break;
       
  1070 		case 2:
       
  1071 			((CTScreenModeScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0093"));
       
  1072 			iTest->LogSubTest(KWindowTests);
       
  1073 			WindowTestsL();
       
  1074 			break;
       
  1075 		case 3:
       
  1076 			((CTScreenModeScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0094"));
       
  1077 			iTest->LogSubTest(KSpriteTest);
       
  1078 			SpriteTestL();
       
  1079 			break;
       
  1080 		case 4:
       
  1081 			((CTScreenModeScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0095"));
       
  1082 			iTest->LogSubTest(KRotationTests);
       
  1083 			RotationTestsL();
       
  1084 			break;
       
  1085 		case 5:
       
  1086 			((CTScreenModeScalingStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
       
  1087 			iTest->LogSubTest(KTransparentTests);
       
  1088 			//TransparentTestsL();		//This tests currently fails sometimes for reasons not understood ####
       
  1089 			break;
       
  1090 		default:
       
  1091 			{
       
  1092 			TInt defaultMode=TheClient->iScreenModes[0];
       
  1093 			TheClient->iScreen->SetAppScreenMode(defaultMode);
       
  1094 			TheClient->iScreen->SetScreenMode(defaultMode);
       
  1095 			}
       
  1096 			((CTScreenModeScalingStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
       
  1097 			((CTScreenModeScalingStep*)iStep)->CloseTMSGraphicsStep();
       
  1098 			TestComplete();
       
  1099 			return;
       
  1100 		}
       
  1101 	((CTScreenModeScalingStep*)iStep)->RecordTestResultL();
       
  1102 	}
       
  1103 
       
  1104 __WS_CONSTRUCT_STEP__(ScreenModeScaling)