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