diff -r 2717213c588a -r 171fae344dd4 windowing/windowserver/tdynamicres/src/t_wsdynamicreswinbase.cpp --- a/windowing/windowserver/tdynamicres/src/t_wsdynamicreswinbase.cpp Tue Jun 22 15:21:29 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,980 +0,0 @@ -// Copyright (c) 2008-2010 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 -#include -#include -#include -#include "teflogextensions.h" -#include "t_wsdynamicreswinbase.h" -#include "globalsettings.h" -#include -#include -#include -#include -#include - -#if (!defined(K_DISPLAY_CH_MAJOR_VERSION_NUMBER) && !defined(K_DISPLAY_CH_MINOR_VERSION_NUMBER)) -#define MODE_CHANGE_BASE_FUNCTIONALITY_NOT_PRESENT_IN_HEADER -#endif - -_LIT(KMonospaceTestFontTypefaceName,"Arial"); -const TInt KMaxFontSize = 150; -TBool CWsDynamicResWinBase::iTransparencyEnabled=EFalse; - -CWsDynamicResWinBase::CWsDynamicResWinBase(): - iDoTearDown(EFalse), - iSession(TGlobalSettings::Instance().iScreen) -{ -} - -void CWsDynamicResWinBase::SetupL() - { - SetupL(EFalse); - } -CActiveScheduler CWsDynamicResWinBase::iScheduler; - -void CWsDynamicResWinBase::SetupL(TBool aUseOtherScreenForInfo) - { - if (CActiveScheduler::Current()!=&iScheduler) - { - new (&iScheduler) CActiveScheduler; - CActiveScheduler::Install(&iScheduler); - } - iDoTearDown=ETrue; - iRed.SetInternal(0xFFFF0000); - iGreen.SetInternal(0xFF00FF00); - iBlue.SetInternal(0xFF0000FF); - iCyan.SetInternal(0xFF00FFFF); - iMagenta.SetInternal(0xFFFF00FF); - iYellow.SetInternal(0xFFFFFF00); - iWhite.SetInternal(0xFFFFFFFF); - iLastGceHoleColor.SetInternal(0); - TITLE_BACKGROUND=iCyan; - COMPARE_BACKGROUND=iBlue; - - ASSERT_EQUALS_X(iSession.Connect(), KErrNone); - - {//Stolen from TAuto CloseAllPanicWindows() - TInt idFocus = iSession.GetFocusWindowGroup(); - TWsEvent event; - event.SetType(EEventKey); //EEventKeyDown - TKeyEvent *keyEvent = event.Key(); - keyEvent->iCode = EKeyEscape; - keyEvent->iScanCode = EStdKeyEscape; - keyEvent->iModifiers = 0; - TInt theLimit = 50; - while(idFocus != NULL && (theLimit-- > 0)) - { - iSession.SendEventToAllWindowGroups(event); - TInt idNewFocus = iSession.GetFocusWindowGroup(); - if (idNewFocus!=idFocus) - { - INFO_PRINTF1(_L("A window was closed [probably a panic box from the previous test].")); - } - idFocus=idNewFocus; - } - } - TInt err = KErrNone; - - TRAP(err, iScreenDevice = new (ELeave) CWsScreenDevice(iSession)); - PRINT_ON_ERROR2_L(err, _L("Failed to create screen device: %d"), err); - ASSERT_EQUALS_X(iScreenDevice->Construct(TGlobalSettings::Instance().iScreen), KErrNone); - iDisplayMode = iScreenDevice->DisplayMode(); // Get default display mode - - CheckAndConnectScreen(); - - TRAP(err, iGc = new (ELeave) CWindowGc(iScreenDevice)); - PRINT_ON_ERROR2_L(err, _L("Failed to create graphics context: %d"), err); - ASSERT_EQUALS_X(iGc->Construct(), KErrNone); - - iGroup = RWindowGroup(iSession); - ASSERT_EQUALS_X(iGroup.Construct(++iWindowHandle,iScreenDevice), KErrNone); - iGroup.SetOrdinalPositionErr(0, KPasswordWindowGroupPriority - 1); // Added code ---- Fastpath - iSession.Flush(); - - if (aUseOtherScreenForInfo) - { - if (iSession.NumberOfScreens()>1) - { //Create server objects for info windows to appear on alternate screen - TInt alternateScreenNum=iSession.NumberOfScreens()-1; - if (TGlobalSettings::Instance().iScreen==alternateScreenNum) - { //Alternate screen is last screen, or first screen if that is being tested. - alternateScreenNum=0; - } - - TRAP(err, iInfoScreenDevice = new (ELeave) CWsScreenDevice(iSession)); - PRINT_ON_ERROR2_L(err, _L("Failed to create second screen device: %d"), err); - ASSERT_EQUALS_X(iInfoScreenDevice->Construct(alternateScreenNum), KErrNone); - - TRAP(err, iInfoGc = new (ELeave) CWindowGc(iInfoScreenDevice)); - PRINT_ON_ERROR2_L(err, _L("Failed to create second graphics context: %d"), err); - ASSERT_EQUALS_X(iInfoGc->Construct(), KErrNone); - - iInfoGroupInstance = RWindowGroup(iSession); - ASSERT_EQUALS_X(iInfoGroupInstance.Construct(++iWindowHandle,iInfoScreenDevice), KErrNone); - iInfoGroup=&iInfoGroupInstance; - } - else - { //If alternate screen is not available then no text or compare windows should be created! - iInfoScreenDevice=iScreenDevice; //it is "convenient" for the device to still be good. - iInfoGc=NULL; - iInfoGroup=NULL; - } - } - else - { // - iInfoScreenDevice=iScreenDevice; - iInfoGc=iGc; - iInfoGroup=&iGroup; - } - - if (iInfoGroup && iInfoGc) - { - // Add a plain background window to obscure anything else that - // happens to be behind the test. Setting this window's display mode is also - // used to set the screen device display mode, and hence the composition - // mode: alpha or chroma key. - iBackground = RBlankWindow(iSession); - ASSERT_EQUALS_X(iBackground.Construct(*iInfoGroup, ++iWindowHandle), KErrNone); - - iBackground.SetOrdinalPosition(100); // Behind anything else in this group. - iBackground.SetColor(TRgb(iWhite)); - //iBackground.SetExtent(TPoint(-1000,-1000),TSize(3000,3000)); - iBackground.Activate(); - iBackground.SetVisible(ETrue); - } - iSession.Flush(); - - RWindow testTrans(iSession); - ASSERT_EQUALS_X(testTrans.Construct(iGroup, ++iWindowHandle), KErrNone); - iTransparencyEnabled=(testTrans.SetTransparencyFactor(iWhite)==KErrNone); - if (iTransparencyEnabled) - { - TTestName testName; - testName.Format(_L("Screen %i, depth %i: Found Trans Man"), - TGlobalSettings::Instance().iScreen - ); - UpdateTitleWindowL(testName,KMaxInfoLines-1); - } - else - { - TTestName testName; - testName.Format(_L("Screen %i, depth %i: No Trans Man"), - TGlobalSettings::Instance().iScreen - ); - UpdateTitleWindowL(testName,KMaxInfoLines-1); - } - testTrans.Close(); - } - - -void CWsDynamicResWinBase::CheckAndConnectScreen() - { - if (TGlobalSettings::Instance().iDisconnected) //set from script file to match wsini keyword SIMULATE_STARTUP_DISCONNECTED - { - //Verify that the display really is disconnected - ASSERT_TRUE_X(iScreenDevice != NULL); - MDisplayControl* interface = static_cast(iScreenDevice->GetInterface(MDisplayControl::ETypeId)); - ASSERT_TRUE_X(interface != NULL); - RArray resolutions; - const TInt err = interface->GetResolutions(resolutions); - ASSERT_EQUALS_X(err, KErrDisconnected); - resolutions.Close(); - } - -#ifndef MODE_CHANGE_BASE_FUNCTIONALITY_NOT_PRESENT_IN_HEADER - //make sure display is attached to screen (only if I/F is available at compile time...) - TInt displayState = ENormalResolution; - UserSvr::HalFunction(EHalGroupDisplay | (TGlobalSettings::Instance().iScreen<<16), EDisplayHalSetDisplayState, &displayState, NULL); - Pause(200); -#endif - - if (TGlobalSettings::Instance().iDisconnected) - { - //Verify that the display now is connected - MDisplayControl* interface = static_cast(iScreenDevice->GetInterface(MDisplayControl::ETypeId)); - RArray resolutions; - const TInt err = interface->GetResolutions(resolutions); - ASSERT_EQUALS_X(err, KErrNone); - const_cast(TGlobalSettings::Instance()).iDisconnected = EFalse; - resolutions.Close(); - } - } - -/** -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 CWsDynamicResWinBase::TearDownL() - { - iDoTearDown=EFalse; - if (iInfoGc!=iGc) - delete iInfoGc; - delete iGc; - if (iInfoScreenDevice!=iScreenDevice) - delete iInfoScreenDevice; - delete iScreenDevice; - - iGroup.Close(); - if (iInfoGroupInstance.WsHandle()) - iInfoGroupInstance.Close(); - iSession.Flush(); - iSession.Close(); - } -/** - * 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 CWsDynamicResWinBase::TearDownFromDeleteL() - { - CWsDynamicResWinBase::TearDownL(); //Explicitly call the non-derived implementation. - } - -CWsDynamicResWinBase::~CWsDynamicResWinBase() -{ - if (iDoTearDown) - TearDownFromDeleteL(); //This mechanism is not entirely clean to use. -} -/** -Pause for the given number of milliseconds. - -@param aMilliseconds Time to wait in milliseconds. -*/ -void CWsDynamicResWinBase::Pause(TInt aMilliseconds) - { - User::After(TTimeIntervalMicroSeconds32(aMilliseconds * 1000)); - } -// This handles any non-member uses of the extended ASSERT_XXX macros -void TefUnitFailLeaveL() - { - - User::Leave(KErrTEFUnitFail); - } -/** - * side-effect: log the state info just before I leave! - * Note that this only logs intentional assertion failures. - * Fails due to panics or throws won't log this info. - **/ -void CWsDynamicResWinBase::TefUnitFailLeaveL() - { - for (TInt line=0;line aTitle,TRefByValue aDetail) - { - iTestName=aTitle; - iTestInfo[0]=aDetail; - - TRect screenSize(iInfoScreenDevice->SizeInPixels()); - TPoint oneThird(screenSize.iBr.iX/3,screenSize.iBr.iY/3); - TRect winSize(0,0,oneThird.iX,oneThird.iY); - - if (oneThird.iX>oneThird.iY) - { - oneThird.iY=0; - winSize.iBr.iY=screenSize.iBr.iY; - } - else - { - oneThird.iX=0; - winSize.iBr.iX=screenSize.iBr.iX; - } - winSize.Shrink(5,5); - - if (iInfoGc) - { - iTitle=RWindow(iSession); - ASSERT_EQUALS_X(iTitle.Construct(*iInfoGroup, ++iWindowHandle), KErrNone); - iTitle.SetBackgroundColor(iCyan); - iTitle.SetExtent(winSize.iTl,winSize.Size()); - iTitle.Activate(); - - RepaintTitleWindowL(); - iTitle.SetVisible(ETrue); - - winSize.Move(oneThird); - iCompare=RWindow(iSession); - ASSERT_EQUALS_X(iCompare.Construct(*iInfoGroup, ++iWindowHandle), KErrNone); - iCompare.SetBackgroundColor(COMPARE_BACKGROUND); - iCompare.SetExtent(winSize.iTl,winSize.Size()); - iCompare.Activate(); - iCompare.BeginRedraw(); - ActivateWithWipe(iInfoGc,iCompare,COMPARE_BACKGROUND); - - TFontSpec fspec(KMonospaceTestFontTypefaceName,KMaxFontSize); - CFont *font=NULL; - ASSERT_EQUALS(iScreenDevice->GetNearestFontToDesignHeightInTwips(font,fspec),KErrNone); - iInfoGc->UseFont(font); - iInfoGc->DrawText(_L("Simulation"),winSize.Size(),winSize.Size().iHeight-5,iGc->ECenter); - - iInfoGc->Deactivate(); - iCompare.EndRedraw(); - iCompare.SetVisible(ETrue); - if (iScreenDevice!=iInfoScreenDevice) - { - winSize.Move(-oneThird); - } - else - { - winSize.Move(oneThird); - } - } - else - { - winSize=iScreenDevice->SizeInPixels(); - } - - iTestPos=winSize; - iTestPointCentre=winSize.Center(); - iCenteredFrontWinRect=winSize; - iCenteredFrontWinRect.Shrink(winSize.Size().iWidth/3,winSize.Size().iHeight/3); - - } -/** Makes the compare window larger by covering the test window area as well. - * Copes with vertically aligned screens, but will be naughty if called multiple times!!! - * @param aGoLarger If set false, resets the size back. - **/ -void CWsDynamicResWinBase::LargerCompareWindow(TBool aGoLarger) - { - TPoint currPos=iCompare.AbsPosition(); - TSize currSize=iCompare.Size(); - if (currPos.iX>=1; - } - else - { - if (aGoLarger) - currSize.iWidth<<=1; - else - currSize.iWidth>>=1; - } - iCompare.SetSize(currSize); - } - - -/** Puts a line of text on the LHS window. - * Repaints the window. The line of text will also be shown in the log if the test fails. - * @param aDetail The text to display - * @param aIndex The row number to display at - **/ -void CWsDynamicResWinBase::UpdateTitleWindowL(TRefByValue aDetail,TInt aIndex) - { - ASSERT(aIndex>=0 && aIndexActivate(aWin); - aGc->SetBrushColor(aColor); - aGc->SetBrushStyle(CGraphicsContext::ESolidBrush); - if (aColor!=TRgb(0,0) && !iTransparencyEnabled) //presume that all redraw-stored windows will draw background - { - aGc->Clear(); - return ETrue; //window was cleared - } - return EFalse; - } - -CWindowGc* CWsDynamicResWinBase::GcForWindow(RWindow& aWin) - { - if (aWin.WsHandle()==NULL) - return NULL; //can't activate uninitialised window. - CWindowGc* gc=iGc; - if (iGc!=iInfoGc) - if (&aWin==&iCompare || &aWin==&iTitle) - gc=iInfoGc; - else if (iInfoGroup && aWin.WindowGroupId()==iInfoGroup->WindowGroupId()) - gc=iInfoGc; - return gc; - } -/** Activates an appropriate predefined GC on the specified window and wipes the background if necessary. - * @param aWin The window to wipe - * @param aColor The colour to wipe with (if necessary) - * @return the GC to use for drawing and deactivate at end. This may be NULL if the window is not "live" - **/ -CWindowGc* CWsDynamicResWinBase::BeginActivateWithWipe(TBool aInvalidate,RWindow& aWin,TRgb aColor) - { - CWindowGc* gc=GcForWindow(aWin); - iSession.Flush(); - if (gc==NULL) - return gc; //can't activate uninitialised window. - if (aInvalidate) - aWin.Invalidate(); - iSession.Flush(); - aWin.BeginRedraw(); - iSession.Flush(); - ActivateWithWipe(gc,aWin,aColor); - return gc; - } - -/** Activates an appropriate predefined GC on the specified window and wipes the background if necessary. - * @param aWin The window to wipe - * @param aColor The colour to wipe with (if necessary) - * @return the GC to use for drawing and deactivate at end. This may be NULL if the window is not "live" - **/ -CWindowGc* CWsDynamicResWinBase::BeginActivateWithWipe(TBool aInvalidate,TRect aRect,RWindow& aWin,TRgb aColor) - { - if (aWin.WsHandle()==NULL) - return NULL; //can't activate uninitialised window. - if (aInvalidate) - aWin.Invalidate(aRect); - aWin.BeginRedraw(aRect); - CWindowGc* gc=iGc; - if (iGc!=iInfoGc) - if (&aWin==&iCompare || &aWin==&iTitle) - gc=iInfoGc; - else if (aWin.WindowGroupId()==iInfoGroup->WindowGroupId()) - gc=iInfoGc; - ActivateWithWipe(gc,aWin,aColor); - return gc; - } - -TBool CWsDynamicResWinBase::InvalidateRegion(const TRegion& aRegion,RWindow& aWin) - { - if (aWin.WsHandle()==NULL) - return false; //can't activate uninitialised window. - for (TInt ii = 0; ii < aRegion.Count(); ii++) - { - aWin.Invalidate(aRegion[ii]); - } - return true; - } - -CWindowGc* CWsDynamicResWinBase::BeginActivateWithWipe(const TRegion& aRegion,RWindow& aWin,TRgb aColor) - { - if (!InvalidateRegion(aRegion,aWin)) - return NULL; //can't activate uninitialised window. - - aWin.BeginRedraw(); - CWindowGc* gc=iGc; - if (iGc!=iInfoGc) - if (&aWin==&iCompare || &aWin==&iTitle) - gc=iInfoGc; - else if (aWin.WindowGroupId()==iInfoGroup->WindowGroupId()) - gc=iInfoGc; - ActivateWithWipe(gc,aWin,aColor); - return gc; - } - - -/** Paints the LHS window with rows of text. - * - **/ -void CWsDynamicResWinBase::RepaintTitleWindowL() - { - if (iTitle.WsHandle()) - { - iTitle.Invalidate(); - - iTitle.BeginRedraw(); - ActivateWithWipe(iInfoGc,iTitle,TITLE_BACKGROUND); - iInfoGc->SetUnderlineStyle(EUnderlineOn); - TSize winSize=iTitle.Size(); - TRect textRect(winSize); - textRect.iBr.iY/=4; - TFontSpec fspec(KMonospaceTestFontTypefaceName,KMaxFontSize); - CFont *font=NULL; - ASSERT_EQUALS(iInfoScreenDevice->GetNearestFontToDesignHeightInTwips(font,fspec),KErrNone); - iInfoGc->UseFont(font); - iInfoGc->DrawText(iTestName,textRect,textRect.iBr.iY/2,iGc->ECenter); - iInfoGc->SetUnderlineStyle(EUnderlineOff); - textRect.iTl.iY=textRect.iBr.iY; - TInt rowHeight=winSize.iHeight*3/(4*(KMaxInfoLines+1)); - textRect.iBr.iY+=rowHeight; - for (TInt index=0;indexDrawText(iTestInfo[index],textRect,textRect.Size().iHeight*3/4,iInfoGc->ECenter); - textRect.Move(0,rowHeight); - } - iInfoGc->DiscardFont(); - iInfoGc->Deactivate(); - iTitle.EndRedraw(); - iInfoScreenDevice->ReleaseFont(font); - - iSession.Flush(); - iSession.Finish(); - } - } - -/** Useful test culled from other GCE test classes. - * - * - * - **/ -TBool CWsDynamicResWinBase::DisplayHasAlpha() const - { - return (iDisplayMode == EColor16MA || iDisplayMode == EColor16MAP); - } -/** Test using an indipendent method that GCE version of WServ is running - * This method can only be called after the testcase is started - * - * @return true if WServ version is GCE technology, false if legacy technology - **/ -TBool CWsDynamicResWinBase::GCEIsSupported() const - { - CFbsDrawDevice* screenDevice=NULL; - TDisplayMode displayMode=iScreenDevice->DisplayMode(); - TRAPD(err, screenDevice = CFbsDrawDevice::NewScreenDeviceL(TGlobalSettings::Instance().iScreen, displayMode)); - TBool rv=EFalse; - if(err == KErrNone) - { - TAny* p=NULL; - rv=(screenDevice->GetInterface(KSurfaceInterfaceID, p)==KErrNone); - delete screenDevice; - } - return rv; - } -/** Test using an indipendent method that GCE version of WServ is running - * This method can be called at any time, even by external code, but creates temporary window session objects - * - * @return true if WServ version is GCE technology, false if legacy technology - **/ -TBool CWsDynamicResWinBase::GCEIsSupportedStatic() - { - CFbsDrawDevice* screenDevice=NULL; - RWsSession session; - if (session.Connect()!=KErrNone) - { - return EFalse; - } - TDisplayMode displayMode=ENone; - {CWsScreenDevice screen(session); - if (screen.Construct(TGlobalSettings::Instance().iScreen)!=KErrNone) - { - return EFalse; - } - displayMode=screen.DisplayMode(); - }//screen destroyed - TRAPD(err, screenDevice = CFbsDrawDevice::NewScreenDeviceL(TGlobalSettings::Instance().iScreen, displayMode)); - TBool rv=EFalse; - if(err == KErrNone) - { - TAny* p=NULL; - rv=(screenDevice->GetInterface(KSurfaceInterfaceID, p)==KErrNone); - delete screenDevice; - } - return rv; - }//session destroyed -/** -Use the full-screen background window to select a display mode that doesn't use -alpha (anything other than EColor16MA or EColor16MAP). Record the mode for use -in setting all other windows. -@return ETrue if an appropriate mode was selected, EFalse otherwise. -*/ -TBool CWsDynamicResWinBase::SelectChromaCompositionMode() - { - // Request EColor64K, but as long as the actual mode doesn't use alpha, it - // doesn't matter too much which one is used. - if (iInfoGc==iGc) - { - iDisplayMode = (TDisplayMode)iBackground.SetRequiredDisplayMode(EColor64K); - iSession.Flush(); // Force switching to the display mode. - } - return !DisplayHasAlpha(); - } -/** Returns the colour used by WServ to paint holes in UI layer to reveal the GCE behind. - * The window should have a surface attached. - * If the method is called after the surface has been detached or the window was removed then - * the previous recorded hole color is returned. - **/ -TRgb CWsDynamicResWinBase::GceHoleColor( RWindowBase& aWin)const - { - if (aWin.WsHandle()==NULL) - { - return iLastGceHoleColor; - } - TRgb retVal=aWin.KeyColor(); - if (retVal==TRgb(0,0)) - { - return iLastGceHoleColor; - } - else - { - iLastGceHoleColor=retVal; - return retVal; - } - } - - -/** -Use the full-screen background window to select a display mode that can use -alpha (either EColor16MA or EColor16MAP). Record the mode for use in setting all -other windows. -@return ETrue if an appropriate mode was selected, EFalse otherwise. -*/ -TBool CWsDynamicResWinBase::SelectAlphaCompositionMode(TDisplayMode aMode) - { - // Request EColor16MA, but as long as the actual mode can use alpha, it - // doesn't matter too much which one is used. - if (iInfoGc==iGc) - { - iDisplayMode = (TDisplayMode)iBackground.SetRequiredDisplayMode(aMode); - iSession.Flush(); // Force switching to the display mode. - } - return DisplayHasAlpha(); - } - -/** - * Interesting UI pattern used by other GCE tests. - * - * - **/ -void CWsDynamicResWinBase::DrawUIContent(RWindow& aWindow) - { - aWindow.BeginRedraw(); - CWindowGc* gc=(&aWindow==&iCompare)?iInfoGc:iGc; - - gc->Activate(aWindow); - - TBool hasAlpha = DisplayHasAlpha(); - - // Draw a red-green graduated box in the central portion of the window, - // with alpha if available. - TPoint start; - TPoint end; - TInt halfW = KSurfaceWidth / 2; - TInt quarterW = halfW / 2; - TInt halfH = KSurfaceHeight / 2; - TInt quarterH = halfH / 2; - - // Set constant ordinals for non-alpha case. - start.iX = quarterW; - end.iX = quarterW + halfW; - - for (TInt yy = 0; yy < halfH; yy++) - { - TInt yval = yy * 255 / (halfH - 1); - start.iY = yy + quarterH; - end.iY = start.iY; - - if (hasAlpha) - { - for (TInt xx = 0; xx < halfW; xx++) - { - TInt xval = xx * 255 / (halfW - 1); - start.iX = xx + quarterW; - end.iX = start.iX + 1; - gc->SetPenColor(TRgb(yval, 255 - yval, 0, xval)); - gc->DrawLine(start, end); - } - } - else - { - gc->SetPenColor(TRgb(yval, 255 - yval, 0)); - gc->DrawLine(start, end); - } - } - - gc->Deactivate(); - aWindow.EndRedraw(); - } - -/** - * Causes the given window to be redrawn. - * Doesn't draw anything except the background wipe, when the transparency manager hasn't - * - **/ -void CWsDynamicResWinBase::DrawPlainUI(RWindow& aWindow,TBool aInvalidate,TRgb aWipeColor) - { - if (CWindowGc* gc=BeginActivateWithWipe(aInvalidate,aWindow,aWipeColor)) - { - //actually does nothing! - gc->Deactivate(); - aWindow.EndRedraw(); - } - } -/** - * Interesting UI pattern used by other GCE tests. - * - * - **/ -void CWsDynamicResWinBase::DrawCross(RWindow& aWindow, TRgb aColor, TInt aThickness) - { - aWindow.BeginRedraw(); - CWindowGc* gc=(&aWindow==&iCompare)?iInfoGc:iGc; - gc->Activate(aWindow); - - // Draw a red diagonal cross in the window. - gc->SetPenColor(aColor); - gc->SetPenSize(TSize(aThickness, aThickness)); - gc->DrawLine(TPoint(0, 0), TPoint(KSurfaceWidth, KSurfaceHeight)); - gc->DrawLine(TPoint(KSurfaceWidth, 0), TPoint(0, KSurfaceHeight)); - - gc->Deactivate(); - aWindow.EndRedraw(); - } - -/** - * Checks the RGB value - * - * - **/ -void CWsDynamicResWinBase::TestPixelL(TPoint aPt, TRgb aColor, TBool aMatch) - { - TRect screenArea(iScreenDevice->SizeInPixels()); - if (aPt.iX < screenArea.iTl.iX) - { - aPt.iX = screenArea.iTl.iX; - } - else if (aPt.iX >= screenArea.iBr.iX) - { - aPt.iX = screenArea.iBr.iX - 1; - } - if (aPt.iY < screenArea.iTl.iY) - { - aPt.iY = screenArea.iTl.iY; - } - else if (aPt.iY >= screenArea.iBr.iY) - { - aPt.iY = screenArea.iBr.iY - 1; - } - - TRgb pixel; - iScreenDevice->GetPixel(pixel, aPt); - if (aMatch) - { - ASSERT_EQUALS_X(pixel.Internal(), aColor.Internal()); - } - else - { - ASSERT_NOT_EQUALS_X(pixel.Internal(), aColor.Internal()); - } - } - -struct CountColour - { - TRgb iColor; - TInt iCount; - TBool operator < (const CountColour& aRhs)const - { return iColor.Value()& aColors) - { - //I am sure one of the find methods would do this, but life is too short! - TInt existingIndex; - for (existingIndex=0;existingIndexDisplayMode(); - switch (displayMode) - { - case EColor4K: - aInnerColor=aInnerColor.Color4K(aInnerColor.Color4K()); - aOuterColor=aOuterColor.Color4K(aOuterColor.Color4K()); - break; - case EColor64K: - aInnerColor=aInnerColor.Color64K(aInnerColor.Color64K()); - aOuterColor=aOuterColor.Color64K(aOuterColor.Color64K()); - break; - case EColor16M: - case EColor16MU: - case EColor16MA: - case EColor16MAP: - break; - default: - ASSERT_EQUALS(EColor16MA,displayMode); //Can't quantise color for this display mode! - } - - RArray innerColors; - innerColors.AppendL(aInnerColor); - RArray outerColors; - outerColors.AppendL(aOuterColor); - TInt cornerSize=aExpectedCornerSize>=0?aExpectedCornerSize:-aExpectedCornerSize; - //Check outside first! - TRgb pixelVal; - for(TPoint pixelPos(aRect.iTl.iX-1,aRect.iTl.iY-1);pixelPos.iXGetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,outerColors); - } - for(TPoint pixelPos(aRect.iTl.iX,aRect.iBr.iY);pixelPos.iX<=aRect.iBr.iX;pixelPos.iX++) - { - iScreenDevice->GetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,outerColors); - } - for(TPoint pixelPos(aRect.iTl.iX-1,aRect.iTl.iY);pixelPos.iY<=aRect.iBr.iY;pixelPos.iY++) - { - iScreenDevice->GetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,outerColors); - } - for(TPoint pixelPos(aRect.iBr.iX,aRect.iTl.iY-1);pixelPos.iYGetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,outerColors); - } - TInt cornerStart=1; - if (cornerSize) - { - cornerStart=cornerSize; - if (aExpectedCornerSize>0) - { - iScreenDevice->GetPixel(pixelVal, aRect.iTl); - LogColorL(pixelVal,outerColors); - iScreenDevice->GetPixel(pixelVal, TPoint(aRect.iTl.iX,aRect.iBr.iY-1)); - LogColorL(pixelVal,outerColors); - iScreenDevice->GetPixel(pixelVal, TPoint(aRect.iBr.iX-1,aRect.iTl.iY)); - LogColorL(pixelVal,outerColors); - iScreenDevice->GetPixel(pixelVal, TPoint(aRect.iBr.iX-1,aRect.iBr.iY-1)); - LogColorL(pixelVal,outerColors); - } - } - - //test inside edges (excluding 4 corner pixels - do them seperately) - for(TPoint pixelPos(aRect.iTl.iX+cornerStart,aRect.iTl.iY);pixelPos.iXGetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,innerColors); - } - for(TPoint pixelPos(aRect.iTl.iX+cornerStart,aRect.iBr.iY-1);pixelPos.iXGetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,innerColors); - } - for(TPoint pixelPos(aRect.iTl.iX,aRect.iTl.iY+cornerStart);pixelPos.iYGetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,innerColors); - } - for(TPoint pixelPos(aRect.iBr.iX-1,aRect.iTl.iY+cornerStart);pixelPos.iYGetPixel(pixelVal, pixelPos); - LogColorL(pixelVal,innerColors); - } - //the 4 corner cells - not checking the whole corner area... - if (aExpectedCornerSize>=0) - { - iScreenDevice->GetPixel(pixelVal, TPoint(aRect.iTl.iX+cornerSize,aRect.iTl.iY+cornerSize)); - LogColorL(pixelVal,innerColors); - iScreenDevice->GetPixel(pixelVal, TPoint(aRect.iTl.iX+cornerSize,aRect.iBr.iY-1-cornerSize)); - LogColorL(pixelVal,innerColors); - iScreenDevice->GetPixel(pixelVal, TPoint(aRect.iBr.iX-1-cornerSize,aRect.iBr.iY-1-cornerSize)); - LogColorL(pixelVal,innerColors); - iScreenDevice->GetPixel(pixelVal, TPoint(aRect.iBr.iX-1-cornerSize,aRect.iTl.iY+cornerSize)); - LogColorL(pixelVal,innerColors); - } - //OK... that has tested all the pixels, now check the result - if (innerColors.Count()>aOtherInnerColors+1) - return EFalse; - if (outerColors.Count()>aOtherOuterColors+1) - return EFalse; - for (TInt index=1;indexendy) - { //swap // s e - starty-=endy; // s-e - endy+=starty; // s - starty=endy-starty; // e - } - if (startx>endx) - { //swap // s e - startx-=endx; // s-e - endx+=startx; // s - startx=endx-startx; // e - } - TSize fullSize=aFullRect.Size(); - return TRect( aFullRect.iTl.iX+fullSize.iWidth*startx/5, - aFullRect.iTl.iY+fullSize.iHeight*starty/5, - aFullRect.iTl.iX+fullSize.iWidth*(endx+1)/5, - aFullRect.iTl.iY+fullSize.iHeight*(endy+1)/5 - ); - }