--- /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();
+ }