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