diff -r 000000000000 -r 5d03bc08d59c graphicstest/uibench/s60/src/tests_fonts/tcomplexfonts.cpp --- /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 +#include + + +_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(); + } + }