graphicstest/uibench/src/tfbsglyphdata.cpp
author hgs
Fri, 30 Jul 2010 11:41:40 +0300
changeset 136 62bb7c97884c
parent 121 d72fc2aace31
permissions -rw-r--r--
201030_2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     1
// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     2
// All rights reserved.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     7
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     8
// Initial Contributors:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    10
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    11
// Contributors:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    12
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    13
// Description:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    14
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    15
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    16
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    17
 @file
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    18
 @test
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    19
 @internalComponent - Internal Symbian test code 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    20
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    21
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
    22
#include <test/graphicsfontutils.h>
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    23
#include <graphics/fbsglyphdataiterator.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    24
#include <graphics/fbsglyphmetricsarray.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    25
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    26
#include <sgresource/sgimage.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    27
#include <egl/egl.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    28
#include <vg/openvg.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    29
typedef EGLBoolean (*TvgCreateEGLImageTargetKHRTypefPtr) (VGeglImageKHR image);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    30
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    31
#include "tfbsglyphdata.h"
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    32
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    33
// Size of EGLSurface used for rendering to, in pixels.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    34
const TSize KEglTargetSize(512, 512);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    35
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    36
CTFbsGlyphData::CTFbsGlyphData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    37
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    38
	SetTestStepName(KTFbsGlyphData);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    39
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    40
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    41
CTFbsGlyphData::~CTFbsGlyphData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    42
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    43
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    44
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    45
TVerdict CTFbsGlyphData::doTestStepPreambleL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    46
    {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    47
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    48
    User::LeaveIfError(iFbs.Connect());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    49
	User::LeaveIfError(iSgDriver.Open());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    50
#endif
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
    51
	iCharCodeConverter = CCharCodeConverter::NewL();
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    52
    return CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    53
    }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    54
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    55
TVerdict CTFbsGlyphData::doTestStepPostambleL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    56
    {
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
    57
    delete iCharCodeConverter;
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
    58
    iCharCodeConverter = NULL;
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    59
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    60
    iSgDriver.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    61
    iFbs.Disconnect();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    62
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    63
    return CTe_graphicsperformanceSuiteStepBase::doTestStepPostambleL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    64
    }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    65
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    66
TVerdict CTFbsGlyphData::doTestStepL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    67
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    68
#ifndef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    69
    INFO_PRINTF1(_L("CTFbsGlyphData can only be run with SgImage 'Lite'"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    70
    return TestStepResult();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    71
#else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    72
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0178"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    73
	GlyphMetricsArrayL(ETestLanguageLatin, ETrue, 1000);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    74
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    75
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    76
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0179"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    77
	GlyphMetricsArrayL(ETestLanguageLatin, EFalse, 50000);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    78
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    79
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    80
    // Tests 180 and 181 require a CMap table in order to convert CharacterCodes to GlyphCodes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    81
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0180"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    82
	GlyphMetricsArrayL(ETestLanguageHindi, ETrue, 25);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    83
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    84
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    85
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0181"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    86
	GlyphMetricsArrayL(ETestLanguageHindi, EFalse, 50000);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    87
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    88
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    89
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0182"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    90
	GlyphMetricsQuerySingleGlyphL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    91
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    92
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    93
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0183"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    94
	GlyphDataIteratorOpenL(ETestLanguageLatin, ETrue, 50);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    95
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    96
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    97
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0184"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    98
	GlyphDataIteratorOpenL(ETestLanguageLatin, EFalse, 500);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    99
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   100
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   101
    // Tests 185 and 186 require a CMap table in order to convert CharacterCodes to GlyphCodes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   102
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0185"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   103
	GlyphDataIteratorOpenL(ETestLanguageHindi, ETrue, 10);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   104
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   105
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   106
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0186"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   107
	GlyphDataIteratorOpenL(ETestLanguageHindi, EFalse, 5000);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   108
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   109
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   110
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0187"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   111
	GlyphDataIteratorOpenSingleFontL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   112
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   113
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   114
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0188"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   115
	GlyphMetricsQueryUnrasterizedL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   116
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   117
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   118
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0189"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   119
	GlyphMetricsQueryPreRasterizedL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   120
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   121
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   122
	SetTestStepID(_L("GRAPHICS-UI-BENCH-0190"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   123
	GlyphRenderingL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   124
	RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   125
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   126
	return TestStepResult();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   127
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   128
    }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   129
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   130
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   131
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   132
@SYMTestCaseID GRAPHICS-UI-BENCH-0178...0181
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   133
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   134
@SYMTestType UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   135
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   136
@SYMPREQ PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   137
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   138
@SYMTestCaseDesc 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   139
Measures the performance of calling RFbsGlyphMetricsArray::Get() with different sample data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   140
The sample data can be a single word, or a very long array of glyphs, in latin or non-latin
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   141
alphabets. At each repetition a different font is used, cycled over nine fonts, to reduce the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   142
effect of having cached glyphs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   143
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   144
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   145
i. Create some sample fonts to cycle through. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   146
ii. Load sample data from config file, specified by aSampleDataKey.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   147
iii. Create RFbsGlyphMetricsArray, open on sample data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   148
iv. For each repetition, call RFbsGlyphMetricsArray::Get(), adjusting font at each repetition.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   149
v. Measure time from from first to last repetition.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   150
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   151
@param aLanguage The language this test will use.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   152
@param aLongData If ETrue, tells the test to use the long sample data string for the test, EFalse
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   153
	will make the test use the short string data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   154
@param aReps The number of times to repeat the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   155
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   156
void CTFbsGlyphData::GlyphMetricsArrayL(TTestLanguage aLanguage, TBool aLongData, TInt aReps)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   157
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   158
	TBuf<128> KTestName;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   159
	TPtrC KTestVariant = ConfigKeyNameL(aLanguage, aLongData);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   160
	KTestName.Format(_L("GlyphMetricsArray %S"), &KTestVariant);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   161
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   162
	// Create some test fonts using the font factory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   163
	CTFontFactory* fontFactory = CTFontFactory::NewLC();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   164
	fontFactory->CreateFontsL(aLanguage, 9);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   165
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   166
	// Load the sample string data from the config file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   167
	TInt numGlyphCodes = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   168
	TUint* glyphCodes;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   169
	LoadConfigSampleDataL(fontFactory->NextFont(), aLanguage, aLongData, glyphCodes, numGlyphCodes);
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   170
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   171
	// Run the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   172
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   173
	RFbsGlyphMetricsArray array;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   174
	CleanupClosePushL(array);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   175
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   176
	for (TInt rep = aReps; (rep != 0) && (err == KErrNone); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   177
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   178
		err = array.Get(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   179
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   180
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   181
	TESTE(err == KErrNone, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   182
	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, aReps, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   183
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   184
	CleanupStack::PopAndDestroy(2); // array, fontFactory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   185
	delete [] glyphCodes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   186
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   187
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   188
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   189
@SYMTestCaseID GRAPHICS-UI-BENCH-0182
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   190
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   191
@SYMTestType UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   192
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   193
@SYMPREQ PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   194
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   195
@SYMTestCaseDesc 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   196
Measures the performance of calling RFbsGlyphDataIterator::Get() with a single glyph,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   197
versus CFont::GetCharacterData(). Using a single glyph code is a very common use case.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   198
The glyph and the font is changed at each iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   199
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   200
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   201
i. Create some sample fonts to cycle through. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   202
ii. Create RFbsGlyphMetricsArray.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   203
iii. For each repetition, call RFbsGlyphMetricsArray::Get(), adjusting the glyph at 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   204
	each iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   205
iv. Measure time from from first to last iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   206
v. Repeat steps iii. and iv. with CFont::GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   207
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   208
void CTFbsGlyphData::GlyphMetricsQuerySingleGlyphL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   209
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   210
	_LIT(KTestName, "GlyphMetricsQuerySingleGlyph");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   211
	const TInt KNumIterations = 50000;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   212
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   213
	TBuf<128> KTestNameVariant;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   214
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   215
	// Create some test fonts using the font factory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   216
	CTFontFactory* fontFactory = CTFontFactory::NewLC();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   217
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   218
	// Run the test for RFbsGlyphMetricsArray, with a different character 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   219
	// and font for each iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   220
	KTestNameVariant.Format(_L("%S RFbsGlyphMetricsArray"), &KTestName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   221
	fontFactory->CreateFontsL(ETestLanguageLatin, 9);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   222
	RFbsGlyphMetricsArray array;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   223
	CleanupClosePushL(array);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   224
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   225
	for (TInt rep = KNumIterations; rep != 0 && (err == KErrNone); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   226
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   227
		const TUint KGlyphCode = 32 + (rep % 96);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   228
		err = array.Get(*(fontFactory->NextFont()), &KGlyphCode, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   229
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   230
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   231
	TESTE(err == KErrNone, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   232
	CleanupStack::PopAndDestroy(1); // array
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   233
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   234
	fontFactory->ReleaseFonts();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   235
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   236
	// Run the test for GetCharacterData(), with a different character
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   237
	// and font for each iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   238
	KTestNameVariant.Format(_L("%S GetCharacterData"), &KTestName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   239
	fontFactory->CreateFontsL(ETestLanguageLatin, 9);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   240
	TOpenFontCharMetrics metrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   241
	const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   242
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   243
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   244
	for (TInt rep = KNumIterations; rep != 0; --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   245
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   246
		const TUint KGlyphCode = 32 + (rep % 96);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   247
		fontFactory->NextFont()->GetCharacterData(KGlyphCode, metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   248
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   249
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   250
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   251
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   252
	CleanupStack::PopAndDestroy(1); // fontFactory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   253
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   254
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   255
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   256
@SYMTestCaseID GRAPHICS-UI-BENCH-0183...0186
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   257
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   258
@SYMTestType UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   259
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   260
@SYMPREQ PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   261
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   262
@SYMTestCaseDesc 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   263
Measures the performance of calling RFbsGlyphDataIterator::Open() with different 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   264
sample data, and iterating through the data with RFbsGlyphDataIterator::Next(). 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   265
The sample data can be a single word, or a very long array of glyphs,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   266
in various languages. At each repetition a different font is used, cycled
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   267
over nine fonts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   268
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   269
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   270
i. Create some sample fonts to cycle through. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   271
ii. Create RFbsGlyphDataIterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   272
iii. For each repetition, call RFbsGlyphDataIterator::Open(), adjusting the glyph at each 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   273
	iteration. The font is changed at each repetition.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   274
iv. Measure time from from first to last repetition.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   275
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   276
@param aLanguage The language this test will use.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   277
@param aLongData If ETrue, tells the test to use the long sample data string for the test, EFalse
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   278
	will make the test use the short string data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   279
@param aReps The number of times to repeat the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   280
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   281
void CTFbsGlyphData::GlyphDataIteratorOpenL(TTestLanguage aLanguage, TBool aLongData, TInt aReps)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   282
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   283
	TBuf<128> KTestName;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   284
	TPtrC KTestVariant = ConfigKeyNameL(aLanguage, aLongData);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   285
	KTestName.Format(_L("GlyphDataIteratorOpen %S"), &KTestVariant);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   286
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   287
	// Create some test fonts using the font factory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   288
	CTFontFactory* fontFactory = CTFontFactory::NewLC();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   289
	fontFactory->CreateFontsL(aLanguage, 9);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   290
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   291
	// Load the sample string data from the config file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   292
	TInt numGlyphCodes = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   293
	TUint* glyphCodes;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   294
	LoadConfigSampleDataL(fontFactory->NextFont(), aLanguage, aLongData, glyphCodes, numGlyphCodes);
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   295
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   296
	// Run the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   297
	TInt err = KErrNotFound;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   298
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   299
	CleanupClosePushL(iter);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   300
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   301
	for (TInt rep = aReps; (rep != 0) && (err == KErrNotFound); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   302
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   303
		err = iter.Open(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   304
		for (; err == KErrNone; err = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   305
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   306
			// no operation
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   307
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   308
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   309
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   310
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   311
	TESTE(err == KErrNotFound, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   312
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   313
	CleanupStack::PopAndDestroy(2); // iter, fontFactory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   314
	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, aReps, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   315
	delete [] glyphCodes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   316
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   317
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   318
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   319
@SYMTestCaseID GRAPHICS-UI-BENCH-0187
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   320
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   321
@SYMTestType UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   322
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   323
@SYMPREQ PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   324
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   325
@SYMTestCaseDesc 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   326
Measures the performance of calling RFbsGlyphDataIterator::Open() with different 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   327
lengthed arrays but the same font. The sample data is a long array of characters.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   328
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   329
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   330
i. Create a single test font 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   331
ii. Create RFbsGlyphDataIterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   332
iii. Pass an array to RFbsGlyphDataIterator::Open(), starting with a single glyph.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   333
	For each iteration, increase the length of the array by one until the entire
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   334
	string has been opened.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   335
iv. Measure the time to perform all the iterations.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   336
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   337
@param aSampleDataKey The string key to lookup under the GlyphArraySampleText section of the 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   338
	config file where the sample data is read.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   339
@param aReps The number of times to repeat the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   340
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   341
void CTFbsGlyphData::GlyphDataIteratorOpenSingleFontL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   342
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   343
	_LIT(KTestName, "GlyphDataIteratorOpenSingleFont");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   344
	// A cap on the max number of iterations to complete.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   345
	const TInt KMaxNumIterations = 200;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   346
    const TTestLanguage KTestLanguage = ETestLanguageHindi;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   347
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   348
	// Create some test fonts using the font factory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   349
	CTFontFactory* fontFactory = CTFontFactory::NewLC();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   350
	fontFactory->CreateFontsL(KTestLanguage, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   351
	CFbsFont* font = fontFactory->NextFont();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   352
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   353
	// Load the sample string data from the config file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   354
	TInt numGlyphCodes = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   355
	TUint* glyphCodes;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   356
	LoadConfigSampleDataL(font, KTestLanguage, ETrue, glyphCodes, numGlyphCodes); 
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   357
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   358
	const TInt KNumRepetitions = Min<TInt>(numGlyphCodes - 1, KMaxNumIterations);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   359
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   360
	CleanupClosePushL(iter);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   361
	TInt iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   362
	TInt glyphCount = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   363
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   364
	for (glyphCount = 1; (glyphCount < KNumRepetitions); ++glyphCount)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   365
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   366
		iterErr = iter.Open(*font, glyphCodes, glyphCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   367
		for (; iterErr == KErrNone; iterErr = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   368
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   369
			// no operation
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   370
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   371
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   372
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   373
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   374
	TEST(glyphCount == KNumRepetitions);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   375
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   376
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   377
	const TInt KAvgNumCharsPerIteration = KNumRepetitions/2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   378
	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, KNumRepetitions, KAvgNumCharsPerIteration);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   379
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   380
	CleanupStack::PopAndDestroy(2); // iter, fontFactory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   381
	delete [] glyphCodes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   382
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   383
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   384
@SYMTestCaseID GRAPHICS-UI-BENCH-0188
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   385
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   386
@SYMTestType UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   387
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   388
@SYMPREQ PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   389
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   390
@SYMTestCaseDesc 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   391
Measures the performance of querying the TOpenFontCharMetrics using the different
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   392
available APIs. RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   393
are compared against each other, using the same fonts, and same sample data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   394
This test uses glyphs that have not been rasterized before, therefore for certain
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   395
APIs this will mean rasterizing the glyphs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   396
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   397
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   398
i. Load sample text data from config file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   399
ii. For each of RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData():
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   400
	1. Create 50 new fonts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   401
	2. Run the test, calling the necessary API once per font/loop.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   402
	3. For GetCharacterData() and RFbsGlyphDataIterator(), cycle through each glyph
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   403
		to ensure all metrics have been retrieved. This is not necessary for 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   404
		RFbsGlyphMetricsArray.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   405
	4. Measure time between first and last font/loop.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   406
	5. Destroy test fonts so that next test has to re-rasterize the glyphs.	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   407
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   408
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   409
Since this test uses non-rasterized fonts, RFbsGlyphMetricsArray should be faster than
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   410
GetCharacterData() and RFbsGlyphDataIterator, which both rasterize the glyphs in order to 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   411
get their metrics information.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   412
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   413
void CTFbsGlyphData::GlyphMetricsQueryUnrasterizedL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   414
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   415
	_LIT(KTestName, "GlyphMetricsQueryUnrasterized");
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   416
	
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   417
	TBuf<128> KTestNameVariant;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   418
	// First do the test for the iterator. To ensure fair comparison with
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   419
    // RFbsGlyphMetricsArray, cycle through each iteration to ensure the metrics
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   420
    // for each glyph is found.
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   421
    KTestNameVariant.Format(_L("%S RFbsGlyphDataIterator"), &KTestName);
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   422
    
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   423
	const TInt KNumFonts = 50;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   424
	const TTestLanguage KTestLanguage = ETestLanguageLatin;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   425
	
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   426
	// Create some test fonts using the font factory.
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   427
	CTFontFactory* fontFactory = CTFontFactory::NewLC();
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   428
    fontFactory->CreateFontsL(KTestLanguage, KNumFonts);
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   429
	    
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   430
	// Load the sample string data from the config file. Both the iterator and the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   431
	// array will use this same sample data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   432
	TInt numGlyphCodes = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   433
	TUint* glyphCodes;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   434
	LoadConfigSampleDataL(fontFactory->NextFont(), KTestLanguage, ETrue, glyphCodes, numGlyphCodes); 
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   435
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   436
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   437
	CleanupClosePushL(iter);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   438
	TInt iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   439
	TInt rep = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   440
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   441
	for (rep = KNumFonts; (rep != 0); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   442
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   443
		iterErr = iter.Open(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   444
		for (; iterErr == KErrNone; iterErr = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   445
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   446
			// no operation
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   447
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   448
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   449
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   450
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   451
	TEST(rep == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   452
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   453
	CleanupStack::PopAndDestroy(1); // iter		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   454
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumFonts, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   455
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   456
	// Second, do the test for the array. This should be faster.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   457
	// Destroy the fonts and re-create them so that they have to be re-rasterized
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   458
	// for a fair comparison.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   459
	TInt arrayErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   460
	KTestNameVariant.Format(_L("%S RFbsGlyphMetricsArray"), &KTestName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   461
	fontFactory->ReleaseFonts();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   462
	fontFactory->CreateFontsL(KTestLanguage, KNumFonts);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   463
	RFbsGlyphMetricsArray array;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   464
	CleanupClosePushL(array);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   465
	iProfiler->InitResults();	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   466
	for (TInt rep = KNumFonts; (rep != 0) && (arrayErr == KErrNone); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   467
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   468
		arrayErr = array.Get(*(fontFactory->NextFont()), glyphCodes, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   469
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   470
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   471
	CleanupStack::PopAndDestroy(1); // array
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   472
	TEST(rep == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   473
	TESTE(arrayErr == KErrNone, arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   474
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumFonts, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   475
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   476
	// Third, do the test using GetCharacterData() to get the metrics.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   477
	// Destroy the fonts and re-create them so that they have to be re-rasterized
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   478
	// for a fair comparison.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   479
	KTestNameVariant.Format(_L("%S GetCharacterData"), &KTestName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   480
	fontFactory->ReleaseFonts();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   481
	fontFactory->CreateFontsL(KTestLanguage, KNumFonts);	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   482
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   483
	const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   484
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   485
	TOpenFontCharMetrics metrics;	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   486
	for (TInt rep = KNumFonts; (rep != 0); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   487
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   488
		CFbsFont* font = fontFactory->NextFont(); 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   489
		for (TInt glyphIndex = 0; glyphIndex < numGlyphCodes; glyphIndex++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   490
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   491
			font->GetCharacterData(glyphCodes[glyphIndex], metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   492
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   493
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   494
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   495
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumFonts, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   496
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   497
	CleanupStack::PopAndDestroy(1); // fontFactory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   498
	delete [] glyphCodes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   499
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   500
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   501
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   502
@SYMTestCaseID GRAPHICS-UI-BENCH-0189
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   503
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   504
@SYMTestType UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   505
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   506
@SYMPREQ PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   507
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   508
@SYMTestCaseDesc 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   509
Measures the performance of querying the TOpenFontCharMetrics using the different
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   510
available APIs. RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   511
are compared against each other, using the same fonts, and same sample data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   512
This test uses glyphs that have already been rasterized, thereby possibly reducing the 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   513
extra overhead this has.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   514
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   515
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   516
i. Load sample text data from config file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   517
ii. Create test font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   518
iii. Pre-rasterize glyphs using RFbsGlyphDataIterator. This will rasterize the glyphs 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   519
	and cause them to be cached for use by all the APIs tested here.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   520
iv. For each of RFbsGlyphMetricsArray, RFbsGlyphDataIterator, and CFont::GetCharacterData():
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   521
	1. Begin the loop, calling the necessary API once per font/loop.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   522
	2. For each glyph, request the glyph metrics.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   523
	3. Measure time between first and last font/loop.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   524
v. Destroy test font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   525
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   526
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   527
All results should be improved over GlyphMetricsQueryUnrasterized (GRAPHICS-UI-BENCH-0187).
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   528
since no rasterizing should take place during these tests.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   529
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   530
void CTFbsGlyphData::GlyphMetricsQueryPreRasterizedL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   531
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   532
	_LIT(KTestName, "GlyphMetricsQueryPreRasterized");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   533
	TBuf<128> KTestNameVariant;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   534
	const TInt KNumIterations = 500;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   535
	const TTestLanguage KTestLanguage = ETestLanguageLatin;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   536
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   537
	// Create a test font using the font factory.
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   538
    CTFontFactory* fontFactory = CTFontFactory::NewLC();
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   539
    fontFactory->CreateFontsL(ETestLanguageLatin, 1);   
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   540
    CFbsFont* font = fontFactory->NextFont();
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   541
	    
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   542
    TInt numGlyphCodes = 0;
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   543
	TUint* glyphCodes;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   544
	LoadConfigSampleDataL(font, KTestLanguage, ETrue, glyphCodes, numGlyphCodes); 
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   545
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   546
	TInt iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   547
	TInt rep = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   548
	// Rasterize the glyphs first.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   549
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   550
	CleanupClosePushL(iter);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   551
	for (rep = KNumIterations; (rep != 0) ; --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   552
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   553
		iterErr = iter.Open(*font, glyphCodes, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   554
		for (; iterErr == KErrNone; iterErr = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   555
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   556
			// no operation
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   557
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   558
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   559
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   560
	TEST(rep == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   561
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   562
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   563
	TOpenFontCharMetrics metrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   564
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   565
	// First do the test for the iterator. To ensure fair comparison with
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   566
	// RFbsGlyphMetricsArray, cycle through each iteration to ensure the metrics
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   567
	// for each glyph is found.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   568
	iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   569
	KTestNameVariant.Format(_L("%S RFbsGlyphDataIterator"), &KTestName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   570
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   571
	for (TInt rep = KNumIterations; (rep != 0); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   572
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   573
		for (iterErr = iter.Open(*font, glyphCodes, numGlyphCodes); iterErr == KErrNone; iterErr = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   574
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   575
			metrics = iter.Metrics();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   576
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   577
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   578
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   579
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   580
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   581
	CleanupStack::PopAndDestroy(1); // iter
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   582
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   583
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   584
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   585
	// Second, do the test for the array. This should be faster.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   586
	TInt arrayErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   587
	KTestNameVariant.Format(_L("%S RFbsGlyphMetricsArray"), &KTestName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   588
	RFbsGlyphMetricsArray array;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   589
	CleanupClosePushL(array);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   590
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   591
	for (TInt rep = KNumIterations; (rep != 0) && (arrayErr == KErrNone); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   592
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   593
		arrayErr = array.Get(*font, glyphCodes, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   594
		for (TInt i = 0; i < numGlyphCodes; ++i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   595
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   596
			metrics = array[i];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   597
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   598
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   599
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   600
	TESTE(arrayErr == KErrNone, arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   601
	CleanupStack::PopAndDestroy(1); // array
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   602
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   603
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   604
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   605
	// Third, do the test using GetCharacterData() to get the metrics.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   606
	KTestNameVariant.Format(_L("%S GetCharacterData"), &KTestName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   607
	const TUint8* bitmapData;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   608
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   609
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   610
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   611
	for (TInt rep = KNumIterations; (rep != 0); --rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   612
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   613
		for (TInt glyphIndex = 0; glyphIndex < numGlyphCodes; glyphIndex++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   614
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   615
			font->GetCharacterData(glyphCodes[glyphIndex], metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   616
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   617
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   618
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   619
	iProfiler->ResultsAnalysisGlyphRate(KTestNameVariant, 0, 0, 0, KNumIterations, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   620
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   621
	CleanupStack::PopAndDestroy(1); // fontFactory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   622
	delete [] glyphCodes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   623
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   624
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   625
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   626
@SYMTestCaseID GRAPHICS-UI-BENCH-0190
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   627
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   628
@SYMTestType UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   629
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   630
@SYMPREQ PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   631
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   632
@SYMTestCaseDesc 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   633
Measures the end-to-end performance of using Khronos APIs to render glyphs using the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   634
RFbsGlyphDataIterator API. Positioning is very basic and is not reflective of a production-
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   635
quality text-rendering algorithm, but serves as a useful benchmark of the overall
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   636
text-rendering performance using this API.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   637
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   638
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   639
i. Create a sample font to use. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   640
ii. Create a RSgImage to be used as a target for Khronos API rendering.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   641
iii. Set-up EGL and OpenVG.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   642
iv. Construct RFbsGlyphDataIterator, and open on sample data. At each iteration:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   643
	1. Create an EGLImage from the RSgImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   644
	2. Create a VGImage from the EGLImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   645
	3. Render the VGImage using vgDrawImage().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   646
	4. Destroy VGImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   647
	5. Destroy EGLImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   648
	6. Advance the current rendering position for the next glyph, ensuring that every glyph
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   649
	will be within the bounds of the target surface.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   650
v. Measure time from from first to last iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   651
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   652
void CTFbsGlyphData::GlyphRenderingL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   653
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   654
	_LIT(KTestName, "GlyphRendering");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   655
	const TInt KNumIterations = 500;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   656
    const TTestLanguage KTestLanguage = ETestLanguageHindi;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   657
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   658
	// Create some test fonts using the font factory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   659
	CTFontFactory* fontFactory = CTFontFactory::NewLC();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   660
	fontFactory->CreateFontsL(KTestLanguage, 1, 20);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   661
	CFbsFont* font = fontFactory->NextFont();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   662
	const TInt KFontHeightInPixels = font->HeightInPixels();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   663
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   664
	// Create RSgImage to be used as OpenVG Pixmap Surface
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   665
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   666
	RSgImage target;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   667
	TInt err = target.Create(TSgImageInfo(KEglTargetSize, ESgPixelFormatARGB_8888_PRE, ESgUsageBitOpenVgSurface));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   668
	TESTL(err == KErrNone);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   669
	CleanupClosePushL(target);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   670
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   671
	// Initialize EGL/OpenVG for rendering.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   672
	EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   673
	if (display == EGL_NO_DISPLAY)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   674
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   675
		ERR_PRINTF2(_L("Failed to get EGLDisplay. [eglError=%X]"), eglGetError());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   676
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   677
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   678
	TESTL(display != EGL_NO_DISPLAY);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   679
	if (EGL_FALSE == eglInitialize(display, NULL, NULL))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   680
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   681
		ERR_PRINTF2(_L("Failed to initialize EGLDisplay. [eglError=%X]"), eglGetError());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   682
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   683
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   684
	eglBindAPI(EGL_OPENVG_API);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   685
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   686
	EGLint imageAttribs[] =
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   687
	    {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   688
	    EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   689
	    EGL_NONE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   690
	    };
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   691
	EGLint configAttribs[] = 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   692
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   693
		EGL_MATCH_NATIVE_PIXMAP, (EGLint)&target,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   694
		EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   695
		EGL_SURFACE_TYPE, EGL_PIXMAP_BIT | EGL_VG_ALPHA_FORMAT_PRE_BIT, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   696
		EGL_NONE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   697
		};
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   698
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   699
	const EGLint KPixmapAttribsVgAlphaFormatPre[] = 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   700
	    {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   701
	    EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_PRE,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   702
	    EGL_NONE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   703
	    };
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   704
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   705
	EGLint configId = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   706
	EGLint numConfigs = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   707
	if (EGL_FALSE == eglChooseConfig(display, configAttribs, &configId, 1, &numConfigs) || numConfigs == 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   708
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   709
		ERR_PRINTF3(_L("Failed to find suitable EGLConfig. [eglError=%X, configs=%d]"), eglGetError(), numConfigs);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   710
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   711
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   712
	EGLContext context = eglCreateContext(display, configId, EGL_NO_CONTEXT, NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   713
	if (context == EGL_NO_CONTEXT)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   714
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   715
		ERR_PRINTF2(_L("Failed to create EGLContext. [eglError=%X]"), eglGetError());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   716
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   717
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   718
	EGLSurface surface = eglCreatePixmapSurface(display, configId, &target, KPixmapAttribsVgAlphaFormatPre);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   719
	if (EGL_FALSE == eglMakeCurrent(display, surface, surface, context))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   720
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   721
		ERR_PRINTF2(_L("Failed to create make surface and context current. [eglError=%X]"), eglGetError());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   722
		eglDestroyContext(display, context);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   723
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   724
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   725
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   726
	// Load the necessary EGL extensions...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   727
	TvgCreateEGLImageTargetKHRTypefPtr vgCreateImageTargetKHR;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   728
	PFNEGLCREATEIMAGEKHRPROC eglCreateImageKHR;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   729
	PFNEGLDESTROYIMAGEKHRPROC eglDestroyImageKHR;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   730
	eglCreateImageKHR = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   731
	eglDestroyImageKHR = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   732
	vgCreateImageTargetKHR = reinterpret_cast<TvgCreateEGLImageTargetKHRTypefPtr>(eglGetProcAddress("vgCreateEGLImageTargetKHR"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   733
	if (!eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateImageTargetKHR)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   734
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   735
		ERR_PRINTF1(_L("Failed to get EGL Image extension functions."));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   736
		User::Leave(KErrNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   737
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   738
	// Now we have an OpenVG window to render to!
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   739
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   740
	TInt numGlyphCodes = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   741
	TUint* glyphCodes;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   742
	LoadConfigSampleDataL(font, KTestLanguage, EFalse, glyphCodes, numGlyphCodes); 
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   743
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   744
	// Set up an identity matrix compatible with the Symbian co-ordinate system.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   745
	vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   746
	vgScale(1.f, -1.f);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   747
	vgTranslate(0, -KFontHeightInPixels);	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   748
	VGfloat vgIdentityMatrix[16];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   749
	vgGetMatrix(vgIdentityMatrix);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   750
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   751
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   752
	CleanupClosePushL(iter);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   753
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   754
	// Render some glyphs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   755
	TInt iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   756
	TInt rep = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   757
	vgClear(0, 0, KEglTargetSize.iWidth, KEglTargetSize.iHeight);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   758
	TPoint glyphOrigin(0, 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   759
	iProfiler->InitResults();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   760
	for (rep = 0; rep < KNumIterations; rep++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   761
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   762
		iterErr = iter.Open(*font, glyphCodes, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   763
		for (;iterErr == KErrNone; iterErr = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   764
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   765
			const TOpenFontCharMetrics& metrics = iter.Metrics();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   766
			const RSgImage& glyphSgImage = iter.Image();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   767
			EGLImageKHR eglImage = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   768
					reinterpret_cast<EGLClientBuffer>(&glyphSgImage), imageAttribs);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   769
			VGImage vgImage = vgCreateImageTargetKHR(eglImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   770
			
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   771
			// wrapped text placement.			
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   772
			TInt horizAdvance = metrics.HorizAdvance();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   773
			if (glyphOrigin.iX + horizAdvance >= KEglTargetSize.iWidth)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   774
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   775
				vgLoadMatrix(vgIdentityMatrix);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   776
				glyphOrigin.iX = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   777
				glyphOrigin.iY -= KFontHeightInPixels;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   778
				if (glyphOrigin.iY - KFontHeightInPixels < -KEglTargetSize.iHeight)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   779
					{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   780
					glyphOrigin.iY = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   781
					}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   782
				vgTranslate(glyphOrigin.iX, glyphOrigin.iY);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   783
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   784
			
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   785
			vgDrawImage(vgImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   786
			vgDestroyImage(vgImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   787
			eglDestroyImageKHR(display, eglImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   788
				
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   789
			// Move to next glyph position.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   790
			glyphOrigin.iX += horizAdvance;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   791
			vgTranslate(horizAdvance, 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   792
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   793
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   794
		eglSwapBuffers(display, surface);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   795
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   796
	iProfiler->MarkResultSetL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   797
	iProfiler->ResultsAnalysisGlyphRate(KTestName, 0, 0, 0, KNumIterations, numGlyphCodes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   798
	TEST(rep == KNumIterations);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   799
	TESTE(iterErr == KErrNotFound, iterErr);	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   800
	WriteTargetOutput(KTestName());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   801
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   802
	eglDestroySurface(display, surface);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   803
	eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   804
	eglTerminate(display);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   805
	eglReleaseThread();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   806
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   807
	CleanupStack::PopAndDestroy(3); // iter, target, fontFactory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   808
	delete [] glyphCodes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   809
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   810
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   811
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   812
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   813
Captures the EGL Surface (it is assumed to be an OpenVG surface) to a 256-grey CFbsBitmap,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   814
used when sanity-checking bitmaps are enabled. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   815
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   816
CFbsBitmap* CTFbsGlyphData::GetTargetAsBitmapL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   817
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   818
#ifdef SYMBIAN_GRAPHICS_EGL_SGIMAGELITE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   819
	// For debugging purposes only.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   820
	// Capture the final state of the EGL Pixmap surface as an mbm.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   821
	const TInt KDataStride = KEglTargetSize.iWidth;
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   822
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   823
	TUint8* imageScanline = reinterpret_cast<TUint8*>(User::AllocZL(KDataStride));
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   824
	CleanupStack::PushL(imageScanline);
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   825
	CFbsBitmap* bitmap = new (ELeave) CFbsBitmap();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   826
	CleanupStack::PushL(bitmap);
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   827
	User::LeaveIfError(bitmap->Create(KEglTargetSize, EGray256));
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   828
	bitmap->BeginDataAccess();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   829
	TUint8* dataAddress = reinterpret_cast<TUint8*>(bitmap->DataAddress());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   830
	const TInt dataStride = bitmap->DataStride();	
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   831
	for (TInt scanline = 0; scanline < KEglTargetSize.iHeight; scanline++)
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   832
		{
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   833
	    vgReadPixels(imageScanline, KDataStride, VG_A_8, 0, scanline, KEglTargetSize.iWidth, 1);
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   834
		Mem::Copy(dataAddress, imageScanline, KEglTargetSize.iWidth);
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   835
		dataAddress += dataStride;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   836
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   837
	bitmap->EndDataAccess(EFalse);
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   838
	CleanupStack::Pop(2); // bitmap, imageScanline
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   839
	return bitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   840
#else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   841
	return NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   842
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   843
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   844
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   845
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   846
Utility method. Loads sample glyph code data from the config ini file
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   847
into a TUint array.
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   848
@param aFont The font that the glyph codes will be associated with.
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   849
@param aLanguage The language variant to load from the config file as sample data.
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   850
@param aLongData Whether to use the long variant (ETrue) or short variant (EFalse) 
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   851
    of the sample data for the given language.
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   852
@param aGlyphCodes On success, holds an array of glyph codes, to be freed by the caller.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   853
@param aNumGlyphCodes On success, holds the count of the glyph code array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   854
@leave KErrNotFound if the test data cannot be found or is empty in the config file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   855
 */
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   856
void CTFbsGlyphData::LoadConfigSampleDataL(CFbsFont* aFont, TTestLanguage aLanguage, TBool aLongData, TUint*& aGlyphCodes, TInt& aNumGlyphCodes)
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   857
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   858
	// The name of the section in the config file to look-up the sample data
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   859
	_LIT(KConfigFileSampleData, "GlyphDataSampleText");
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   860
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   861
	TBuf<32> keyName = ConfigKeyNameL(aLanguage, aLongData);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   862
	
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   863
	// Setup the converter to use the passed font.
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   864
	iCharCodeConverter->UseFontL(aFont);
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   865
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   866
	// Load the sample string data from the config file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   867
	TPtrC sampleText;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   868
	TESTL(GetStringFromConfig(KConfigFileSampleData, keyName, sampleText));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   869
	aNumGlyphCodes = sampleText.Length();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   870
	if (aNumGlyphCodes <= 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   871
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   872
		User::Leave(KErrNotFound);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   873
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   874
	aGlyphCodes = new(ELeave) TUint[aNumGlyphCodes];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   875
	for (TInt code = 0; code < aNumGlyphCodes; ++code)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   876
		{
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   877
		aGlyphCodes[code] = iCharCodeConverter->GlyphCodeL(sampleText[code]); 
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   878
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   879
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   880
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   881
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   882
Creates the name of the key to look for in the config file for the test
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   883
with the specified parameters.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   884
@param aLanguage The language the test will use.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   885
@param aLongData Whether to use long or short sample data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   886
@return A descriptor value of the language.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   887
@leave KErrNotSupported if aLanguage is not recognised.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   888
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   889
TBufC<32> CTFbsGlyphData::ConfigKeyNameL(TTestLanguage aLanguage, TBool aLongData)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   890
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   891
	if (aLanguage < 0 || aLanguage > 1)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   892
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   893
		User::Leave(KErrNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   894
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   895
	TBuf<32> langName[2];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   896
	langName[ETestLanguageLatin].Append(_L("Latin"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   897
	langName[ETestLanguageHindi].Append(_L("Hindi"));	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   898
	langName[aLanguage].Append((aLongData) ? _L("Long") : _L("Short"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   899
	return langName[aLanguage];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   900
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   901
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   902
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   903
Font factory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   904
Utiltiy class for providing fonts for the performance tests.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   905
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   906
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   907
CTFontFactory::CTFontFactory()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   908
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   909
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   910
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   911
CTFontFactory::~CTFontFactory()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   912
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   913
	ReleaseFonts();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   914
	delete iTs;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   915
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   916
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   917
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   918
@return A new Font Factory ready to create fonts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   919
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   920
CTFontFactory* CTFontFactory::NewLC()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   921
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   922
	CTFontFactory* fontFactory = new (ELeave) CTFontFactory();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   923
	CleanupStack::PushL(fontFactory);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   924
	fontFactory->iTs = static_cast<CFbsTypefaceStore*>(CFbsTypefaceStore::NewL(NULL));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   925
	return fontFactory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   926
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   927
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   928
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   929
Creates a number of fonts for use by tests. All the fonts are created up-front so 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   930
that NextFont() can be called as a very lightweight call, so it can be used inside
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   931
tests with minimal impact.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   932
Once fonts are created, the factory must not be destroyed until the fonts it created
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   933
are finished with.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   934
@param aLanaugeMask Which language needs to be supported by the returned fonts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   935
@param aNumFonts The number of fonts to create
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   936
@param aStartSizeInPixels The lower bound font height of the fonts that are created. All
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   937
	fonts will be at least as big as this value.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   938
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   939
void CTFontFactory::CreateFontsL(TTestLanguage aLanguageMask, TInt aNumFonts, TInt aStartSizeInPixels)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   940
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   941
	ReleaseFonts();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   942
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   943
	RArray <TPtrC> typefaceNames;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   944
	CleanupClosePushL(typefaceNames);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   945
	switch(aLanguageMask)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   946
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   947
		case ETestLanguageHindi:	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   948
			User::LeaveIfError(typefaceNames.Reserve(1));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   949
			typefaceNames.Append(_L("Devanagari OT Eval"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   950
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   951
		case ETestLanguageLatin:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   952
			User::LeaveIfError(typefaceNames.Reserve(3));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   953
			typefaceNames.Append(_L("DejaVu Sans Condensed"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   954
			typefaceNames.Append(_L("DejaVu Serif"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   955
			typefaceNames.Append(_L("DejaVu Sans Mono"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   956
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   957
		default:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   958
			User::Leave(KErrNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   959
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   960
	const TInt KNumTypefaces = typefaceNames.Count();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   961
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   962
	iFont = new CFbsFont*[aNumFonts];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   963
	for (TInt count = 0; count < aNumFonts; ++count)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   964
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   965
		// After every KNumTypefaces font, increase size by 5.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   966
		TInt size = aStartSizeInPixels + (5 *(count / KNumTypefaces));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   967
		TPtrC typefaceName = typefaceNames[count % KNumTypefaces];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   968
		TFontSpec fontSpec(typefaceName, size);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   969
		User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont[count], fontSpec));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   970
		++iNumFonts;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   971
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   972
	iCurFont = -1;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   973
	CleanupStack::PopAndDestroy(1); // typefaceNames
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   974
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   975
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   976
Releases all created fonts and frees associated memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   977
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   978
void CTFontFactory::ReleaseFonts()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   979
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   980
	for (TInt font = 0; font < iNumFonts; ++font)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   981
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   982
		iTs->ReleaseFont(iFont[font]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   983
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   984
	delete [] iFont;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   985
	iFont = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   986
	iNumFonts = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   987
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   988
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   989
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   990
@return The next font to be used. If it reaches the last font, the next font will
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   991
	cycle back around to the first font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   992
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   993
CFbsFont* CTFontFactory::NextFont()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   994
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   995
	return iFont[++iCurFont%iNumFonts];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   996
	}