Chop out the code that handles "additional _E32Dll entry point after last ordinal position". I can't agree with that as how the DLL is supposed to work, and gives errors for me. Maybe the scripts to re-generate the jump tables have not been tried recently so its not a problem that's been hit by others.
// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// @file
//
//
#include <w32std.h>
#include <e32std.h>
#include "cwsgcecsc.h"
#include "extendtef.h"
#include "teflogextensions.h"
#include "testscreencapture.h"
#if defined(__X86GCC__)
extern "C" TInt atexit(void (*function)(void))
{
return KErrNone;
}
#endif
void TefUnitFailLeaveL()
{
User::Leave(KErrTEFUnitFail);
}
CWSGceCsc::CWSGceCsc()
{
}
CWSGceCsc::~CWSGceCsc()
{
}
/**
Common set up code for all tests.
Creates the session and window group for further windows, plus a simple white
background to obscure any unwanted stuff behind the test. Sets up the surface
update session and surface manager, to work with surfaces. Creates a screen
device for use in the tests.
*/
void CWSGceCsc::SetupL()
{
CWsGceCscBase::SetupL();
}
/**
Common tear down code for all tests.
Windows, group and session created are closed. Screen device is destroyed.
Surfaces, manager and update session are closed.
*/
void CWSGceCsc::TearDownL()
{
CWsGceCscBase::TearDownL();
}
CTestSuite* CWSGceCsc::CreateSuiteL( const TDesC& aName)
{
SUB_SUITE;
ADD_WSGCE_TEST_STEP(CWSGceCsc, GRAPHICS_WSERV_CSC_101L);
ADD_WSGCE_TEST_STEP(CWSGceCsc, GRAPHICS_WSERV_CSC_102L);
ADD_WSGCE_TEST_STEP(CWSGceCsc, GRAPHICS_WSERV_CSC_103L);
ADD_WSGCE_TEST_STEP(CWSGceCsc, GRAPHICS_WSERV_CSC_104L);
ADD_WSGCE_TEST_STEP(CWSGceCsc, GRAPHICS_WSERV_CSC_105L);
END_SUITE;
}
/**
@SYMTestCaseID GRAPHICS_WSERV_CSC_101L
@SYMTestCaseDesc Compare the screen composition using the new and legacy API
@SYMPREQ CSC
@SYMTestStatus Implemented
@SYMTestPriority 1
@SYMTestPurpose To check that the screen composition retrieved using the new and legacy APIs
@SYMTestActions Initialization.
Construct a background opaque window.
Create two bitmaps with the size equal with the composition.
Draw something on the screen.
Use legacy API CopyScreenToBitmap() to copy the screen to first bitmap.
Use the the new API to copy the composition of the screen.
Compare the results.
@SYMTestExpectedResults The bitmap should be identical
*/
void CWSGceCsc::GRAPHICS_WSERV_CSC_101L()
{
TRect screen(iScreenDevice->SizeInPixels());
RWindow nonSurfacedWindow(iSession);
iTestName.Format(_L("GRAPHICS_WSERV_CSC_101L"));
INFO_PRINTF2(_L("%S"),&iTestName);
iDisplayMode = iScreenDevice->DisplayMode(); // Get default display mode
ConstructOpaqueWindowLC(nonSurfacedWindow,
iCyan,
0,
TPoint(0, 0),
screen.Size());
iSession.Flush();
Pause(1000);
MTestScreenCapture* csc = static_cast<MTestScreenCapture*> (iScreenDevice->GetInterface(MTestScreenCapture::KUidTestScreenCaptureIf));
ASSERT_NOT_NULL(csc);
TSize compositionScreenSize;
User::LeaveIfError(csc->GetCompositedSize(compositionScreenSize));
CFbsBitmap *bmp1 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp1);
User::LeaveIfError(bmp1->Create(compositionScreenSize, EColor16MU));
CFbsBitmap *bmp2 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp2);
User::LeaveIfError(bmp2->Create(compositionScreenSize, EColor16MU));
iSession.Flush();
Pause(200);
iScreenDevice->CopyScreenToBitmap(bmp1);
User::LeaveIfError(csc->ComposeScreen(*bmp2));
SetBackgroundColorWindow(nonSurfacedWindow, iRed);
iSession.Flush();
Pause(500);
iGc->Activate(nonSurfacedWindow);
iGc->BitBlt(TPoint(0, 0), bmp1);
iGc->Deactivate();
iSession.Flush();
Pause(500);
SetBackgroundColorWindow(nonSurfacedWindow, iWhite);
iSession.Flush();
Pause(500);
iGc->Activate(nonSurfacedWindow);
iGc->BitBlt(TPoint(0, 0), bmp2);
iGc->Deactivate();
iSession.Flush();
Pause(500);
ASSERT_TRUE(Compare(*bmp1, *bmp2));
if (GCEIsSupported())
{
iUtility->DestroyAll();
}
CleanupStack::PopAndDestroy(bmp2);
CleanupStack::PopAndDestroy(bmp1);
CleanupStack::PopAndDestroy(&nonSurfacedWindow);
iSession.Flush();
Pause(1000);
}
void CWSGceCsc::DrawBasicPattern (RWindow& aWin)
{
TSize rectSize(100, 100);
aWin.Invalidate();
aWin.BeginRedraw();
iGc->Activate(aWin);
iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
iGc->SetBrushColor(KRgbDarkRed);
iGc->DrawRect(TRect(TPoint(35, 5), rectSize));
iGc->SetBrushColor(KRgbBlack);
iGc->DrawRect(TRect(TPoint(55, 15), rectSize));
iGc->SetBrushColor(KRgbDarkBlue);
iGc->DrawRect(TRect(TPoint(75, 35), rectSize));
iGc->SetBrushColor(KRgbYellow);
iGc->DrawRect(TRect(TPoint(95, 55), rectSize));
iGc->Deactivate();
aWin.EndRedraw();
iSession.Flush();
Pause(500);
}
/**
@SYMTestCaseID GRAPHICS_WSERV_CSC_102L
@SYMTestCaseDesc Compare the screen composition using the new and legacy API
@SYMPREQ CSC
@SYMTestStatus Implemented
@SYMTestPriority 1
@SYMTestPurpose To check that the screen composition retrieved using the new and legacy APIs
@SYMTestActions Initialization.
Draw a pattern on the screen
Retrieve to a bitmap the UI content using the legacy API
Blank the screen.
Display the retrieved content to a surface
Retrieve the composited content
Compare the UI content with the composited content
NOTE:assumes current screen mode is at 0 offset
@SYMTestExpectedResults The UI content should be identical with the composited content
*/
void CWSGceCsc::GRAPHICS_WSERV_CSC_102L()
{
TRect screen(iScreenDevice->SizeInPixels());
RWindow testWindow(iSession);
RWindow surfacedTestWindow(iSession);
TSurfaceId surfaceID;
MTestScreenCapture* csc = static_cast<MTestScreenCapture*> (iScreenDevice->GetInterface(MTestScreenCapture::KUidTestScreenCaptureIf));
ASSERT_NOT_NULL(csc);
TSize compositionScreenSize;
User::LeaveIfError(csc->GetCompositedSize(compositionScreenSize));
iTestName.Format(_L("GRAPHICS_WSERV_CSC_102"));
INFO_PRINTF2(_L("%S"),&iTestName);
iDisplayMode = iScreenDevice->DisplayMode();
TRAPD(err, surfaceID = iUtility->CreateSurfaceL(compositionScreenSize,
KSurfaceFormat,
compositionScreenSize.iWidth * KBytesPerPixel));
ASSERT_EQUALS(err,KErrNone);
ConstructOpaqueWindowLC(testWindow,
iWhite,
0,
TPoint(0, 0),
compositionScreenSize);
iSession.Flush();
Pause(100);
CFbsBitmap *bmp1 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp1);
User::LeaveIfError(bmp1->Create(compositionScreenSize, EColor16MU));
CFbsBitmap *bmp2 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp2);
User::LeaveIfError(bmp2->Create(compositionScreenSize, EColor16MU));
iSession.Flush();
Pause(500);
SetBackgroundColorWindow(testWindow, iWhite);
DrawBasicPattern (testWindow);
iScreenDevice->CopyScreenToBitmap(bmp1);
iSession.Flush();
Pause(100);
ConstructOpaqueSurfacedWindowLC(surfacedTestWindow,
iRed,
0,
TPoint(0, 0),
compositionScreenSize,
surfaceID);
TRAP(err,iUtility->FillSurfaceL(surfaceID, iCyan));
ASSERT_EQUALS(err,KErrNone);
iSession.Flush();
Pause(500);
TRAP(err, iUtility->CopyBitmapToSurfaceL(surfaceID, *bmp1));
ASSERT_EQUALS(err,KErrNone);
iSession.Flush();
Pause(500);
User::LeaveIfError(csc->ComposeScreen(*bmp2));
ASSERT_TRUE(Compare(*bmp1, *bmp2));
iUtility->DestroyAll();
CleanupStack::PopAndDestroy(&surfacedTestWindow);
CleanupStack::PopAndDestroy(bmp2);
CleanupStack::PopAndDestroy(bmp1);
CleanupStack::PopAndDestroy(&testWindow);
iSession.Flush();
Pause(1000);
}
/**
@SYMTestCaseID GRAPHICS_WSERV_CSC_103L
@SYMTestCaseDesc Test TranslateExtent
@SYMPREQ CSC
@SYMTestStatus Implemented
@SYMTestPriority 1
@SYMTestPurpose To check that the correct translated extent is returned to the client
@SYMTestActions Initialization
Change to app mode with offset and 90 degrees rotation
Translate a rectangle corresponding to the original app mode
Compare the expected rectangle with the translated rectangle
@SYMTestExpectedResults The translated rectangle should take into account the offset and rotation
and be equal to the expected rectangle
*/
void CWSGceCsc::GRAPHICS_WSERV_CSC_103L()
{
TRect screen(iScreenDevice->SizeInPixels());
RWindow testWindow(iSession);
iTestName.Format(_L("GRAPHICS_WSERV_CSC_103L"));
INFO_PRINTF2(_L("%S"),&iTestName);
iDisplayMode = iScreenDevice->DisplayMode();
ConstructOpaqueWindowLC(testWindow,
iWhite,
0,
TPoint(0, 0),
screen.Size());
iSession.Flush();
Pause(1000);
// Get the screen modes
RArray<TInt> modeList;
TInt err = iScreenDevice->GetScreenSizeModeList(&modeList);
ASSERT_TRUE(err > 1); //2 modes expected
ASSERT_TRUE(modeList.Count() > 1); //2 modes expected
// The initial extent and the expected translated extent
TRect initial(TPoint(10,10), TSize(20,30));
TRect extent(initial);
TRect expected(TPoint(15,15), TSize(20,30));
// Change app mode to 5 pixels offset
iScreenDevice->SetAppScreenMode(modeList[1]);
iScreenDevice->SetScreenMode(modeList[1]);
iSession.Flush();
Pause(100);
TPoint origin = iScreenDevice->GetCurrentScreenModeScaledOrigin();
if(origin != TPoint(0,0))
{
// Calculate the new extent
MTestScreenCapture* csc = static_cast<MTestScreenCapture*> (iScreenDevice->GetInterface(MTestScreenCapture::KUidTestScreenCaptureIf));
ASSERT_NOT_NULL(csc);
csc->TranslateExtent(initial, extent);
ASSERT_TRUE(extent == expected);
}
else
{
INFO_PRINTF1(_L("Non zero offset not supported"));
}
// Change app mode
iScreenDevice->SetAppScreenMode(modeList[0]);
iScreenDevice->SetScreenMode(modeList[0]);
iSession.Flush();
Pause(100);
modeList.Close();
CleanupStack::PopAndDestroy(&testWindow);
iSession.Flush();
Pause(1000);
}
/**
@SYMTestCaseID GRAPHICS_WSERV_CSC_104L
@SYMTestCaseDesc Compare the screen composition using bitmaps with different display modes
@SYMPREQ CSC
@SYMTestStatus Implemented
@SYMTestPriority 1
@SYMTestPurpose To check that bitmaps with different display modes
@SYMTestActions Initialization.
Draw a pattern on the screen
Retrieve to a bitmap the UI content using the legacy API
Blank the screen.
Display the retrieved content to a surface
Retrieve the composited content to a 2nd bitmap
Compare the UI content with the composited content
@SYMTestExpectedResults The bitmaps format should not match and should return KErrArgument
*/
void CWSGceCsc::GRAPHICS_WSERV_CSC_104L()
{
TRect screen(iScreenDevice->SizeInPixels());
RWindow testWindow(iSession);
RWindow surfacedTestWindow(iSession);
TSurfaceId surfaceID;
MTestScreenCapture* csc = static_cast<MTestScreenCapture*> (iScreenDevice->GetInterface(MTestScreenCapture::KUidTestScreenCaptureIf));
ASSERT_NOT_NULL(csc);
TSize compositionScreenSize;
User::LeaveIfError(csc->GetCompositedSize(compositionScreenSize));
iTestName.Format(_L("GRAPHICS_WSERV_CSC_102"));
INFO_PRINTF2(_L("%S"),&iTestName);
iDisplayMode = iScreenDevice->DisplayMode();
TRAPD(err, surfaceID = iUtility->CreateSurfaceL(compositionScreenSize,
KSurfaceFormat,
compositionScreenSize.iWidth * KBytesPerPixel));
ASSERT_EQUALS(err,KErrNone);
ConstructOpaqueWindowLC(testWindow,
iWhite,
0,
TPoint(0, 0),
compositionScreenSize);
iSession.Flush();
Pause(100);
CFbsBitmap *bmp1 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp1);
User::LeaveIfError(bmp1->Create(compositionScreenSize, EColor16MU));
// Invalid bitmap display mode
CFbsBitmap *bmp2 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp2);
User::LeaveIfError(bmp2->Create(compositionScreenSize, EColor256));
iSession.Flush();
Pause(500);
// Draw a pattern using WServ
SetBackgroundColorWindow(testWindow, iWhite);
TSize rectSize(100, 100);
testWindow.Invalidate();
testWindow.BeginRedraw();
iGc->Activate(testWindow);
iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
iGc->SetBrushColor(KRgbDarkRed);
iGc->DrawRect(TRect(TPoint(35, 5), rectSize));
iGc->SetBrushColor(KRgbBlack);
iGc->DrawRect(TRect(TPoint(55, 15), rectSize));
iGc->SetBrushColor(KRgbDarkBlue);
iGc->DrawRect(TRect(TPoint(75, 35), rectSize));
iGc->SetBrushColor(KRgbYellow);
iGc->DrawRect(TRect(TPoint(95, 55), rectSize));
iGc->Deactivate();
testWindow.EndRedraw();
iSession.Flush();
Pause(500);
iScreenDevice->CopyScreenToBitmap(bmp1);
iSession.Flush();
Pause(100);
ConstructOpaqueSurfacedWindowLC(surfacedTestWindow,
iRed,
0,
TPoint(0, 0),
compositionScreenSize,
surfaceID);
TRAP(err,iUtility->FillSurfaceL(surfaceID, iCyan));
ASSERT_EQUALS(err,KErrNone);
iSession.Flush();
Pause(500);
TRAP(err, iUtility->CopyBitmapToSurfaceL(surfaceID, *bmp1));
ASSERT_EQUALS(err,KErrNone);
iSession.Flush();
Pause(500);
// negative test, it should fail wit KErrArgument
TInt ret = csc->ComposeScreen(*bmp2);
ASSERT_EQUALS(ret, KErrArgument);
iUtility->DestroyAll();
CleanupStack::PopAndDestroy(&surfacedTestWindow);
CleanupStack::PopAndDestroy(bmp2);
CleanupStack::PopAndDestroy(bmp1);
CleanupStack::PopAndDestroy(&testWindow);
iSession.Flush();
Pause(1000);
}
/**
@SYMTestCaseID GRAPHICS_WSERV_CSC_105L
@SYMTestCaseDesc Correct bitmap size returned when in small screen mode
@SYMDEF DEF139191
@SYMPREQ CSC
@SYMTestStatus Implemented
@SYMTestPriority 1
@SYMTestPurpose Checking GetCompositedSize is correct on gce & acceptable behaviour in non gce mode
@SYMTestActions For every available screen mode
Get size from GetCompositedSize
Draw some coloured rectangles on screen
If gce, do a full screen surface, and paste the coloured rectangles into the surface
ComposeScreen - bitmap 1 should be the same as bitmap 2
Note - non GCE mode - GetCompositedSize returns unrotated appmode size, so only
compares the intersection of that with actual screen size
Note - gce mode - GetCompositedSize returns actual rotated screen size, so
does a complete screen comparison
@SYMTestExpectedResults All asserts should complete. Comparison should succeed!
*/
void CWSGceCsc::GRAPHICS_WSERV_CSC_105L()
{
iTestName.Format(_L("GRAPHICS_WSERV_CSC_105"));
INFO_PRINTF2(_L("%S"),&iTestName);
TInt err;
//get list of modes
RArray<TInt> screenModes;
err = iScreenDevice->GetScreenSizeModeList(&screenModes);
ASSERT_TRUE (err > 0);
//get first mode info
TPixelsAndRotation firstModeInfo;
iScreenDevice->GetScreenModeSizeAndRotation(screenModes[0],firstModeInfo);
//make sure csc is available
MTestScreenCapture* csc = static_cast<MTestScreenCapture*> (iScreenDevice->GetInterface(MTestScreenCapture::KUidTestScreenCaptureIf));
ASSERT_NOT_NULL(csc);
TBool differentSizes = EFalse;
TSizeMode currentModeInfo;
TSize compositionScreenSize;
//for every screen mode
for (TInt ii = 0; ii < screenModes.Count(); ++ii && !differentSizes)
{
//set mode
iScreenDevice->SetAppScreenMode(screenModes[ii]);
iScreenDevice->SetScreenMode(screenModes[ii]);
iSession.Flush();
Pause(100);
//get mode info
currentModeInfo = iScreenDevice->GetCurrentScreenModeAttributes();
if (currentModeInfo.iScreenSize.iWidth != firstModeInfo.iPixelSize.iWidth ||
currentModeInfo.iScreenSize.iHeight != firstModeInfo.iPixelSize.iHeight ||
currentModeInfo.iRotation != firstModeInfo.iRotation)
{ //note that we have modes of different sizes / rotations
differentSizes = ETrue;
}
RWindow testWindow(iSession);
RWindow surfacedTestWindow(iSession);
TSurfaceId surfaceID;
err = csc->GetCompositedSize(compositionScreenSize);
ASSERT_EQUALS (err,KErrNone);
iDisplayMode = iScreenDevice->DisplayMode();
if (GCEIsSupported())
{ //create a surface
TRAP(err, surfaceID = iUtility->CreateSurfaceL(compositionScreenSize,
KSurfaceFormat,
compositionScreenSize.iWidth * KBytesPerPixel));
ASSERT_EQUALS(err,KErrNone);
}
//create a basic window
ConstructOpaqueWindowLC(testWindow,
iWhite,
0,
-currentModeInfo.iOrigin,
compositionScreenSize); //negative origin to ensure it fills screen, not app mode area
iSession.Flush();
Pause(100);
//bitmap 1 to compare against
CFbsBitmap *bmp1 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp1);
User::LeaveIfError(bmp1->Create(compositionScreenSize, EColor16MU));
//bitmap 2 to pass into csc
CFbsBitmap *bmp2 = new (ELeave) CFbsBitmap;
CleanupStack::PushL(bmp2);
User::LeaveIfError(bmp2->Create(compositionScreenSize, EColor16MU));
//draw coloured rectangles in the test window
SetBackgroundColorWindow(testWindow, iWhite);
DrawBasicPattern (testWindow);
//copy screen to bitmap 1
err = iScreenDevice->CopyScreenToBitmap(bmp1);
ASSERT_EQUALS (err,KErrNone);
iSession.Flush();
Pause(100);
if (GCEIsSupported())
{ //place a window with a surface into the screen
ConstructOpaqueSurfacedWindowLC(surfacedTestWindow,
iRed,
0,
-currentModeInfo.iOrigin,
compositionScreenSize,
surfaceID); //negative origin to ensure it fills screen,not app mode area
//make surface boring cyan
TRAP(err,iUtility->FillSurfaceL(surfaceID, iCyan));
ASSERT_EQUALS(err,KErrNone);
iSession.Flush();
Pause(300);
//paste bitmap 1 contents into the surface
TRAP(err, iUtility->CopyBitmapToSurfaceL(surfaceID, *bmp1));
ASSERT_EQUALS(err,KErrNone);
iSession.Flush();
Pause(300);
}
//use csc to get a copy of the screen
err = csc->ComposeScreen(*bmp2);
ASSERT_EQUALS (err, KErrNone);
//should match the original bitmap copy of the screen
ASSERT_TRUE(Compare(*bmp1, *bmp2));
if (GCEIsSupported())
{
iUtility->DestroyAll();
CleanupStack::PopAndDestroy(&surfacedTestWindow);
}
else
{
surfacedTestWindow.Close();
}
CleanupStack::PopAndDestroy(bmp2);
CleanupStack::PopAndDestroy(bmp1);
CleanupStack::PopAndDestroy(&testWindow);
iSession.Flush();
Pause(300);
}
if (!differentSizes)
{
INFO_PRINTF1(_L("Didn't find screen modes of different sizes - test inconclusive"));
}
iScreenDevice->SetAppScreenMode(screenModes[0]);
iScreenDevice->SetScreenMode(screenModes[0]);
screenModes.Close();
}