graphicstest/uibench/s60/src/tests_fonts/tcomplexfonts.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/s60/src/tests_fonts/tcomplexfonts.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,378 @@
+ // Copyright (c) 2006-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
+ @test
+ @internalComponent - Internal Symbian test code 
+*/
+
+
+#include "tcomplexfonts.h"
+#include "fontdefs.h"
+#include "twindow.h"
+
+#include <w32std.h>
+#include <coefontprovider.h>
+
+
+_LIT(KTestStep0010, "GRAPHICS-UI-BENCH-S60-0010");
+
+_LIT(KSemaphore, "SemDrawSync"); // Name of the global semaphore
+
+
+// constants to define the format of the text
+const TInt KHeadingParagraph = 0;
+const TInt KClassParagraph = 2;
+const TInt KDescriptionHeading = 4;
+const TInt KDerivationHeading = 10;
+const TInt KFirstDerivation = 12;
+const TInt KLastDerivation = 16;
+
+const TInt KHeaderFontSize = 13 * 20; // in TWIPs
+const TInt KBodyFontSize = 8 * 20; // in TWIPs
+const TInt KBodyLineSpacing = 10; // in TWIPs
+const TInt KBodyIndent = 300; // in TWIPs
+
+const TInt KIterationsToTest = 50; // number of iterations
+
+
+CTComplexFonts::CTComplexFonts()
+	{
+	SetTestStepName(KTComplexFonts);
+	}
+
+void CTComplexFonts::InitUIL(CCoeEnv* aCoeEnv)
+    {
+    CComplexFontsAppUi* appUi = new(ELeave) CComplexFontsAppUi();
+    CleanupStack::PushL(appUi);
+    appUi->ConstructL();
+    aCoeEnv->SetAppUi(appUi);
+    CleanupStack::Pop(appUi);
+    }
+
+TVerdict CTComplexFonts::doTestStepPreambleL()
+    {
+    // The semaphore has to be created before, otherwise the control can't open it.
+    TESTNOERRORL(iSemaphore.CreateGlobal(KSemaphore, 0));
+    return CTe_ConeStepBase::doTestStepPreambleL();
+    }
+
+TVerdict CTComplexFonts::doTestStepPostambleL()
+    {
+    GenerateEventL(TRawEvent::EButton1Up);
+    iSemaphore.Close();
+    return CTe_ConeStepBase::doTestStepPostambleL(); 
+    }
+
+/**
+    Override of base class pure virtual
+    Our implementation only gets called if the base class doTestStepPreambleL() did
+    not leave.
+    
+    @return - TVerdict code
+*/
+TVerdict CTComplexFonts::doTestStepL()
+	{
+	SetTestStepName(KTestStep0010);
+	TRAPD(err, DrawComplexFontsL());
+	if (err != KErrNone)
+	    {
+	    SetTestStepResult(EAbort);
+	    }
+	return TestStepResult();
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-S60-0010
+
+@SYMTestCaseDesc
+Tests how long it takes format and draw a CRichText object.
+
+@SYMTestActions
+Create a complex font control. Format and draw the text control each time
+it receives a left pointer down event. The test step and the drawing of the
+control is synchronized with a Semaphore. 
+
+@SYMTestExpectedResults
+Test should pass and display the average framerate for the test.
+*/
+void CTComplexFonts::DrawComplexFontsL()
+    {
+    iProfiler->InitResults();
+    for(TInt i = KIterationsToTest; i > 0; --i)
+        {
+        GenerateEventL(TRawEvent::EButton1Down);
+        iSemaphore.Wait();
+        }
+    iProfiler->MarkResultSetL();
+    TSize screenSize = CTWindow::GetDisplaySizeInPixels();
+    iProfiler->ResultsAnalysisFrameRate(KTestStep0010, 0, 0, 0, KIterationsToTest, screenSize.iWidth * screenSize.iHeight);
+    }
+
+/**
+ * Generates events to communicate with the control. Each time the control receives an event
+ * it redraws itself. That's necessary because the draw method can't be called directly from
+ * a different thread.
+ */
+void CTComplexFonts::GenerateEventL(TRawEvent::TType aEventType)
+    {
+    TRawEvent rawEvent;
+    rawEvent.Set(aEventType, 0, 0);
+    User::LeaveIfError(UserSvr::AddEvent(rawEvent));
+    }
+
+
+CComplexFontsAppUi::CComplexFontsAppUi()
+    {
+    // Empty
+    }
+
+void CComplexFontsAppUi::ConstructL()
+    {
+    BaseConstructL(ENoAppResourceFile);
+    iComplexFontsControl = CComplexFontsControl::NewL();
+    AddToStackL(iComplexFontsControl);
+    }
+
+CComplexFontsAppUi::~CComplexFontsAppUi()
+    {
+    RemoveFromStack(iComplexFontsControl);
+    delete iComplexFontsControl;
+    }
+
+
+CComplexFontsControl* CComplexFontsControl::NewLC(const CCoeControl* aParent)
+	{
+	CComplexFontsControl* self;
+	self = new(ELeave) CComplexFontsControl();
+	CleanupStack::PushL(self);
+	self->ConstructL(aParent);
+	return self;
+	}
+
+CComplexFontsControl* CComplexFontsControl::NewL(const CCoeControl* aParent)
+	{
+	CComplexFontsControl* self;
+	self = CComplexFontsControl::NewLC(aParent);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CComplexFontsControl::CComplexFontsControl() : iWsSession(CCoeEnv::Static()->WsSession())
+    {
+    // empty
+    }
+
+CComplexFontsControl::~CComplexFontsControl()
+	{
+	delete iTextView;
+	delete iLayout;
+	delete iRichText;
+	delete iCharFormatLayer;
+	delete iParaFormatLayer;
+	delete iScreen;
+	iSemaphore.Close();
+	}
+
+/**
+ * Constructs the text control with the complex fonts.
+ */
+void CComplexFontsControl::ConstructL(const CCoeControl* aParent)
+    {
+    User::LeaveIfError(iSemaphore.OpenGlobal(KSemaphore));
+    if (aParent)
+        {
+        SetContainerWindowL(*aParent);
+        }
+    else
+        {
+        CreateWindowL();
+        }
+    // Create text object, text view and layout.
+    iParaFormatLayer = CParaFormatLayer::NewL(); 
+    iCharFormatLayer = CCharFormatLayer::NewL();
+    // Create an empty rich text object
+    iRichText = CRichText::NewL(iParaFormatLayer, iCharFormatLayer);
+    
+    iScreen = new(ELeave) CWsScreenDevice(ControlEnv()->WsSession());
+    User::LeaveIfError(iScreen->Construct()); // default screen used
+    
+    TPixelsAndRotation pixelsAndRotation;
+    iScreen->GetDefaultScreenSizeAndRotation(pixelsAndRotation);
+    
+    // Create the text layout, (required by text view),
+    // with the text object and a wrap width (=width of view rect)
+    iLayout = CTextLayout::NewL(iRichText,pixelsAndRotation.iPixelSize.iWidth);
+    
+    // Create text view
+    iTextView = CTextView::NewL(iLayout, pixelsAndRotation.iPixelSize,
+            iScreen, iScreen, &Window(), 0, // no window group
+            &iCoeEnv->WsSession()); // new view
+        
+    SetRect(TRect(TPoint(0, 0), pixelsAndRotation.iPixelSize));
+
+    // load up text
+    iRichText->InsertL(0, KComplexFontsText);
+
+    // break up into paragraphs for CRichText by replacing \n characters in original text
+    // with CEditableText::EParagraphDelimiter
+    TPtrC complexFontsTextPtr(KComplexFontsText);
+    TInt eos = complexFontsTextPtr.Length();
+    for (TInt paragraphBreakLocation = 0; paragraphBreakLocation < eos; paragraphBreakLocation++)
+        {
+        if (complexFontsTextPtr[paragraphBreakLocation] == '\n')
+            {
+            iRichText->DeleteL(paragraphBreakLocation, 1);
+            iRichText->InsertL(paragraphBreakLocation, CEditableText::EParagraphDelimiter);
+            }
+        }
+    
+    TCharFormat charFormat;
+    TCharFormatMask charFormatMask;
+    // format the first paragraph "Class RWindow" as orange and a bit bigger than the body
+    charFormat.iFontPresentation.iTextColor= TLogicalRgb(TRgb(0x0099ff));
+    charFormatMask.SetAttrib(EAttColor);
+    charFormat.iFontSpec.iHeight = KHeaderFontSize; 
+    charFormatMask.SetAttrib(EAttFontHeight);
+    
+    TInt headerLength = 0;
+    TInt headerStart = iRichText->CharPosOfParagraph(headerLength, KHeadingParagraph);
+    iRichText->ApplyCharFormatL(charFormat, charFormatMask, headerStart, headerLength);
+    charFormatMask.ClearAll();
+
+    // format "Class" as Sans Serif
+    charFormat.iFontSpec.iTypeface.iName = KNokiaSeries60Font;
+    charFormatMask.SetAttrib(EAttFontTypeface);
+    iRichText->ApplyCharFormatL(charFormat, charFormatMask, headerStart, 5);
+    charFormatMask.ClearAll();
+
+    // make the rest of the text smaller  
+    charFormat.iFontSpec.iHeight = KBodyFontSize;
+    charFormatMask.SetAttrib(EAttFontHeight);
+    TInt textLength = iRichText->DocumentLength();
+    iRichText->ApplyCharFormatL(charFormat, charFormatMask, headerLength, textLength - headerLength);
+    charFormatMask.ClearAll();
+
+    TParaFormatMask paraFormatMask;
+    // crunch main body a bit closer together to show more on the little screen
+    // and indent left margin 
+    iParaFormat.iLineSpacingInTwips = KBodyLineSpacing;
+    paraFormatMask.SetAttrib(EAttLineSpacing);
+    iParaFormat.iLineSpacingControl = CParaFormat::ELineSpacingExactlyInPixels;
+    paraFormatMask.SetAttrib(EAttLineSpacingControl);
+    iParaFormat.iLeftMarginInTwips = KBodyIndent;
+    paraFormatMask.SetAttrib(EAttLeftMargin);
+    iRichText->ApplyParaFormatL(&iParaFormat, paraFormatMask, headerLength, textLength - headerLength);
+    paraFormatMask.ClearAll();
+
+    TInt length = 0;
+    TInt start = 0;
+    
+    // put a grey background on "class RWindow : public RDrawableWindow;"
+    start = iRichText->CharPosOfParagraph(length, KClassParagraph);
+    iParaFormat.iFillColor = TLogicalRgb(TRgb(0xdddddd));
+    paraFormatMask.SetAttrib(EAttFillColor);
+    iRichText->ApplyParaFormatL(&iParaFormat, paraFormatMask, start, length);
+    paraFormatMask.ClearAll();
+    
+    // make "Description" and "Derivation" subheadings bold
+    charFormat.iFontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
+    charFormatMask.SetAttrib(EAttFontStrokeWeight);
+    start = iRichText->CharPosOfParagraph(length, KDescriptionHeading);
+    iRichText->ApplyCharFormatL(charFormat, charFormatMask, start, length);
+    start = iRichText->CharPosOfParagraph(length, KDerivationHeading);
+    iRichText->ApplyCharFormatL(charFormat, charFormatMask, start, length);
+    charFormatMask.ClearAll();
+    
+    // all the paragraphs between and including "Description" and "Derivation" are in sans serif 
+    // (the default CRichText font is serif)
+    TInt paragraphNumber = 0;
+
+    charFormat.iFontSpec.iTypeface.iName = KNokiaSeries60Font;
+    charFormatMask.SetAttrib(EAttFontTypeface);
+    for (paragraphNumber = KDescriptionHeading; paragraphNumber <= KDerivationHeading; paragraphNumber++)
+        {
+        start = iRichText->CharPosOfParagraph(length, paragraphNumber);
+        iRichText->ApplyCharFormatL(charFormat, charFormatMask, start, length);
+        }
+    charFormatMask.ClearAll();
+    
+    // for each line in the "Derivation" section
+    //  progressively indent left margin
+    //  make class name blue underlined (it starts two characters after the 
+    //    beginning of each paragraph and goes to the space before the '-')
+    //  make descriptive text sans serif (from the '-' to the end of the paragraph)
+    paraFormatMask.SetAttrib(EAttLeftMargin);
+    charFormat.iFontPresentation.iTextColor= TLogicalRgb(TRgb(0xA27316));
+    charFormat.iFontPresentation.iUnderline = EUnderlineOn;
+    for (paragraphNumber = KFirstDerivation; paragraphNumber <= KLastDerivation; paragraphNumber++)
+        {
+        iParaFormat.iLeftMarginInTwips = (paragraphNumber - KFirstDerivation + 2)*KBodyIndent;
+        start = iRichText->CharPosOfParagraph(length, paragraphNumber);
+        iRichText->ApplyParaFormatL(&iParaFormat, paraFormatMask, start, length);
+        TInt dash = 0;
+        for (dash = start; dash < start + length; dash++)
+            {
+            if (complexFontsTextPtr[dash] == '-')
+                {
+                break;
+                }
+            }
+        charFormatMask.SetAttrib(EAttColor);
+        charFormatMask.SetAttrib(EAttFontUnderline);
+        TInt classNameLength = (dash - 1) - (start + 2);
+        iRichText->ApplyCharFormatL(charFormat, charFormatMask, start + 2, classNameLength);
+        charFormatMask.ClearAll();
+        charFormatMask.SetAttrib(EAttFontTypeface);
+        TInt descriptionLength = length - classNameLength - 4;
+        iRichText->ApplyCharFormatL(charFormat, charFormatMask, dash, descriptionLength);
+        charFormatMask.ClearAll();
+        }
+    paraFormatMask.ClearAll();
+    
+    if (!aParent)
+        {
+        ActivateL();
+        }
+    }
+
+/**
+ * The test meassures how long it takes to format and draw the text view.
+ * Most time is spend with formatting the text.
+ */
+void CComplexFontsControl::Draw(const TRect& aRect) const
+	{
+	TRAPD(err,iTextView->FormatTextL());
+	if (err == KErrNone)
+	    {
+	    TRAP(err,iTextView->DrawL(aRect));
+	    }
+	}
+
+/**
+ * Draws the text control if a pointer down event is received.
+ */
+void CComplexFontsControl::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    if (aPointerEvent.iType == TPointerEvent::EButton1Down)
+        {
+        DrawNow();
+        iWsSession.Flush();
+        iWsSession.Finish();
+        iSemaphore.Signal();
+        }
+    }