--- a/windowing/windowserver/tdynamicres/src/wsdynamicresbase.cpp Tue Jun 22 15:21:29 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,603 +0,0 @@
-// 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:
-//
-
-#include <w32std.h>
-#include "wsdynamicresbase.h"
-#include "teflogextensions.h"
-#include "globalsettings.h"
-#include <bitdraw.h>
-#include <bitdrawinterfaceid.h>
-#include <bitdrawsurface.h>
-#include <graphics/surfaceconfiguration.h>
-#include "regionextend.h"
-
-
-#if defined(__X86GCC__)
-extern "C" TInt atexit(void (*function)(void))
- {
- return KErrNone;
- }
-#endif
-
-CWsDynamicResBase::CWsDynamicResBase():
- iUtility(this)
- {
- }
-
-CWsDynamicResBase::~CWsDynamicResBase()
- {
- }
-
-/**
-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 CWsDynamicResBase::SetupL()
- {
- SetupL(EFalse);
- }
-void CWsDynamicResBase::SetupL(TBool aUseOtherScreenForInfo)
- {
- CWsDynamicResWinBase::SetupL(aUseOtherScreenForInfo);
-
-
-//clean-up if previous test abended
- if (PostTestCleanupInstance().iSharedUtility)
- {
-//Temp removed - may be causing ONB fails!
-// if (PostTestCleanupInstance().iSharedUtility->DestroyAll())
-// {
-// INFO_PRINTF1(_L("Destroyed some surfaces from previous test."));
-//
-// }
- }
- if (!PostTestCleanupInstance().iCleanedUpOnExit)
- PostTestCleanupInstance().iCleanedUpOnExit=EFalse;
-
- if (!GCEIsSupported())
- {
- INFO_PRINTF1(_L("Some Setup skipped: GCE support is not loaded"));
- return;
- }
-
- TRAPD(err_FailedToCreateSurfaceUtility, iUtility = CSurfaceUtility::NewL( PostTestCleanupInstance().iSharedUtility));
- ASSERT_EQUALS(err_FailedToCreateSurfaceUtility,KErrNone);
-
-
- }
-
-/**
-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 CWsDynamicResBase::TearDownL()
- {
- CWsDynamicResWinBase::TearDownL();
- delete iUtility();
- PostTestCleanupInstance().iCleanedUpOnExit=ETrue;
- //Pause(1000);
- }
-/**
- * Note that this is not the ideal mechanism.
- * A derived class may thinks its TearDown is safe to do from delete, but in the class it is derived from it may not be safe
- **/
-void CWsDynamicResBase::TearDownFromDeleteL()
- {
- CWsDynamicResBase::TearDownL();
- }
-
-//Allocating an instance of surface utility here means all test code instances will share the same instance of the utility class.
-// Owns the singleton
-/*static*/ const CWsDynamicResBase::TPostTestCleanup& CWsDynamicResBase::PostTestCleanupInstance()
- {
- static
- class RPostTestCleanup:public TPostTestCleanup
- {
- public:
- RPostTestCleanup()
- {
- iSharedUtility=NULL;
- iCleanedUpOnExit=ETrue;
- }
- ~RPostTestCleanup()
- {
- // I want to cleanly release the surface utility, but at this point the threads have already been pulled down!
- // if (iSharedUtility)
- // delete iSharedUtility;
- iSharedUtility=NULL; //avoid phoenix behaviour
- }
- } staticInstance;
- return staticInstance;
- }
-
-void CWsDynamicResBase::TPostTestCleanup::CreateSharedUtilityL()const
- {
- if (iSharedUtility==NULL)
- iSharedUtility=CSurfaceUtility::NewL();
- }
-
-/**
-Pause for the given number of milliseconds.
-
-@param aMilliseconds Time to wait in milliseconds.
-*/
-void CWsDynamicResBase::Pause(TInt aMilliseconds)
- {
- User::After(TTimeIntervalMicroSeconds32(aMilliseconds * 1000));
- }
-
-/** Creates the normal scenario used by these tests.
- * With a large window behind and small window in front.
- * If the windows already exist then they are just repositioned and redrawn.
- * @param aOuterRect Position of back window
- * @param aOuterColor Background colour for back window
- * @param aInnerRect Position of front window
- * @param aInnerColor Background colour for front window
- *
- **/
-void CWsDynamicResBase::MakeTestWindowPairL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor)
- {
- if (!iTestBack.WsHandle())
- {
- iTestBack=RWindow(iSession);
- ASSERT_EQUALS_X(iTestBack.Construct(iGroup, ++iWindowHandle), KErrNone);
-#ifdef FLICKER
- iTestBack.Activate();
-#endif
- iTestBack.SetRequiredDisplayMode(iDisplayMode);
- iTestBack.SetBackgroundColor(aOuterColor);
- iTestBack.SetExtent(aOuterRect.iTl,aOuterRect.Size());
-#ifndef FLICKER
- iTestBack.Activate();
-#endif
- }
- else
- {
- iTestBack.SetRequiredDisplayMode(iDisplayMode);
- iTestBack.SetBackgroundColor(aOuterColor);
- iTestBack.SetExtent(aOuterRect.iTl,aOuterRect.Size());
- }
- iTestBack.BeginRedraw();
- ActivateWithWipe(iGc,iTestBack,aOuterColor);
- iGc->Deactivate();
- iTestBack.EndRedraw();
- iTestBack.SetVisible(ETrue);
-
- if (!iTestFront.WsHandle())
- {
- iTestFront=RWindow(iSession);
- ASSERT_EQUALS_X(iTestFront.Construct(iGroup, ++iWindowHandle), KErrNone);
-#ifdef FLICKER
- iTestFront.Activate();
-#endif
- iTestFront.SetRequiredDisplayMode(iDisplayMode);
- iTestFront.SetBackgroundColor(aInnerColor);
- iTestFront.SetExtent(aInnerRect.iTl,aInnerRect.Size());
-
-#ifndef FLICKER
- iTestFront.Activate();
-#endif
- }
- else
- {
- iTestFront.SetRequiredDisplayMode(iDisplayMode);
- iTestFront.SetBackgroundColor(aInnerColor);
- iTestFront.SetExtent(aInnerRect.iTl,aInnerRect.Size());
- }
-
- DrawPlainUI(iTestFront,EFalse,aInnerColor);
- iTestFront.SetVisible(ETrue);
-
- }
-
-void CWsDynamicResBase::LargerTestWindow(TInt aPercentOfBack)
- {
- TRect newPos=iTestPos;
- TSize backSize=iTestPos.Size();
- newPos.Grow((aPercentOfBack-100)*backSize.iWidth/200,(aPercentOfBack-100)*backSize.iHeight/200);
- iCenteredFrontWinRect=newPos;
- if (iTestFront.WsHandle())
- {
- iTestFront.SetExtent(newPos.iTl,newPos.Size());
- }
-
- }
-
-/** Destroys some or all of the test windows so the test can loop (or test the state after destruction.
- * The windows are destroyed when the test exits normally.
- * Child windows are automatically killed when parent window is killed!
- *
- **/
-void CWsDynamicResBase::DestroyTestWindowPair(TBool aKillTestBack,TBool aKillTestFront,TBool aKillTestChildren)
- {
- if (aKillTestBack && iTestBack.WsHandle())
- {
- iTestBack.Close();
- }
- if (aKillTestFront && iTestFront.WsHandle())
- {
- iTestFront.Close();
- }
- if (aKillTestChildren)
- {
- if (iTestChild.WsHandle())
- {
- iTestChild.Close();
- }
- if (iTestSecondChild.WsHandle())
- {
- iTestSecondChild.Close();
- }
- }
- }
-/** Creates a child window inside the front window of the usual test scenario
-* With a large window behind and small window in front.
- * If the windows already exist then they are just repositioned and redrawn.
- * @param aOuterRect Position of back window
- * @param aOuterColor Background colour for back window
- * @param aInnerRect Position of front window
- * @param aInnerColor Background colour for front window
- * @param aChildRect Position of child window
- * @param aChildColor Background colour for child window
- * @param aSecondChildRect Position of Second child window
- * @param aSecondChildColor Background colour for Second child window
- *
- **/
-void CWsDynamicResBase::MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor)
- {
- MakeTestWindowTripleL(aOuterRect,aOuterColor,aInnerRect,aInnerColor,aChildRect,aChildColor);
-
- MakeExtraChildWindowL(iTestChild,aSecondChildRect,aSecondChildColor);
- }
-
-/** Creates a child window inside the front window of the usual test scenario
-* With a large window behind and small window in front.
- * If the windows already exist then they are just repositioned and redrawn.
- * @param aOuterRect Position of back window
- * @param aOuterColor Background colour for back window
- * @param aInnerRect Position of front window
- * @param aInnerColor Background colour for front window
- * @param aChildRect Position of child window
- * @param aChildColor Background colour for child window
- * @param aSecondChildRect Position of second child window
- * @param aSecondChildColor Background colour for second child window
- *
- **/
-void CWsDynamicResBase::CreateTestWindowQuadL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor)
- {
- MakeTestWindowTripleL(aOuterRect,aOuterColor,aInnerRect,aInnerColor,aChildRect,aChildColor);
-
- MakeExtraChildWindowL(iTestFront,aSecondChildRect,aSecondChildColor);
- }
-
-void CWsDynamicResBase::MakeExtraChildWindowL(const RWindowBase& aFromParent,TRect aChildRect,TRgb aChildColor)
- {
- ASSERT(aFromParent.WsHandle());
- if (!iTestSecondChild.WsHandle())
- {
- iTestSecondChild=RWindow(iSession);
- ASSERT_EQUALS_X(iTestSecondChild.Construct(aFromParent, ++iWindowHandle), KErrNone);
- iTestSecondChild.SetRequiredDisplayMode(iDisplayMode);
- }
- iTestSecondChild.SetBackgroundColor(aChildColor);
- iTestSecondChild.SetExtent(aChildRect.iTl,aChildRect.Size());
- iTestSecondChild.Activate();
- iTestSecondChild.BeginRedraw();
- iGc->Activate(iCompare);
- iGc->SetBrushColor(iBlue);
- iGc->Clear();
- iGc->Deactivate();
- iTestSecondChild.EndRedraw();
- iTestSecondChild.SetVisible(ETrue);
- }
-
-CWsDynamicResBase::LoopingGcPtr CWsDynamicResBase::LoopBeginActivateWithWipe(const TRegion& aRegion,RWindow& aWin,TRgb aColor)
- {
- InvalidateRegion(aRegion,aWin);
- return LoopingGcPtr(aRegion,aWin,aColor,GcForWindow(aWin));
- }
-
-//This gets called each itteration of the while loop, and is used to step the rectangle count!
-void CWsDynamicResBase::LoopingGcPtr::operator ++()
- {
- iPass++;
- if (iPass<iRegion.Count())
- { //Invalidate all the rectangles in the region
- iWin.BeginRedraw(iRegion[iPass]);
- CWsDynamicResWinBase::ActivateWithWipe(iGc,iWin,iColor);
-// return true;
- }
- else
- {
- iGc=NULL;
-// return false;
- }
- }
-
-CWindowGc* CWsDynamicResBase::BeginActivateWithWipe(TBool aInvalidate,RWindow& aWin,TRgb aColor)
- {
- return CWsDynamicResWinBase::BeginActivateWithWipe(aInvalidate,aWin,aColor);
- }
-
-CWindowGc* CWsDynamicResBase::BeginActivateWithWipe(TBool aInvalidate,TRect aRect,RWindow& aWin,TRgb aColor)
- {
- return CWsDynamicResWinBase::BeginActivateWithWipe(aInvalidate,aRect,aWin,aColor);
- }
-
-CWindowGc* CWsDynamicResBase::BeginActivateWithWipe(const TRegion& aRegion,RWindow& aWin,TRgb aColor)
- {
- return CWsDynamicResWinBase::BeginActivateWithWipe(aRegion,aWin,aColor);
- }
-
-/** Creates a child window inside the front window of the usual test scenario
-* With a large window behind and small window in front.
- * If the windows already exist then they are just repositioned and redrawn.
- * @param aOuterRect Position of back window
- * @param aOuterColor Background colour for back window
- * @param aInnerRect Position of front window
- * @param aInnerColor Background colour for front window
- * @param aChildRect Position of child window
- * @param aChildColor Background colour for child window
- *
- **/
-void CWsDynamicResBase::MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor)
- {
- MakeTestWindowPairL(aOuterRect,aOuterColor,aInnerRect,aInnerColor);
- ASSERT(iTestFront.WsHandle());
-
- if (!iTestChild.WsHandle())
- {
- iTestChild=RWindow(iSession);
- ASSERT_EQUALS_X(iTestChild.Construct(iTestFront, ++iWindowHandle), KErrNone);
- iTestChild.SetRequiredDisplayMode(iDisplayMode);
- }
- iTestChild.SetBackgroundColor(aChildColor);
- iTestChild.SetExtent(aChildRect.iTl,aChildRect.Size());
- iTestChild.Activate();
- iTestChild.BeginRedraw();
- iGc->Activate(iCompare);
- iGc->SetBrushColor(iBlue);
- iGc->Clear();
- iGc->Deactivate();
- iTestChild.EndRedraw();
- iTestChild.SetVisible(ETrue);
- }
-/**
- * Generates a valid surfaceID for the current display mode.
- * This is then used in negative testing.
- *
- *
- **/
-void CWsDynamicResBase::UISurfaceL(TSurfaceId& aSurfaceId) const
- {
- CFbsDrawDevice* screenDevice=NULL;
- TDisplayMode displayMode=iScreenDevice->DisplayMode();
- screenDevice = CFbsDrawDevice::NewScreenDeviceL(TGlobalSettings::Instance().iScreen, displayMode);
- CleanupStack::PushL(screenDevice);
- TAny* p=NULL;
- User::LeaveIfError(screenDevice->GetInterface(KSurfaceInterfaceID, p));
- MSurfaceId* uiSurface = static_cast<MSurfaceId*>(p);
- uiSurface->GetSurface(aSurfaceId);
- CleanupStack::PopAndDestroy(screenDevice);
- }
-
-/**
-Common set up code for creating a surface based window.
-
-Given window and surface objects and a color: creates the window and surface,
-sets the window to a default size (the same as the surface), sets the background
-to the bitwise inverse of the given color, sets the surface as the background,
-fills the surface with the color and completes a redraw to prevent an event.
-
-@param aWindow The window object, connected to a session.
-@param aSurface The surface object, to be initialized.
-@param aColor The color to fill the surface with.
-*/
-void CWsDynamicResBase::CommonSurfaceWindowSetupL(RWindow& aWindow, TSurfaceId& aSurface, const TRgb& aColor)
- {
- TInt err = KErrNone;
-
- TRAP(err, aSurface = iUtility->CreateSurfaceL(TSize(KSurfaceWidth, KSurfaceHeight),
- KSurfaceFormat, KSurfaceWidth * KBytesPerPixel));
- PRINT_ON_ERROR2_L(err, _L("Failed to create surface: %d"), err);
- ASSERT_EQUALS_X(aWindow.Construct(iGroup, ++iWindowHandle), KErrNone);
-
- aWindow.SetRequiredDisplayMode(iDisplayMode);
- aWindow.SetExtent(TPoint(0, 0), TSize(KSurfaceWidth, KSurfaceHeight));
- aWindow.SetBackgroundColor(TRgb(aColor.Value() ^ 0xFFFFFF));
-
- ASSERT_EQUALS_X(aWindow.SetBackgroundSurface(aSurface), KErrNone);
-
- TRAP(err, iUtility->FillSurfaceL(aSurface, aColor));
- PRINT_ON_ERROR2_L(err, _L("Failed to fill surface: %d"), err);
- DrawUIContent(aWindow);
- }
-
-/**
-Common set up code for resizing tests.
-
-Similar to the common surface window code, but filling the surface with a grid
-instead of a solid color. The grid lines are always black. Also, the background
-color is always blue.
-*/
-void CWsDynamicResBase::ResizeTestCommonSetupL(RWindow& aWindow, const TRgb& aColor)
- {
- // Session and group created in SetUpL()
-
- TSurfaceId surface;
- TInt err = KErrNone;
-
- TRAP(err, surface = iUtility->CreateSurfaceL(TSize(KSurfaceWidth, KSurfaceHeight),
- KSurfaceFormat, KSurfaceWidth * KBytesPerPixel));
- PRINT_ON_ERROR2_L(err, _L("Failed to create surface: %d"), err);
-
- ASSERT_EQUALS_X(aWindow.Construct(iGroup, ++iWindowHandle), KErrNone);
-
- aWindow.SetRequiredDisplayMode(iDisplayMode);
- aWindow.SetExtent(TPoint(0, 0), TSize(KSurfaceWidth, KSurfaceHeight));
- aWindow.SetBackgroundColor(iBlue);
- ASSERT_EQUALS_X(aWindow.SetBackgroundSurface(surface), KErrNone);
-
- TRAP(err, iUtility->GridFillSurfaceL(surface, aColor, TRgb(0)));
- PRINT_ON_ERROR2_L(err, _L("Failed to grid fill surface: %d"), err);
- DrawUIContent(aWindow);
- }
-
-CFbsBitmap* CWsDynamicResBase::RotateBitmapLC(const CFbsBitmap* aSrcBitmap)
- {
- CFbsBitmap* rv=new CFbsBitmap;
- CleanupStack::PushL(rv);
- TSize srcSize=aSrcBitmap->SizeInPixels();
- rv->Create(TSize(srcSize.iHeight,srcSize.iWidth),EColor16MA);
- TRgb* linestore=new TRgb[srcSize.iHeight];
- TPtr8 buff((unsigned char*)linestore,srcSize.iHeight*sizeof(TRgb),srcSize.iHeight*sizeof(TRgb));
- for (TInt col=0;col<aSrcBitmap->SizeInPixels().iWidth;col++)
- {
- for (TInt row=0,brow=srcSize.iHeight-1;row<srcSize.iHeight;row++,brow--)
- {
- aSrcBitmap->GetPixel(linestore[row],TPoint(col,brow));
- }
- rv->SetScanLine(buff,col);
- }
- delete[] linestore;
- return rv;
- }
-
-
-//
-//
-//
-// Pattern checking. Is a given pattern still present?
-// To make life interesting, the pattern is stored backwards!
-// The pattern is fibonnacci sequence masked to byte:
-// 1 2 3 5 8 13 21 34 55 89 144 233 121
-// 98 219 61 24 85 109 194 47 241 32 17 49 66
-// 115 181 40 221 5 226 231 201 176 121 41 162
-//
-//
-void Pattern::Fill(void* aTrg,TInt aOffset,TInt aLength)
- {
- unsigned char* ptr=(unsigned char*)aTrg;
- TInt a=0;
- TInt b=1;
- while (--aLength)
- {
- TInt c=a+b;
- *(ptr+aOffset+aLength)=c&0xff;
- a=b;
- b=c;
- }
- }
-TBool Pattern::Check(void* aTrg,TInt aOffset,TInt aLength)
- {
- unsigned char* ptr=(unsigned char*)aTrg;
- TInt a=0;
- TInt b=1;
- while (--aLength)
- {
- TInt c=a+b;
- if (*(ptr+aOffset+aLength)!=c&0xff)
- return EFalse;
- a=b;
- b=c;
- }
- return ETrue;
- }
-TBool Pattern::CheckVal(void* aTrg,TInt aOffset,TInt aLength,char val)
- {
- unsigned char* ptr=(unsigned char*)aTrg;
- while (--aLength)
- {
- if (*(ptr+aOffset+aLength)!=val&0xff)
- return EFalse;
- }
- return ETrue;
- }
-
-//I have removed these only because they use TRegionExtend
-//
-//TInt CWsDynamicResBase::RegionDiffForUiLayer(TInt aUiLayer)
-// {
-// EWsDebugGetUILayerConfig, //return: TSurfaceConfig //Index UI layer via EWsDebugArgLayerMask
-// EWsDebugGetUILayerBase, //return: TRect[]
-//
-// RRegion layerRegion;
-// TInt layerRegionLen=iSession.DebugInfo(EWsDebugGetUILayerBase,iSession.ObjInd(0,aUiLayer),layerRegion);
-// if (layerRegionLen==KErrCancel)
-// return TRegionExtend::EExact;
-// ASSERT_TRUE(layerRegionLen>=0);
-// TBuf8<sizeof(TSurfaceConfiguration)> configBuf(sizeof(TSurfaceConfiguration));
-// const TSurfaceConfiguration* config;
-// TInt configLen=iSession.DebugInfo(EWsDebugGetUILayerConfig,iSession.ObjInd(0,aUiLayer),configBuf,config);
-// ASSERT_TRUE(configLen>=0);
-// TRect layerExtent;
-// config->GetExtent(layerExtent);
-// TInt retVal=TRegionExtend::Cast(layerRegion).TestDifference(layerExtent.Size());
-// layerRegion.Close();
-// return retVal;
-// }
-//CWsDynamicResBase::FastPathMode CWsDynamicResBase::DeduceUiFastPathMode()
-// {
-// TInt blendedRegionState=RegionDiffForUiLayer(0);
-// TInt opaqueRegionState=RegionDiffForUiLayer(1);
-// if (blendedRegionState&TRegionExtend::ENoIntersect)
-// {
-// if (opaqueRegionState&TRegionExtend::ENoIntersect)
-// {
-// return EFpExternalOpaque; //fullscreen fast-path external surface
-// }
-// else
-// if (opaqueRegionState&TRegionExtend::EAdd)
-// {
-// return (FastPathMode)(EFpUiOpaque|EFpUiRegions); //windowed max-opt no blending
-// }
-// else
-// {
-// return EFpUiOpaque; //full-screen fastpath
-// }
-// }
-// else
-// {
-// if (opaqueRegionState&TRegionExtend::ENoIntersect)
-// {
-// if (blendedRegionState&TRegionExtend::EAdd)
-// {
-// return (FastPathMode)(EFpUiBlended|EFpUiRegions); //windowed max-opt no opaque
-// }
-// else
-// {
-// return (EFpUiBlended); //full-screen blended
-// }
-// }
-// else
-// {
-// if ((blendedRegionState|opaqueRegionState)&TRegionExtend::EAdd)
-// {
-// return (FastPathMode)(EFpUiComplex|EFpUiRegions); //moxed blending, opaque and external max optimisation
-// }
-// else
-// {
-// return EFpUiComplex; //Error! blend and opaque both enabled and full-screen!
-// }
-// }
-//
-// }
-// }