graphicsdeviceinterface/directgdi/test/tcopyrect.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tcopyrect.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,287 @@
+// Copyright (c) 2007-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:
+//
+
+#include "tcopyrect.h"
+
+CTCopyRect::CTCopyRect()
+	{
+	SetTestStepName(KTDirectGdiCopyRectStep);
+	}
+
+CTCopyRect::~CTCopyRect()
+	{
+	}
+			
+/**
+@SYMTestCaseID  
+	GRAPHICS-DIRECTGDI-COPYRECT-0001
+	
+@SYMPREQ 
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc  
+	Tests copying the content of a rectangular area on the target to another location.
+	
+@SYMTestPriority  
+	High
+	
+@SYMTestStatus 
+	Implemented
+	
+@SYMTestActions 
+	Test various combinations of method parameters:
+		target location is out of bounds or partially out of bounds
+		target destination doesn't intersect source destination
+		target destination is clipped
+		source destination intersects clipping region
+		source destination is partially out of bounds
+		target destination overlaps source destination
+		
+@SYMTestExpectedResults 
+	Content should be copied to specified location.
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+*/
+void CTCopyRect::TestCopyRectL()
+	{
+	_LIT(KTestName, "CopyRect-Basic"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	TSize size(30,30);
+	CFbsBitmap* bitmap = CreateCheckedBoardBitmapL(iTestParams.iTargetPixelFormat, size);
+
+	ResetGc();
+	TPoint point(15,15);
+	TRect rectToCopy(point, size);
+	iGc->BitBlt(point, *bitmap);
+	
+	// copy rect where target destination is out of bounds
+	iGc->CopyRect(TPoint(-100,0), rectToCopy);
+	
+	// copy rect where target destination is partially out of bounds
+	iGc->CopyRect(TPoint(40,-34), rectToCopy);
+	
+	// copy rect where target destination doesn't intersect source destination
+	iGc->CopyRect(TPoint(17,44), rectToCopy);
+
+	// copy rect where target destination is clipped
+	RRegion clippingRegion(4);
+	clippingRegion.AddRect(TRect(60,90,100,130));
+	clippingRegion.SubRect(TRect(80,105,90,115));
+	iGc->SetClippingRegion(clippingRegion);
+	iGc->CopyRect(TPoint(55,85), rectToCopy);
+	clippingRegion.Clear();
+	
+	// copy rect where source destination intersects clipping region (shouldn't actually be clipped)
+	clippingRegion.AddRect(TRect(25,25,150,150));
+	iGc->SetClippingRegion(clippingRegion);
+	iGc->CopyRect(TPoint(60,30), rectToCopy);
+	iGc->ResetClippingRegion();	
+	clippingRegion.Close();
+	
+	// copy rect where source destination is partially out of bounds
+	iGc->CopyRect(TPoint(0,95), TRect(TPoint(-2,15),size));
+	
+	// copy rect where target destination overlaps source destination
+	iGc->CopyRect(TPoint(12,12), rectToCopy);
+	delete bitmap;
+
+	TESTNOERROR(iGc->GetError());
+	if (iUseDirectGdi && !iUseSwDirectGdi)
+		{
+		iVgImageCache->ResetCache();
+		}
+	TInt err = WriteTargetOutput(iTestParams, TPtrC(KTestName));
+	TEST(KErrNone == err);
+	}
+
+
+/**
+@SYMTestCaseID  
+	GRAPHICS-DIRECTGDI-COPYRECT-0002
+	
+@SYMPREQ 
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc  
+	Tests calling CopyRect() with invalid parameters.
+	
+@SYMTestPriority  
+	High
+	
+@SYMTestStatus 
+	Implemented
+	
+@SYMTestActions 
+	Blit a bitmap.
+	Test CopyRect() with invalid rects ( e.g. iTl.iX>iBr.iX and other ).
+	The offset is set to out of blited bitmap area.
+	Clear blited bitmap area.
+	
+@SYMTestExpectedResults 
+	There should be no effect of using CopyRect(). So, after clearing 
+	blited bitmap area, the whole target should be clear and
+	no bitmap will be created.
+*/
+void CTCopyRect::TestCopyRectInvalidParametersL()
+	{
+	_LIT(KTestName, "CopyRect-InvalidParameters"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+	
+	//blit a bitmap
+	TSize size(40,40);
+	CFbsBitmap* bitmap = CreateCheckedBoardBitmapL(iTestParams.iTargetPixelFormat, size);
+	iGc->BitBlt(TPoint(0,0), *bitmap);
+	
+	//test invalid rectangles but on bitmap area drawn above
+	for(TInt i =1; i<9; i++)
+		{
+		TRect rect( (i%3)*20 , (i/3)*20 , 20 , 20  );
+		iGc->CopyRect(TPoint(40,40),rect);
+		TESTNOERROR(iGc->GetError());
+		}
+	//test with offset (0,0), this should just return and do nothing
+	iGc->CopyRect(TPoint(0,0),TRect(0,0,100,100));
+	//clear blited bitmap area
+	iGc->Clear(TRect(0,0,40,40));
+	TESTNOERROR(iGc->GetError());
+	
+	delete bitmap;
+	if (iUseDirectGdi && !iUseSwDirectGdi)
+		{
+		iVgImageCache->ResetCache();
+		}
+	// test if target is still clear
+	TBool pass = TestTargetL(KRgbWhite);
+	if(!pass)
+		{
+		// write target only if test failed
+		TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+		}
+	TEST(pass);
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-DIRECTGDI-COPYRECT-0003
+
+@SYMDEF PDEF138111
+
+@SYMTestCaseDesc Test CDirectGdiContext::CopyRect() with non-trivial alpha channel
+ 
+@SYMTestPriority Normal
+
+@SYMTestStatus Implemented
+
+@SYMTestActions Fill the upper half of the bitmap with semi-transparent gray. 
+				Call CDirectGdiContext::CopyRect() to copy the upper half to the lower half.
+ 				Sample one pixel from both the upper and lower half of the bitmap.
+
+@SYMTestExpectedResults The two pixels should be the same. Without the fix the lower part
+						would show a lighter shade of the gray.
+*/
+void CTCopyRect::CopyRectAlphaL()
+	{	
+	ResetGc();
+	iGc->SetBrushStyle(DirectGdi::ESolidBrush);
+	iGc->Clear();
+	TRgb color = TRgb(128, 128, 128, 128);
+	iGc->SetBrushColor(color);
+	iGc->SetPenColor(color);
+	iGc->SetDrawMode(DirectGdi::EDrawModeWriteAlpha);
+	TSize size = iGdiTarget->SizeInPixels();
+	iGc->DrawRect(TRect(0, 0, size.iWidth, size.iHeight/2));
+	iGc->SetDrawMode(DirectGdi::EDrawModePEN);
+	iGc->CopyRect(TPoint(0, size.iHeight/2), TRect(0, 0, size.iWidth, size.iHeight/2));
+	
+	//sample a pixel from the lower part of the bitmap and it should be the same as the upper half 
+	TRgb pixelColorUpper;
+	iGdiTarget->GetTargetFbsBitmapL()->GetPixel(pixelColorUpper, TPoint(size.iWidth/2, size.iHeight/4));
+	TRgb pixelColorLower;
+	iGdiTarget->GetTargetFbsBitmapL()->GetPixel(pixelColorLower, TPoint(size.iWidth/2, size.iHeight*3/4));
+	TEST(pixelColorUpper == pixelColorLower);
+	}
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTCopyRect::doTestStepPreambleL()
+	{			
+	CTDirectGdiStepBase::doTestStepPreambleL();	
+	return TestStepResult();
+	}
+	
+/** 
+Override of base class pure virtual
+Our implementation only gets called if the base class doTestStepPreambleL() did
+not leave. That being the case, the current test result value will be EPass.
+@leave Gets system wide error code
+@return TVerdict code
+*/	
+TVerdict CTCopyRect::doTestStepL()
+	{
+	// Test for each pixel format
+	for(TInt targetPixelFormatIndex = iTargetPixelFormatArray.Count() - 1; targetPixelFormatIndex >= 0 ; targetPixelFormatIndex--)
+		{
+		iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[targetPixelFormatIndex];
+		SetTargetL(iTestParams.iTargetPixelFormat);	
+		RunTestsL();
+		RunOomTestsL();  //from base class
+		}
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+/**
+Override of base class pure virtual
+Lists the tests to be run
+*/
+void CTCopyRect::RunTestsL()
+	{
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-COPYRECT-0001"));
+	TestCopyRectL();
+	RecordTestResultL();
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-COPYRECT-0002"));
+	TestCopyRectInvalidParametersL();
+	RecordTestResultL();
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-COPYRECT-0003"));
+	CopyRectAlphaL();
+	RecordTestResultL();
+	}