graphicstest/uibench/s60/src/tests_fonts/tfullscreentext.cpp
changeset 0 5d03bc08d59c
equal deleted inserted replaced
-1:000000000000 0:5d03bc08d59c
       
     1  // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2  // All rights reserved.
       
     3  // This component and the accompanying materials are made available
       
     4  // under the terms of "Eclipse Public License v1.0"
       
     5  // which accompanies this distribution, and is available
       
     6  // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7  //
       
     8  // Initial Contributors:
       
     9  // Nokia Corporation - initial contribution.
       
    10  //
       
    11  // Contributors:
       
    12  //
       
    13  // Description:
       
    14  //
       
    15 
       
    16 /**
       
    17  @file
       
    18  @test
       
    19  @internalComponent - Internal Symbian test code 
       
    20 */
       
    21 
       
    22 
       
    23 #include "tfullscreentext.h"
       
    24 #include "fontdefs.h"
       
    25 #include "twindow.h"
       
    26 
       
    27 #include <w32std.h>
       
    28 #include <coefontprovider.h>
       
    29 
       
    30 
       
    31 const TInt KIterationsToTest = 25; // number of iterations
       
    32 
       
    33 _LIT(KSemaphore, "SemFullScreenTextSync"); // Name of the global semaphore
       
    34 _LIT(KTestStep0009,"GRAPHICS-UI-BENCH-S60-0009");
       
    35 
       
    36 // Literals for the ini file
       
    37 _LIT(KSectNameOpenGLVGTest, "FullScreenFontTest");
       
    38 _LIT(KKeyNameVertical, "Vertical");
       
    39 _LIT(KKeyNameRightToLeft, "RightToLeft");
       
    40 
       
    41 
       
    42 CTFullScreenText::CTFullScreenText()
       
    43 	{
       
    44 	SetTestStepName(KFullScreenText);
       
    45 	}
       
    46 
       
    47 void CTFullScreenText::InitUIL(CCoeEnv* aCoeEnv)
       
    48     {
       
    49     CFullScreenTextAppUi* appUi = new(ELeave) CFullScreenTextAppUi();
       
    50     CleanupStack::PushL(appUi);
       
    51     appUi->ConstructL(iDrawVertically, iRightToLeft);
       
    52     aCoeEnv->SetAppUi(appUi); // CCoeEnv takes ownership
       
    53     CleanupStack::Pop(appUi);
       
    54     }
       
    55 
       
    56 /**
       
    57  * Generates events to communicate with the control. Each time the control receives an event
       
    58  * it redraws itself. That's necessary because the draw method can't be called directly from
       
    59  * a different thread.
       
    60  */
       
    61 void CTFullScreenText::GenerateEventL(TRawEvent::TType aEventType)
       
    62     {
       
    63     TRawEvent rawEvent;
       
    64     rawEvent.Set(aEventType, 0, 0);
       
    65     User::LeaveIfError(UserSvr::AddEvent(rawEvent));
       
    66     }
       
    67 
       
    68 TVerdict CTFullScreenText::doTestStepPreambleL()
       
    69 	{
       
    70 	// The semaphore has to be created before, otherwise the control can't open it.
       
    71     TESTNOERRORL(iSemaphore.CreateGlobal(KSemaphore, 0));	
       
    72 	// read values from ini file, if keys not found default values apply
       
    73 	iDrawVertically = EFalse;
       
    74 	GetBoolFromConfig(KSectNameOpenGLVGTest, KKeyNameVertical, iDrawVertically);
       
    75 	iRightToLeft = EFalse;
       
    76 	GetBoolFromConfig(KSectNameOpenGLVGTest, KKeyNameRightToLeft, iRightToLeft);
       
    77 	// baseclass function needs to be called at the end, otherwise
       
    78 	// the values from the ini file would be read after InitUIL()
       
    79 	return CTe_ConeStepBase::doTestStepPreambleL();;
       
    80 	}
       
    81 
       
    82 TVerdict CTFullScreenText::doTestStepPostambleL()
       
    83     {
       
    84     iSemaphore.Close();
       
    85     // undo the button state change
       
    86     GenerateEventL(TRawEvent::EButton1Up);
       
    87     return CTe_ConeStepBase::doTestStepPostambleL();
       
    88     }
       
    89 
       
    90 TVerdict CTFullScreenText::doTestStepL()
       
    91     {
       
    92     SetTestStepID(KTestStep0009);
       
    93     TRAPD(err, FullScreenTextL());
       
    94     if (err != KErrNone)
       
    95         {
       
    96         SetTestStepResult(EAbort);
       
    97         }
       
    98     return TestStepResult();
       
    99     }
       
   100 
       
   101 /**
       
   102 @SYMTestCaseID
       
   103 GRAPHICS-UI-BENCH-S60-0009
       
   104 
       
   105 @SYMTestCaseDesc
       
   106 Tests how long it takes to draw text on the full screen. The font is requested
       
   107 for every redraw.
       
   108 
       
   109 @SYMTestActions
       
   110 The control redraws itself everytime it receives a left button down event.
       
   111 A semaphore is used to synchronise cone thread and test step thread. Depending on the
       
   112 ini file the text is drawn from left to right, vertically or normal.
       
   113 
       
   114 @SYMTestExpectedResults
       
   115 Test should pass and log the framerate.
       
   116 */
       
   117 void CTFullScreenText::FullScreenTextL()
       
   118     {
       
   119     iProfiler->InitResults();
       
   120     for(TInt i = KIterationsToTest; i > 0; --i)
       
   121         {
       
   122         GenerateEventL(TRawEvent::EButton1Down);
       
   123         iSemaphore.Wait();
       
   124         }
       
   125     iProfiler->MarkResultSetL();
       
   126     TSize screenSize = CTWindow::GetDisplaySizeInPixels();
       
   127     // todo: Define how to distinguish between tests with different ini files
       
   128     iProfiler->ResultsAnalysisFrameRate(KTestStep0009, 0, 0, 0, KIterationsToTest,
       
   129             screenSize.iWidth * screenSize.iHeight);
       
   130     }
       
   131 
       
   132 
       
   133 CGlobalTextControl* CGlobalTextControl::NewLC(const CCoeControl* aParent, TBool aDrawVertically, TBool aRightToLeft)
       
   134 	{
       
   135 	CGlobalTextControl* self;
       
   136 	self = new(ELeave) CGlobalTextControl(aDrawVertically, aRightToLeft);
       
   137 	CleanupStack::PushL(self);
       
   138 	self->ConstructL(aParent);
       
   139 	return self;
       
   140 	}
       
   141 
       
   142 CGlobalTextControl* CGlobalTextControl::NewL(const CCoeControl* aParent, TBool aDrawVertically, TBool aRightToLeft)
       
   143 	{
       
   144 	CGlobalTextControl* self;
       
   145 	self = CGlobalTextControl::NewLC(aParent, aDrawVertically, aRightToLeft);
       
   146 	CleanupStack::Pop(self);
       
   147 	return self;
       
   148 	}
       
   149 
       
   150 CGlobalTextControl::CGlobalTextControl(TBool aDrawVertically, TBool aRightToLeft) : 
       
   151         iDrawVertically(aDrawVertically), iRightToLeft(aRightToLeft),
       
   152         iWsSession(CCoeEnv::Static()->WsSession())
       
   153     {
       
   154     iMargin.SetAllValuesTo(EInsetMargin);
       
   155     }
       
   156 
       
   157 void CGlobalTextControl::ConstructL(const CCoeControl* aParent)
       
   158     {
       
   159     User::LeaveIfError(iSemaphore.OpenGlobal(KSemaphore));
       
   160     iScreen = new(ELeave) CWsScreenDevice(ControlEnv()->WsSession());
       
   161     iScreen->Construct(); // default screen used
       
   162     if (iRightToLeft)
       
   163         {
       
   164         iBidiText = TBidiText::NewL(KRightToLeftText, EMaximumTextLines, TBidiText::ERightToLeft);
       
   165         }
       
   166     else
       
   167         {
       
   168         iBidiText = TBidiText::NewL(KFullScreenSampleText, EMaximumTextLines, TBidiText::ELeftToRight);
       
   169         }
       
   170     if (aParent)
       
   171         {
       
   172         SetContainerWindowL(*aParent);
       
   173         }
       
   174     else
       
   175         {
       
   176         CreateWindowL();
       
   177         ActivateL();
       
   178         }
       
   179     SetRect(TRect(TPoint(0,0), CTWindow::GetDisplaySizeInPixels()));
       
   180     }
       
   181 
       
   182 CGlobalTextControl::~CGlobalTextControl()
       
   183 	{
       
   184     delete iBidiText;
       
   185     delete iScreen;
       
   186     iSemaphore.Close();
       
   187 	}
       
   188 
       
   189 void CGlobalTextControl::Draw(const TRect& aRect) const
       
   190 	{
       
   191 	CWindowGc& gc = SystemGc();
       
   192 	gc.SetBrushColor(TRgb(EBackgroundColor));
       
   193 	gc.Clear(Rect());
       
   194 	
       
   195 	// it's recommended to create XCoeTextDrawer on the stack
       
   196 	XCoeTextDrawer textDrawer(TextDrawer());
       
   197 	textDrawer->SetAlignment(TGulAlignment(EHCenterVCenter));
       
   198 	textDrawer->SetTextColor(KRgbBlack);
       
   199 	textDrawer->SetMargins(iMargin);
       
   200 	textDrawer->SetLineGapInPixels(EGapBetweenTextLines);
       
   201 	textDrawer.SetClipRect(aRect);
       
   202 
       
   203 	// request the font, could also be done during construction
       
   204 	CFont* font;
       
   205 	TFontSpec fontSpec;
       
   206 	fontSpec.iTypeface.iName = KNokiaSeries60Font;
       
   207 	fontSpec.iHeight=EDesiredFontHeight;
       
   208 	iScreen->GetNearestFontToDesignHeightInPixels((CFont*&)font, fontSpec);
       
   209 	
       
   210 	if (iDrawVertically)
       
   211 		{
       
   212 		iBidiText->WrapText(aRect.Height() - ESideBearingsAllowance, *font, NULL, EMaximumTextLines);
       
   213 		textDrawer.DrawTextVertical(gc, *iBidiText, aRect, *font);
       
   214 		}
       
   215 	else
       
   216 		{
       
   217 		// If you don't explicitly set the alignment for RightToLeft text, 
       
   218 		// DrawText's default is to left align regardless of the text direction.
       
   219 		// Setting it explicitly to Left alignment tells DrawText to right align.
       
   220 		if (iRightToLeft)
       
   221 			{
       
   222 			TGulAlignment alignment(EHLeftVTop);
       
   223 			textDrawer.SetAlignment(alignment);
       
   224 			}
       
   225 		iBidiText->WrapText(aRect.Width() - ESideBearingsAllowance, *font, NULL, EMaximumTextLines);
       
   226 		textDrawer.DrawText(gc, *iBidiText, aRect, *font);
       
   227 		}
       
   228 	iScreen->ReleaseFont(font);	// should be done every time the font is not needed anymore
       
   229 	}
       
   230 
       
   231 void CGlobalTextControl::HandlePointerEventL(const TPointerEvent& aPointerEvent)
       
   232     {
       
   233     // Process event generated from test step, forces a redraw.
       
   234     if(aPointerEvent.iType == TPointerEvent::EButton1Down)
       
   235         {
       
   236         DrawNow();
       
   237         iWsSession.Flush();
       
   238         iWsSession.Finish();
       
   239         iSemaphore.Signal();
       
   240         }    
       
   241     }
       
   242 
       
   243 
       
   244 CFullScreenTextAppUi::CFullScreenTextAppUi()
       
   245 	{
       
   246 	// empty
       
   247 	}
       
   248 
       
   249 void CFullScreenTextAppUi::ConstructL(TBool aDrawVertically, TBool aRightToLeft)
       
   250     {
       
   251     BaseConstructL(ENoAppResourceFile);
       
   252     iGlobalTextControl = CGlobalTextControl::NewL(NULL, aDrawVertically, aRightToLeft);
       
   253     AddToStackL(iGlobalTextControl);
       
   254     }
       
   255 
       
   256 CFullScreenTextAppUi::~CFullScreenTextAppUi()
       
   257 	{
       
   258 	RemoveFromStack(iGlobalTextControl);
       
   259 	delete iGlobalTextControl;
       
   260 	}