os/textandloc/fontservices/fontstore/tfs/t_linkedfontsmemory.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include "FNTSTD.H"
sl@0
    20
#include "t_linkedfontsmemory.h"
sl@0
    21
#include "T_LinkedFonts2.h"
sl@0
    22
#include "fbsmessage.h"
sl@0
    23
#include <hal.h>
sl@0
    24
#include <linkedfonts.h>
sl@0
    25
sl@0
    26
class CTLinkedFontsMemory : public CTLinkedFonts2
sl@0
    27
	{
sl@0
    28
public:
sl@0
    29
	CTLinkedFontsMemory(CTestStep* aStep);
sl@0
    30
	~CTLinkedFontsMemory();
sl@0
    31
	//base class static void TestPanic(TInt aPanic);
sl@0
    32
protected:
sl@0
    33
// From CTGraphicsStep
sl@0
    34
	virtual void RunTestCaseL(TInt aCurTestCase);
sl@0
    35
private:
sl@0
    36
	
sl@0
    37
	TInt TestLinkedFontsMemory1L(TInt aTypefaces);
sl@0
    38
	void TestLinkedFontsMemory1L();
sl@0
    39
	TInt TestLinkedFontsCreateLinkedTypefacesL(const TDesC& aName,TInt aTypefaces);
sl@0
    40
	TInt TestLinkedFontsMemory_Part2(const TDesC& aName);
sl@0
    41
	void TestLinkedFontsMemory2();
sl@0
    42
	void TestLinkedFontsMemory3();
sl@0
    43
	void TestLinkedFontsMemory4();
sl@0
    44
	void TestMemoryUsage();
sl@0
    45
	
sl@0
    46
	void SetHeapFail(RFbsSession::THeapFailType aType, TInt aFailures);
sl@0
    47
	TInt HeapCount(RFbsSession::THeapFailType aType);
sl@0
    48
	void SetHeapReset(RFbsSession::THeapFailType aType);
sl@0
    49
	void SetHeapCheck(RFbsSession::THeapFailType aType);
sl@0
    50
	void TestCompareText();
sl@0
    51
	TInt FontAndBitmapServerSharedHeap();
sl@0
    52
	void DisplayRamInfo(const TDesC &aTextInfo) const;
sl@0
    53
	TBool CheckRasterizerInstalledL();
sl@0
    54
	};
sl@0
    55
sl@0
    56
CTLinkedFontsMemory::CTLinkedFontsMemory(CTestStep* aStep)
sl@0
    57
	:	CTLinkedFonts2(aStep)
sl@0
    58
	{
sl@0
    59
	}	
sl@0
    60
sl@0
    61
CTLinkedFontsMemory::~CTLinkedFontsMemory()
sl@0
    62
	{
sl@0
    63
	}
sl@0
    64
sl@0
    65
void CTLinkedFontsMemory::SetHeapFail(RFbsSession::THeapFailType aType, TInt aFailures)
sl@0
    66
	{
sl@0
    67
	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0
    68
	iFbs->SendCommand(EFbsMessSetHeapFail, aType, aFailures);
sl@0
    69
	}
sl@0
    70
sl@0
    71
TInt CTLinkedFontsMemory::HeapCount(RFbsSession::THeapFailType aType)
sl@0
    72
	{
sl@0
    73
	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0
    74
	return iFbs->SendCommand(EFbsMessHeapCount, aType);
sl@0
    75
	}
sl@0
    76
sl@0
    77
void CTLinkedFontsMemory::SetHeapReset(RFbsSession::THeapFailType aType)
sl@0
    78
	{
sl@0
    79
	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0
    80
	iFbs->SendCommand(EFbsMessSetHeapReset, aType);
sl@0
    81
	}
sl@0
    82
sl@0
    83
void CTLinkedFontsMemory::SetHeapCheck(RFbsSession::THeapFailType aType)
sl@0
    84
	{
sl@0
    85
	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0
    86
	iFbs->SendCommand(EFbsMessSetHeapCheck, aType);
sl@0
    87
	}
sl@0
    88
sl@0
    89
TInt CTLinkedFontsMemory::FontAndBitmapServerSharedHeap()
sl@0
    90
	{
sl@0
    91
	__ASSERT_ALWAYS(iFbs, TestPanic(KErrGeneral));
sl@0
    92
	return iFbs->SendCommand(EFbsMessHeap);
sl@0
    93
	}
sl@0
    94
sl@0
    95
_LIT(KLinkedFontsMemoryTestFont,"MemTestLinkedFnt");
sl@0
    96
TBool CTLinkedFontsMemory::CheckRasterizerInstalledL()
sl@0
    97
	{
sl@0
    98
	CFbsTypefaceStore* store = CFbsTypefaceStore::NewL(iDev);
sl@0
    99
	CleanupStack::PushL(store);
sl@0
   100
	
sl@0
   101
	// Create typeface to be linked
sl@0
   102
	CLinkedTypefaceSpecification *typefaceSpec;
sl@0
   103
	typefaceSpec = CLinkedTypefaceSpecification::NewLC(KLinkedFontsMemoryTestFont);
sl@0
   104
	
sl@0
   105
	CLinkedTypefaceGroup* group1 = CLinkedTypefaceGroup::NewLC(1);
sl@0
   106
	typefaceSpec->AddLinkedTypefaceGroupL(*group1);
sl@0
   107
	CleanupStack::Pop();
sl@0
   108
	
sl@0
   109
	// Add first typeface
sl@0
   110
	CLinkedTypefaceElementSpec *elementSpec1;
sl@0
   111
	_LIT(KLinkedTypefaceTT, "DejaVu Sans Condensed");
sl@0
   112
	elementSpec1 = CLinkedTypefaceElementSpec::NewLC(KLinkedTypefaceTT, 1);
sl@0
   113
	elementSpec1->SetCanonical(ETrue);
sl@0
   114
		
sl@0
   115
	typefaceSpec->AddTypefaceAtBackL(*elementSpec1);
sl@0
   116
	CleanupStack::Pop(1, elementSpec1);
sl@0
   117
	
sl@0
   118
	// Now try regstering the linked typeface
sl@0
   119
	TRAPD(ret, typefaceSpec->RegisterLinkedTypefaceL(*store));
sl@0
   120
	CleanupStack::PopAndDestroy(2, store);
sl@0
   121
sl@0
   122
	switch (ret)
sl@0
   123
		{
sl@0
   124
		case KErrAlreadyExists:
sl@0
   125
		case KErrNone:
sl@0
   126
			return ETrue;
sl@0
   127
		default:
sl@0
   128
			INFO_PRINTF1(_L("Linked fonts memory: no linked fonts rasterizer found"));
sl@0
   129
			return EFalse;
sl@0
   130
		}
sl@0
   131
	}
sl@0
   132
sl@0
   133
_LIT(KDrawMe, "lInKED FOnTS");
sl@0
   134
sl@0
   135
void CTLinkedFontsMemory::TestCompareText()
sl@0
   136
	{
sl@0
   137
	_LIT(KWithout, "WithoutLinkedFontTT");
sl@0
   138
	TTypeface typeface;
sl@0
   139
	typeface.iName = KWithout;
sl@0
   140
	TFontSpec fs;
sl@0
   141
	fs.iTypeface = typeface;
sl@0
   142
	fs.iHeight = 20;
sl@0
   143
	CFbsFont* font = NULL;
sl@0
   144
	TInt err1 = iDev->GetNearestFontToDesignHeightInPixels(font, fs);
sl@0
   145
sl@0
   146
	if (font && err1 == KErrNone)
sl@0
   147
		{
sl@0
   148
		// Use the font
sl@0
   149
		TSize scrSize = iDev->SizeInPixels();
sl@0
   150
		iGc->UseFont(font);
sl@0
   151
		iGc->DrawText(KDrawMe, TPoint((scrSize.iWidth / 2) + 50, 50));
sl@0
   152
		iGc->DiscardFont();
sl@0
   153
		iDev->ReleaseFont(font);
sl@0
   154
		TPoint left(0, 0);
sl@0
   155
		TPoint right(scrSize.iWidth / 2, 0);
sl@0
   156
		TBool val = iDev->RectCompare(TRect(left, TPoint(scrSize.iWidth / 2, scrSize.iHeight)), *iDev,TRect(right, TPoint(scrSize.iWidth, scrSize.iHeight)));
sl@0
   157
		if (!val)
sl@0
   158
			{
sl@0
   159
			iGc->DrawRect(TRect(left, TPoint(scrSize.iWidth / 2, scrSize.iHeight)));
sl@0
   160
			iGc->DrawRect(TRect(right, TPoint(scrSize.iWidth, scrSize.iHeight)));
sl@0
   161
			}
sl@0
   162
		TEST(val);
sl@0
   163
		
sl@0
   164
		}
sl@0
   165
	else
sl@0
   166
		{
sl@0
   167
		TEST(0);  //there is a failure
sl@0
   168
		}
sl@0
   169
	}
sl@0
   170
sl@0
   171
/** these fonts need to be provided, and are used for creating linked typefaces
sl@0
   172
TLinkedFont1.ttf
sl@0
   173
Typeface name: LinkedFont1
sl@0
   174
This will be the dominant font. It contains 178 characters.
sl@0
   175
Some of the characters (13) are deleted from this file and separated in to other three files.
sl@0
   176
Characters missing are F, D, J, M, P, S, V, X, Z, a, n, l, y.
sl@0
   177
sl@0
   178
TLinkedFont2.ttf
sl@0
   179
Typeface name: LinkedFont2
sl@0
   180
Characters available (7):	F, J, M, S, Z, a, y.
sl@0
   181
sl@0
   182
TLinkedFont3.ttf
sl@0
   183
Typeface name: LinkedFont3
sl@0
   184
Characters available (4):	D, P, x, l
sl@0
   185
sl@0
   186
TLinkedFont4.ttf
sl@0
   187
Typeface name: LinkedFont4
sl@0
   188
Characters available (2):	V, n
sl@0
   189
sl@0
   190
TWithoutLinkedFont.ttf
sl@0
   191
Typeface name: WithoutLinkedFont
sl@0
   192
Characters available:	It contains 191 characters U+0020-U+007E and U+00A0-U+00FF
sl@0
   193
*/	
sl@0
   194
sl@0
   195
_LIT(KLinkedFont1, "LinkedFont1TT");
sl@0
   196
_LIT(KLinkedFont2, "LinkedFont2TT");
sl@0
   197
_LIT(KLinkedFont3, "LinkedFont3TT");
sl@0
   198
_LIT(KLinkedFont4, "LinkedFont4TT");
sl@0
   199
sl@0
   200
/** Memory test helper function to create different typefaces.  Function adds from 1 to four
sl@0
   201
 typefaces.
sl@0
   202
*/
sl@0
   203
TInt CTLinkedFontsMemory::TestLinkedFontsCreateLinkedTypefacesL(const TDesC &aName,TInt aTypefaces)
sl@0
   204
	{
sl@0
   205
	TInt ret = KErrNone;
sl@0
   206
sl@0
   207
	CLinkedTypefaceSpecification *typefaceSpec;
sl@0
   208
sl@0
   209
	typefaceSpec = CLinkedTypefaceSpecification::NewLC(aName);
sl@0
   210
	
sl@0
   211
	CLinkedTypefaceGroup* group1;
sl@0
   212
sl@0
   213
	group1 = CLinkedTypefaceGroup::NewLC(1); //may well leave, function trapped, groupID = 1
sl@0
   214
	typefaceSpec->AddLinkedTypefaceGroupL(*group1);
sl@0
   215
	CleanupStack::Pop(); //pop the group, now referenced via typeface
sl@0
   216
	
sl@0
   217
	CLinkedTypefaceElementSpec *elementSpec1;
sl@0
   218
	elementSpec1 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont1, 1);	
sl@0
   219
	elementSpec1->SetCanonical(ETrue);
sl@0
   220
	typefaceSpec->AddTypefaceAtBackL(*elementSpec1);
sl@0
   221
	CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0
   222
sl@0
   223
	// Create and add second linked typeface
sl@0
   224
	if (aTypefaces>=2)
sl@0
   225
		{
sl@0
   226
		CLinkedTypefaceElementSpec *elementSpec2;
sl@0
   227
		elementSpec2 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont2, 1);	
sl@0
   228
		typefaceSpec->AddTypefaceAtBackL(*elementSpec2);
sl@0
   229
		CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0
   230
		}
sl@0
   231
sl@0
   232
	// Create and add third typeface to be linked
sl@0
   233
	if (aTypefaces>=3)
sl@0
   234
		{
sl@0
   235
		CLinkedTypefaceElementSpec *elementSpec3;
sl@0
   236
		elementSpec3 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont3, 1);	
sl@0
   237
		typefaceSpec->AddTypefaceAtBackL(*elementSpec3);
sl@0
   238
		CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0
   239
		}
sl@0
   240
sl@0
   241
	// Create and add fourth typeface to be linked
sl@0
   242
	if (aTypefaces>=4)
sl@0
   243
		{
sl@0
   244
		CLinkedTypefaceElementSpec *elementSpec4;
sl@0
   245
		elementSpec4 = CLinkedTypefaceElementSpec::NewLC(KLinkedFont4, 1);	
sl@0
   246
		TRAP(ret,typefaceSpec->AddTypefaceAtBackL(*elementSpec4));
sl@0
   247
		CleanupStack::Pop();  //pop the element, now referenced via typeface
sl@0
   248
		}
sl@0
   249
sl@0
   250
	// Try registering the typeface
sl@0
   251
	CFbsTypefaceStore* store = CFbsTypefaceStore::NewL(iDev);
sl@0
   252
	CleanupStack::PushL(store);
sl@0
   253
	typefaceSpec->RegisterLinkedTypefaceL(*store);
sl@0
   254
	CleanupStack::PopAndDestroy(2, typefaceSpec); //store and typefaceSpec
sl@0
   255
	return ret;
sl@0
   256
	}
sl@0
   257
sl@0
   258
/** This is the function which does the operations which are tested, called from OOM loop
sl@0
   259
 * in general the function does not return a low memory error; the function just leaves.
sl@0
   260
 * An exception may be for registration.
sl@0
   261
*/
sl@0
   262
TInt CTLinkedFontsMemory::TestLinkedFontsMemory1L(TInt aTypefaces)
sl@0
   263
	{
sl@0
   264
	TInt ret = KErrNone;
sl@0
   265
	
sl@0
   266
	//these are for the linked typefaces
sl@0
   267
	_LIT(KLinkedTypeface1, "LinkedMem1-1"); //has LinkedFont1
sl@0
   268
	_LIT(KLinkedTypeface2, "LinkedMem1-2"); //has LinkedFont1, LinkedFont2
sl@0
   269
	_LIT(KLinkedTypeface3, "LinkedMem1-3"); //has LinkedFont1, LinkedFont2, LinkedFont3
sl@0
   270
	_LIT(KLinkedTypeface4, "LinkedMem1-4"); //has LinkedFont1, LinkedFont2, LinkedFont3, LinkedFont4	
sl@0
   271
	
sl@0
   272
	// Create canonical typeface to be linked
sl@0
   273
sl@0
   274
	switch (aTypefaces)
sl@0
   275
		{
sl@0
   276
		case 1:
sl@0
   277
			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface1,1);
sl@0
   278
			break;
sl@0
   279
		case 2:
sl@0
   280
			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface2,2);
sl@0
   281
			break;
sl@0
   282
		case 3:
sl@0
   283
			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface3,3);
sl@0
   284
			break;
sl@0
   285
		case 4:
sl@0
   286
			ret = TestLinkedFontsCreateLinkedTypefacesL(KLinkedTypeface4,4);
sl@0
   287
			break;
sl@0
   288
		default:
sl@0
   289
			__ASSERT_ALWAYS(ETrue,Panic(EFntTypefaceIndexOutOfRange));
sl@0
   290
			break;
sl@0
   291
		}
sl@0
   292
	
sl@0
   293
	RDebug::Printf("%d TestLinkedFontsMemory1L(%d)", ret, aTypefaces);
sl@0
   294
	return ret;
sl@0
   295
	}
sl@0
   296
sl@0
   297
/**
sl@0
   298
   @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0102
sl@0
   299
sl@0
   300
   @SYMPREQ					PREQ2146
sl@0
   301
sl@0
   302
   @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0
   303
sl@0
   304
   @SYMTestCaseDesc			To ensure that a linked typeface can be created and registered 
sl@0
   305
   							without memory leaks, under low memory conditions. 
sl@0
   306
sl@0
   307
   @SYMTestPriority			Critical
sl@0
   308
sl@0
   309
   @SYMTestStatus			Implemented
sl@0
   310
sl@0
   311
   @SYMTestActions			(1) Create an OOM loop,	setting this process's heap memory to fail.
sl@0
   312
   								testing the client side heap memory allocation.
sl@0
   313
								In the loop create and register a linked typeface with 1-4
sl@0
   314
								typefaces
sl@0
   315
sl@0
   316
   @SYMTestExpectedResults	(1) - There are no memory leaks, and the test exits the OOM loop.
sl@0
   317
*/
sl@0
   318
void CTLinkedFontsMemory::TestLinkedFontsMemory1L()
sl@0
   319
	{
sl@0
   320
	TInt failures;
sl@0
   321
sl@0
   322
	INFO_PRINTF1(_L("TestLinkedFontsMemory"));
sl@0
   323
	TInt steps;
sl@0
   324
	for (steps=1;steps<=4;steps++)
sl@0
   325
		{
sl@0
   326
sl@0
   327
		for (failures = 1; ; failures++)
sl@0
   328
			{
sl@0
   329
			__UHEAP_SETFAIL(RHeap::EDeterministic,failures);
sl@0
   330
			__UHEAP_MARK;
sl@0
   331
sl@0
   332
			// Test steps
sl@0
   333
			TInt err;
sl@0
   334
			TInt val = KErrNone;
sl@0
   335
			TRAP(err, val= TestLinkedFontsMemory1L(steps));
sl@0
   336
			__UHEAP_CHECK(0);
sl@0
   337
			__UHEAP_RESET;
sl@0
   338
			__UHEAP_MARKEND;
sl@0
   339
sl@0
   340
			if (err == KErrNotFound)
sl@0
   341
				{
sl@0
   342
				INFO_PRINTF3(_L("Failure below occurred on Step %i; failure=%i"), steps, failures);
sl@0
   343
				TEST(EFalse);
sl@0
   344
				break;
sl@0
   345
				}
sl@0
   346
			
sl@0
   347
			if ((err == KErrNone) && (val == KErrNone))
sl@0
   348
				{
sl@0
   349
				break;
sl@0
   350
				}
sl@0
   351
			}
sl@0
   352
		}
sl@0
   353
	}
sl@0
   354
sl@0
   355
/**
sl@0
   356
   @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0103
sl@0
   357
sl@0
   358
   @SYMPREQ					PREQ2146
sl@0
   359
sl@0
   360
   @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0
   361
sl@0
   362
   @SYMTestCaseDesc			To ensure that a linked typeface can be created and fonts created
sl@0
   363
							and used without memory leaks, under low memory conditions
sl@0
   364
sl@0
   365
   @SYMTestPriority			Critical
sl@0
   366
sl@0
   367
   @SYMTestStatus			Implemented
sl@0
   368
sl@0
   369
   @SYMTestActions			(1) Create an OOM loop, setting the server's heap memory to fail.
sl@0
   370
								In the loop create and register a linked typeface with 1-4
sl@0
   371
								typefaces.  
sl@0
   372
							(2) Draw text with the four linked fonts from the four
sl@0
   373
								linked typefaces.  
sl@0
   374
							(3) Compare the text output against an unlinked font with the same 
sl@0
   375
								character forms.
sl@0
   376
sl@0
   377
   @SYMTestExpectedResults	(1) - There are no memory leaks, and the test exits the OOM loop.
sl@0
   378
   							(2) - The text is draw successfully
sl@0
   379
   							(3) - The text compares identically.
sl@0
   380
*/	
sl@0
   381
void CTLinkedFontsMemory::TestLinkedFontsMemory2()
sl@0
   382
	{
sl@0
   383
	TInt failures;
sl@0
   384
sl@0
   385
	INFO_PRINTF1(_L("TestLinkedFontsMemory Server Heap"));
sl@0
   386
sl@0
   387
	// Initially test for linked typeface creation
sl@0
   388
	_LIT(name1, "typefaceNameMem2-1");
sl@0
   389
	_LIT(name2, "typefaceNameMem2-2");
sl@0
   390
	_LIT(name3, "typefaceNameMem2-3");
sl@0
   391
	_LIT(name4, "typefaceNameMem2-4");
sl@0
   392
sl@0
   393
	TInt steps;
sl@0
   394
	for (steps=1;steps<=4;steps++)
sl@0
   395
		{
sl@0
   396
		INFO_PRINTF2(_L("Testing creating linked typeface %d typefaces"),steps);
sl@0
   397
		for (failures = 1;;failures++)
sl@0
   398
			{
sl@0
   399
			// Try creating the typeface
sl@0
   400
sl@0
   401
			TInt err;
sl@0
   402
			TInt val = KErrNone;
sl@0
   403
sl@0
   404
			SetHeapFail(RFbsSession::EHeapFailTypeServerMemory, failures);
sl@0
   405
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0
   406
			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //on
sl@0
   407
sl@0
   408
			switch(steps)
sl@0
   409
				{
sl@0
   410
				case 1:
sl@0
   411
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name1, steps));
sl@0
   412
					break;
sl@0
   413
				case 2:
sl@0
   414
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name2, steps));
sl@0
   415
					break;
sl@0
   416
				case 3:
sl@0
   417
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name3, steps));
sl@0
   418
					break;
sl@0
   419
				case 4:
sl@0
   420
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name4, steps));
sl@0
   421
					break;
sl@0
   422
				}
sl@0
   423
sl@0
   424
			SetHeapReset(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   425
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0
   426
			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //off
sl@0
   427
sl@0
   428
			//If the linked font cannot be created because the typefaces are not present or
sl@0
   429
			//it has already been created then fail the test.
sl@0
   430
			if (err == KErrNotFound || err == KErrAlreadyExists)
sl@0
   431
				{
sl@0
   432
				INFO_PRINTF1(_L("Failure below caused by missing linked font element file or linked font file already being generated."));
sl@0
   433
				TEST(EFalse);
sl@0
   434
				break;
sl@0
   435
				}
sl@0
   436
			
sl@0
   437
			if ((val >= 0) && (err == KErrNone))
sl@0
   438
				break;
sl@0
   439
			}
sl@0
   440
		}
sl@0
   441
sl@0
   442
	INFO_PRINTF1(_L("Testing linked typeface font creation and usage"));
sl@0
   443
	for(steps=1;steps<=4;steps++)
sl@0
   444
		{
sl@0
   445
		INFO_PRINTF2(_L("Testing font usage: linked font with %d fonts"),steps);
sl@0
   446
		for (failures = 1; ; failures++)
sl@0
   447
			{
sl@0
   448
			TInt val = 0;
sl@0
   449
#ifdef _DEBUG
sl@0
   450
			TInt serverBefore=HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   451
			TInt countBefore =0;
sl@0
   452
sl@0
   453
			RHeap *heap = (RHeap*)FontAndBitmapServerSharedHeap();
sl@0
   454
			
sl@0
   455
			if (heap)
sl@0
   456
				{
sl@0
   457
				__RHEAP_MARK(heap);
sl@0
   458
				countBefore = heap->Count();
sl@0
   459
				}
sl@0
   460
			SetHeapFail(RFbsSession::EHeapFailTypeServerMemory, failures);
sl@0
   461
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0
   462
#endif
sl@0
   463
sl@0
   464
			switch(steps)
sl@0
   465
				{
sl@0
   466
				case 1:
sl@0
   467
					val=TestLinkedFontsMemory_Part2(name1);
sl@0
   468
					break;
sl@0
   469
				case 2:
sl@0
   470
					val=TestLinkedFontsMemory_Part2(name2);
sl@0
   471
					break;
sl@0
   472
				case 3:
sl@0
   473
					val=TestLinkedFontsMemory_Part2(name3);
sl@0
   474
					break;
sl@0
   475
				case 4:
sl@0
   476
					val=TestLinkedFontsMemory_Part2(name4);
sl@0
   477
					break;
sl@0
   478
				}
sl@0
   479
#ifdef _DEBUG
sl@0
   480
			TInt serverAfter = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   481
			TInt countAfter=0;
sl@0
   482
			TInt badCell=0;
sl@0
   483
			if (heap)
sl@0
   484
				{
sl@0
   485
				countAfter = heap->Count();
sl@0
   486
				badCell = __RHEAP_MARKEND(heap);
sl@0
   487
				}
sl@0
   488
sl@0
   489
			SetHeapReset(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   490
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0
   491
#endif
sl@0
   492
			if (val == KErrNone)
sl@0
   493
				{
sl@0
   494
				if (steps == 4)
sl@0
   495
					{
sl@0
   496
					//do a comparison of the text
sl@0
   497
					TestCompareText();
sl@0
   498
					}
sl@0
   499
				break;
sl@0
   500
				}
sl@0
   501
#ifdef _DEBUG
sl@0
   502
			TEST(badCell == 0);
sl@0
   503
			TEST(countBefore == countAfter);
sl@0
   504
			TEST(serverBefore == serverAfter);
sl@0
   505
#endif
sl@0
   506
			}
sl@0
   507
		}
sl@0
   508
	}
sl@0
   509
sl@0
   510
TInt CTLinkedFontsMemory::TestLinkedFontsMemory_Part2(const TDesC &aName)
sl@0
   511
	{
sl@0
   512
sl@0
   513
	TTypeface Typeface;
sl@0
   514
	Typeface.iName = aName;
sl@0
   515
	TFontSpec fs;
sl@0
   516
	fs.iTypeface = Typeface;
sl@0
   517
	fs.iHeight = 20;
sl@0
   518
	CFbsFont* font = NULL;
sl@0
   519
	TInt err1 = iDev->GetNearestFontToDesignHeightInPixels(font, fs);
sl@0
   520
sl@0
   521
	if (font && err1 == KErrNone)
sl@0
   522
		{
sl@0
   523
		// Use the font
sl@0
   524
		iGc->UseFont(font);
sl@0
   525
		iGc->Clear();
sl@0
   526
		iGc->DrawText(KDrawMe, TPoint(50, 50));
sl@0
   527
		iGc->DiscardFont();
sl@0
   528
		iDev->ReleaseFont(font);
sl@0
   529
		}
sl@0
   530
	else if (font == NULL)
sl@0
   531
		{
sl@0
   532
		TEST(err1==KErrNoMemory);
sl@0
   533
		if (err1==KErrNone)
sl@0
   534
			{
sl@0
   535
			err1 = KErrGeneral;
sl@0
   536
			}
sl@0
   537
		}
sl@0
   538
sl@0
   539
	return err1;
sl@0
   540
	}
sl@0
   541
sl@0
   542
/**
sl@0
   543
   @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0104
sl@0
   544
sl@0
   545
   @SYMPREQ					PREQ2146
sl@0
   546
sl@0
   547
   @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0
   548
sl@0
   549
   @SYMTestCaseDesc			To ensure that a linked typeface can be created and fonts created
sl@0
   550
							and used under low memory conditions
sl@0
   551
sl@0
   552
   @SYMTestPriority			Critical
sl@0
   553
sl@0
   554
   @SYMTestStatus			Implemented
sl@0
   555
sl@0
   556
   @SYMTestActions			(1) This function checks that no memory has been retained from the
sl@0
   557
								usage of a linked font.  This tests server heap and shared heap
sl@0
   558
								memory.
sl@0
   559
sl@0
   560
   @SYMTestExpectedResults	(1) - There are no memory leaks.
sl@0
   561
*/
sl@0
   562
void CTLinkedFontsMemory::TestLinkedFontsMemory3()
sl@0
   563
	{
sl@0
   564
	_LIT( KTest1, "typefaceNameMem2-1");
sl@0
   565
	_LIT( KTest2, "typefaceNameMem2-2");
sl@0
   566
	_LIT( KTest3, "typefaceNameMem2-3");
sl@0
   567
	_LIT( KTest4, "typefaceNameMem2-4");
sl@0
   568
sl@0
   569
#if _DEBUG
sl@0
   570
		TInt serverBefore = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   571
		// need to get heap from client side.
sl@0
   572
		RHeap *heap = (RHeap*)FontAndBitmapServerSharedHeap();
sl@0
   573
		TInt countBefore=0;
sl@0
   574
		if (heap)
sl@0
   575
			{
sl@0
   576
			__RHEAP_MARK(heap);
sl@0
   577
			countBefore = heap->Count();
sl@0
   578
			}
sl@0
   579
		TInt serverAfter;
sl@0
   580
#endif
sl@0
   581
	for (TInt numRuns = 0 ; numRuns <= 50 ; numRuns++)
sl@0
   582
		{
sl@0
   583
		for (TInt steps=1;steps<=4;steps++)
sl@0
   584
			{
sl@0
   585
			TTypeface Typeface;
sl@0
   586
			switch (steps)
sl@0
   587
				{
sl@0
   588
				case 1:
sl@0
   589
					Typeface.iName = KTest1;
sl@0
   590
					break;
sl@0
   591
				case 2:
sl@0
   592
					Typeface.iName = KTest2;
sl@0
   593
					break;
sl@0
   594
				case 3:
sl@0
   595
					Typeface.iName = KTest3;
sl@0
   596
					break;
sl@0
   597
				case 4:
sl@0
   598
					Typeface.iName = KTest4;
sl@0
   599
					break;
sl@0
   600
				}
sl@0
   601
			TFontSpec fs;
sl@0
   602
			fs.iTypeface = Typeface;
sl@0
   603
			fs.iHeight = 50;
sl@0
   604
			TInt count;
sl@0
   605
			CFbsFont *fnt[10];
sl@0
   606
	
sl@0
   607
			TInt err;
sl@0
   608
			for (count = 0; count < 10; count++)
sl@0
   609
				{
sl@0
   610
				err = iDev->GetNearestFontToDesignHeightInPixels(fnt[count], fs);
sl@0
   611
				//now try getting the same font twice, if count is 5
sl@0
   612
				if(count!=5)
sl@0
   613
					fs.iHeight++;
sl@0
   614
				TEST(err == KErrNone);
sl@0
   615
				}
sl@0
   616
			for (count = 0; count < 10; count++)
sl@0
   617
				{
sl@0
   618
				iDev->ReleaseFont(fnt[count]);
sl@0
   619
				}
sl@0
   620
			}
sl@0
   621
		}
sl@0
   622
#ifdef _DEBUG
sl@0
   623
		serverAfter = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   624
		TInt countAfter=0;
sl@0
   625
		TInt badCell=0;
sl@0
   626
		if (heap)
sl@0
   627
			{
sl@0
   628
			countAfter = heap->Count();
sl@0
   629
			badCell = __RHEAP_MARKEND(heap);
sl@0
   630
			}
sl@0
   631
		TEST(badCell == 0);
sl@0
   632
		TEST (countAfter <= countBefore);
sl@0
   633
sl@0
   634
			RDebug::Printf("serverAfter(%i) <= serverBefore(%i)", serverAfter, serverBefore);
sl@0
   635
			INFO_PRINTF3(_L("serverAfter(%i) <= serverBefore(%i)"), serverAfter, serverBefore);
sl@0
   636
sl@0
   637
		TEST(serverAfter <= serverBefore); // Note some true type tables are freed.
sl@0
   638
#endif
sl@0
   639
	}
sl@0
   640
sl@0
   641
/**
sl@0
   642
   @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0105
sl@0
   643
sl@0
   644
   @SYMPREQ					PREQ2146
sl@0
   645
sl@0
   646
   @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0
   647
sl@0
   648
   @SYMTestCaseDesc			To ensure that a linked typeface can be created and fonts created
sl@0
   649
							and used under low memory conditions of the font and bitmap
sl@0
   650
							server shared heap.
sl@0
   651
sl@0
   652
   @SYMTestPriority			Critical
sl@0
   653
sl@0
   654
   @SYMTestStatus			Implemented
sl@0
   655
sl@0
   656
   @SYMTestActions			(1) Create an OOM loop, setting the shared heap memory to fail.
sl@0
   657
								In the loop create and register a linked typeface with 1-4
sl@0
   658
								typefaces.  Draw text with the four linked fonts from the four
sl@0
   659
								linked typefaces.
sl@0
   660
sl@0
   661
   @SYMTestExpectedResults	(1) - There are no memory leaks, and the test exits the OOM loop.
sl@0
   662
*/
sl@0
   663
void CTLinkedFontsMemory::TestLinkedFontsMemory4()
sl@0
   664
	{
sl@0
   665
sl@0
   666
	TInt failures;
sl@0
   667
sl@0
   668
	INFO_PRINTF1(_L("TestLinkedFontsMemory Shared Heap"));
sl@0
   669
sl@0
   670
	// Initially test for linked typeface creation
sl@0
   671
	// Initially test for linked typeface creation
sl@0
   672
	_LIT(name1, "typefaceNameMem4-1");
sl@0
   673
	_LIT(name2, "typefaceNameMem4-2");
sl@0
   674
	_LIT(name3, "typefaceNameMem4-3");
sl@0
   675
	_LIT(name4, "typefaceNameMem4-4");
sl@0
   676
sl@0
   677
	TInt steps;
sl@0
   678
	for(steps=1;steps<=4;steps++)
sl@0
   679
		{
sl@0
   680
		INFO_PRINTF2(_L("Testing creating linked typeface %d typefaces"),steps);
sl@0
   681
		for (failures = 1; ; failures++)
sl@0
   682
			{
sl@0
   683
			// Try creating the typeface
sl@0
   684
sl@0
   685
			TInt err;
sl@0
   686
			TInt val = KErrNone;
sl@0
   687
sl@0
   688
			SetHeapFail(RFbsSession::EHeapFailTypeHeapMemory, failures);
sl@0
   689
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0
   690
			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //on
sl@0
   691
sl@0
   692
			switch(steps)
sl@0
   693
				{
sl@0
   694
				case 1:
sl@0
   695
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name1, 1));
sl@0
   696
					break;
sl@0
   697
				case 2:
sl@0
   698
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name2, 2));
sl@0
   699
					break;
sl@0
   700
				case 3:
sl@0
   701
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name3, 3));
sl@0
   702
					break;
sl@0
   703
				case 4:
sl@0
   704
					TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name4, 4));
sl@0
   705
					break;
sl@0
   706
				}
sl@0
   707
sl@0
   708
			SetHeapReset(RFbsSession::EHeapFailTypeHeapMemory);
sl@0
   709
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0
   710
			SetHeapCheck(RFbsSession::EHeapFailTypeHeapMemory); //off
sl@0
   711
sl@0
   712
			//If the linked font cannot be created because the typefaces are not present or
sl@0
   713
			//it has already been created then fail the test.
sl@0
   714
			if (err == KErrNotFound || err == KErrAlreadyExists)
sl@0
   715
				{
sl@0
   716
				INFO_PRINTF1(_L("Failure below caused by missing linked font element file or linked font file already being generated."));
sl@0
   717
				TEST(EFalse);
sl@0
   718
				break;
sl@0
   719
				}
sl@0
   720
			
sl@0
   721
			if ((val >= 0) && (err == KErrNone))
sl@0
   722
				break;
sl@0
   723
			}
sl@0
   724
		}
sl@0
   725
sl@0
   726
	INFO_PRINTF1(_L("Testing linked typeface font creation and usage"));
sl@0
   727
	for (steps=1;steps<=4;steps++)
sl@0
   728
		{
sl@0
   729
		INFO_PRINTF2(_L("Testing font usage: linked font with %d fonts"), steps);
sl@0
   730
		for (failures = 1; ; failures++)
sl@0
   731
			{
sl@0
   732
			TInt val = 0;
sl@0
   733
#ifdef _DEBUG
sl@0
   734
			TInt serverBefore=HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   735
			RHeap *heap=(RHeap*)FontAndBitmapServerSharedHeap();
sl@0
   736
			TInt countBefore = 0;
sl@0
   737
			if (heap)
sl@0
   738
				{
sl@0
   739
				__RHEAP_MARK(heap);
sl@0
   740
			 	countBefore = heap->Count();
sl@0
   741
				}
sl@0
   742
			SetHeapFail(RFbsSession::EHeapFailTypeHeapMemory, failures);
sl@0
   743
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //on
sl@0
   744
#endif
sl@0
   745
			switch (steps)
sl@0
   746
				{
sl@0
   747
				case 1:
sl@0
   748
					val = TestLinkedFontsMemory_Part2(name1);
sl@0
   749
					break;
sl@0
   750
				case 2:
sl@0
   751
					val = TestLinkedFontsMemory_Part2(name2);
sl@0
   752
					break;
sl@0
   753
				case 3:
sl@0
   754
					val = TestLinkedFontsMemory_Part2(name3);
sl@0
   755
					break;
sl@0
   756
				case 4:
sl@0
   757
					val = TestLinkedFontsMemory_Part2(name4);
sl@0
   758
					break;
sl@0
   759
				}
sl@0
   760
#ifdef _DEBUG
sl@0
   761
			TInt serverAfter = HeapCount(RFbsSession::EHeapFailTypeServerMemory);
sl@0
   762
			TInt countAfter =0;
sl@0
   763
			TInt badCell = 0;
sl@0
   764
			if (heap)
sl@0
   765
				{
sl@0
   766
				countAfter = heap->Count();
sl@0
   767
				badCell = __RHEAP_MARKEND(heap);
sl@0
   768
				}
sl@0
   769
			SetHeapReset(RFbsSession::EHeapFailTypeHeapMemory);
sl@0
   770
			SetHeapCheck(RFbsSession::EHeapFailTypeServerMemory); //off
sl@0
   771
#endif
sl@0
   772
			if (val == KErrNone)
sl@0
   773
				{
sl@0
   774
				if (steps == 4)
sl@0
   775
					{
sl@0
   776
					TestCompareText();
sl@0
   777
					}
sl@0
   778
				break;
sl@0
   779
				}
sl@0
   780
#ifdef _DEBUG
sl@0
   781
			TEST(badCell == 0);
sl@0
   782
			TEST (countBefore == countAfter);
sl@0
   783
			TEST(serverBefore == serverAfter);
sl@0
   784
#endif
sl@0
   785
			}
sl@0
   786
		}
sl@0
   787
	}
sl@0
   788
sl@0
   789
void CTLinkedFontsMemory::DisplayRamInfo(const TDesC& aTextInfo) const
sl@0
   790
	{
sl@0
   791
	TInt val;
sl@0
   792
	HAL::Get(HALData::EMemoryRAMFree, val);
sl@0
   793
	TBuf <80> buf;
sl@0
   794
	_LIT(KTotalRamText, "RAM free: %d ");
sl@0
   795
	buf.Format(KTotalRamText,val);
sl@0
   796
	buf.Append(aTextInfo);
sl@0
   797
	iStep->INFO_PRINTF1(buf);
sl@0
   798
	}
sl@0
   799
sl@0
   800
/**
sl@0
   801
   @SYMTestCaseID			GRAPHICS-FNTSTORE-LINKEDFONTS-0106
sl@0
   802
sl@0
   803
   @SYMPREQ					PREQ2146
sl@0
   804
sl@0
   805
   @SYMREQ					REQ10924, REQ10925, REQ10926
sl@0
   806
sl@0
   807
   @SYMTestCaseDesc			To test memory usage performance of linked font creation. 
sl@0
   808
   							Test memory usage performance of linked font character access.
sl@0
   809
sl@0
   810
   @SYMTestPriority			High
sl@0
   811
sl@0
   812
   @SYMTestStatus			Implemented
sl@0
   813
sl@0
   814
   @SYMTestActions			(1) Display available ram.  Create a linked typeface with 1-4 linked typeface
sl@0
   815
								and display ram available.
sl@0
   816
							(2) Create four linked fonts from the four linked typefaces.  After each step
sl@0
   817
								display the available RAM.
sl@0
   818
							(3) Use each of the four linked fonts in turn for drawing text, and at each
sl@0
   819
								step display the available RAM.	
sl@0
   820
sl@0
   821
   @SYMTestExpectedResults	(1) (2) (3) RAM usage is displayed.  
sl@0
   822
   							There are no memory leaks.
sl@0
   823
*/
sl@0
   824
void CTLinkedFontsMemory::TestMemoryUsage()
sl@0
   825
	{
sl@0
   826
sl@0
   827
	INFO_PRINTF1(_L("Test Memory Usage 1"));
sl@0
   828
sl@0
   829
	// Initially test for linked typeface creation
sl@0
   830
	// Initially test for linked typeface creation
sl@0
   831
	_LIT(name0, "WithoutLinkedFontTT");
sl@0
   832
	_LIT(name1, "typefaceMemUse-1");
sl@0
   833
	_LIT(name2, "typefaceMemUse-2");
sl@0
   834
	_LIT(name3, "typefaceMemUse-3");
sl@0
   835
	_LIT(name4, "typefaceMemUse-4");
sl@0
   836
sl@0
   837
	TInt steps;
sl@0
   838
	_LIT(KPriorToTesting, "Prior to testing");
sl@0
   839
sl@0
   840
	DisplayRamInfo(KPriorToTesting);
sl@0
   841
sl@0
   842
	TInt err=KErrNone;
sl@0
   843
	TInt val=KErrNone;
sl@0
   844
	//get memory after registering a typeface
sl@0
   845
	for(steps=1;steps<=4;steps++)
sl@0
   846
		{
sl@0
   847
		switch(steps)
sl@0
   848
			{
sl@0
   849
			case 1:
sl@0
   850
				TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name1, 1));
sl@0
   851
				_LIT(KOneTypeface, "Typeface with one typeface created");
sl@0
   852
				DisplayRamInfo(KOneTypeface);
sl@0
   853
				break;
sl@0
   854
			case 2:
sl@0
   855
				TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name2, 2));
sl@0
   856
				_LIT(KTwoTypeface, "Typeface with two typefaces created");
sl@0
   857
				DisplayRamInfo(KTwoTypeface);
sl@0
   858
				break;
sl@0
   859
			case 3:
sl@0
   860
				TRAP(err, val = TestLinkedFontsCreateLinkedTypefacesL(name3, 3));
sl@0
   861
				_LIT(KThreeTypeface, "Typeface with three typefaces created");
sl@0
   862
				DisplayRamInfo(KThreeTypeface);
sl@0
   863
				break;
sl@0
   864
			case 4:
sl@0
   865
				TRAP(err,val = TestLinkedFontsCreateLinkedTypefacesL(name4, 4));
sl@0
   866
				_LIT(KFourTypeface, "Typeface with four typefaces created");
sl@0
   867
				DisplayRamInfo(KFourTypeface);
sl@0
   868
				break;
sl@0
   869
			}
sl@0
   870
		TEST(err == KErrNone);
sl@0
   871
		TEST(val == KErrNone);
sl@0
   872
		}
sl@0
   873
sl@0
   874
	CFont* font[5];
sl@0
   875
	memset (font,0, sizeof(CFont*)*5);
sl@0
   876
sl@0
   877
	_LIT(KGettingFonts, "Now getting 5 fonts, the first one of which is not linked");
sl@0
   878
	DisplayRamInfo(KGettingFonts);
sl@0
   879
	//get memory after retrieving a font
sl@0
   880
	for (steps=0;steps<5;steps++)
sl@0
   881
		{
sl@0
   882
		switch (steps)
sl@0
   883
			{
sl@0
   884
			case 0:
sl@0
   885
				{
sl@0
   886
				TTypeface typeface;
sl@0
   887
				typeface.iName = name0;
sl@0
   888
				TFontSpec fs;
sl@0
   889
				fs.iTypeface = typeface;
sl@0
   890
				fs.iHeight = 20;
sl@0
   891
				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0
   892
				TEST(err==KErrNone);
sl@0
   893
				_LIT(KOneFont, "Non linked font typeface");
sl@0
   894
				DisplayRamInfo(KOneFont);
sl@0
   895
				}
sl@0
   896
			break;
sl@0
   897
sl@0
   898
			case 1:
sl@0
   899
				{
sl@0
   900
				TTypeface typeface;
sl@0
   901
				typeface.iName = name1;
sl@0
   902
				TFontSpec fs;
sl@0
   903
				fs.iTypeface = typeface;
sl@0
   904
				fs.iHeight = 20;
sl@0
   905
				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0
   906
				TEST(err==KErrNone);
sl@0
   907
				_LIT(KOneFont, "LinkedFont one typeface");
sl@0
   908
				DisplayRamInfo(KOneFont);
sl@0
   909
				}
sl@0
   910
			break;
sl@0
   911
			case 2:
sl@0
   912
				{
sl@0
   913
				TTypeface typeface;
sl@0
   914
				typeface.iName = name2;
sl@0
   915
				TFontSpec fs;
sl@0
   916
				fs.iTypeface = typeface;
sl@0
   917
				fs.iHeight = 20;
sl@0
   918
				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0
   919
				TEST(err==KErrNone);
sl@0
   920
				_LIT(KTwoFont, "LinkedFont two typefaces");
sl@0
   921
				DisplayRamInfo(KTwoFont);
sl@0
   922
				}
sl@0
   923
			break;
sl@0
   924
			case 3:
sl@0
   925
				{
sl@0
   926
				TTypeface typeface;
sl@0
   927
				typeface.iName = name3;
sl@0
   928
				TFontSpec fs;
sl@0
   929
				fs.iTypeface = typeface;
sl@0
   930
				fs.iHeight = 20;
sl@0
   931
				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0
   932
				TEST(err==KErrNone);
sl@0
   933
				_LIT(KThreeFont, "LinkedFont three typefaces");
sl@0
   934
				DisplayRamInfo(KThreeFont);
sl@0
   935
				}
sl@0
   936
			break;
sl@0
   937
			case 4:
sl@0
   938
				{
sl@0
   939
				TTypeface typeface;
sl@0
   940
				typeface.iName = name4;
sl@0
   941
				TFontSpec fs;
sl@0
   942
				fs.iTypeface = typeface;
sl@0
   943
				fs.iHeight = 20;
sl@0
   944
				err = iDev->GetNearestFontToDesignHeightInPixels(font[steps], fs);
sl@0
   945
				TEST(err==KErrNone);
sl@0
   946
				_LIT(KFourFont, "LinkedFont four typefaces");
sl@0
   947
				DisplayRamInfo(KFourFont);
sl@0
   948
				}
sl@0
   949
			break;
sl@0
   950
			}
sl@0
   951
		}
sl@0
   952
sl@0
   953
	//get memory after font usage
sl@0
   954
	const TDesC* string[5];
sl@0
   955
	_LIT(KString0,"A");
sl@0
   956
	_LIT(KString1,"B");
sl@0
   957
	_LIT(KString2,"F");
sl@0
   958
	_LIT(KString3,"D");
sl@0
   959
	_LIT(KString4,"V");
sl@0
   960
	string[0]=&KString0();
sl@0
   961
	string[1]=&KString1();
sl@0
   962
	string[2]=&KString2();
sl@0
   963
	string[3]=&KString3();
sl@0
   964
	string[4]=&KString4();
sl@0
   965
sl@0
   966
	_LIT(KWritingCharacter,"Now outputing a single character from each of the five fonts");
sl@0
   967
	DisplayRamInfo(KWritingCharacter);
sl@0
   968
	for (steps=0;steps<5;steps++)
sl@0
   969
		{
sl@0
   970
		// Use the font
sl@0
   971
		iGc->UseFont(font[steps]);
sl@0
   972
		iGc->Clear();
sl@0
   973
		_LIT(KNowUsingFont,"Now using font");
sl@0
   974
		DisplayRamInfo(KNowUsingFont);
sl@0
   975
		iGc->DrawText(*string[steps], TPoint(100, 100));
sl@0
   976
		TBuf <80> buf;
sl@0
   977
		_LIT(KNumberOfSteps,"The font in use has %d linked fonts");
sl@0
   978
		buf.Format(KNumberOfSteps, steps);
sl@0
   979
		DisplayRamInfo(buf);
sl@0
   980
		iGc->DiscardFont();
sl@0
   981
		}
sl@0
   982
sl@0
   983
	//release the fonts
sl@0
   984
	for (steps=0;steps<5;steps++)
sl@0
   985
		{
sl@0
   986
		iDev->ReleaseFont(font[steps]);
sl@0
   987
		}
sl@0
   988
	_LIT(KTestEnd,"At the end of the memory test");
sl@0
   989
	DisplayRamInfo(KTestEnd);
sl@0
   990
	}
sl@0
   991
sl@0
   992
void CTLinkedFontsMemory::RunTestCaseL( TInt aCurTestCase )
sl@0
   993
	{
sl@0
   994
		
sl@0
   995
	((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
sl@0
   996
	switch ( aCurTestCase )
sl@0
   997
		{
sl@0
   998
	case 1:
sl@0
   999
		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0
  1000
		StartServer();
sl@0
  1001
		if (!CheckRasterizerInstalledL())
sl@0
  1002
			{
sl@0
  1003
			TestComplete();
sl@0
  1004
			return;
sl@0
  1005
			}
sl@0
  1006
		break;
sl@0
  1007
	case 2:
sl@0
  1008
		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0102"));
sl@0
  1009
#ifdef _DEBUG
sl@0
  1010
		//memory tests are not valid under DEBUG/ urel, and they will fail
sl@0
  1011
		__UHEAP_MARK;
sl@0
  1012
		// This is for client side memory
sl@0
  1013
		TestLinkedFontsMemory1L();
sl@0
  1014
		__UHEAP_MARKEND;
sl@0
  1015
		__UHEAP_RESET;
sl@0
  1016
#endif
sl@0
  1017
		break;
sl@0
  1018
	case 3:
sl@0
  1019
		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0
  1020
#ifdef _DEBUG
sl@0
  1021
		__UHEAP_MARK;
sl@0
  1022
		//((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0103"));
sl@0
  1023
		// This is for server side memory
sl@0
  1024
		//TestLinkedFontsMemory2(); //- test crashes the server (from the rasterizer)
sl@0
  1025
		//TEST(EFalse);
sl@0
  1026
		__UHEAP_MARKEND;
sl@0
  1027
		__UHEAP_RESET;
sl@0
  1028
#endif
sl@0
  1029
		break;
sl@0
  1030
	case 4:
sl@0
  1031
		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0104"));
sl@0
  1032
#ifdef _DEBUG
sl@0
  1033
		__UHEAP_MARK;
sl@0
  1034
		// This is to check that there are no leaks getting and releasing fonts
sl@0
  1035
		//TestLinkedFontsMemory3();
sl@0
  1036
		__UHEAP_MARKEND;
sl@0
  1037
		__UHEAP_RESET;
sl@0
  1038
#endif
sl@0
  1039
		break;
sl@0
  1040
	case 5:
sl@0
  1041
		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0105"));
sl@0
  1042
#ifdef _DEBUG
sl@0
  1043
		__UHEAP_MARK;
sl@0
  1044
		// This is for heap memory
sl@0
  1045
		//TestLinkedFontsMemory4();
sl@0
  1046
		__UHEAP_MARKEND;
sl@0
  1047
		__UHEAP_RESET;
sl@0
  1048
#endif
sl@0
  1049
		break;
sl@0
  1050
sl@0
  1051
	case 6:
sl@0
  1052
#ifdef _DEBUG
sl@0
  1053
		__UHEAP_MARK;
sl@0
  1054
#endif		
sl@0
  1055
		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(_L("GRAPHICS-FNTSTORE-LINKEDFONTS-0106"));
sl@0
  1056
		TestMemoryUsage();
sl@0
  1057
#ifdef _DEBUG		
sl@0
  1058
		__UHEAP_MARKEND;
sl@0
  1059
		__UHEAP_RESET;
sl@0
  1060
#endif		
sl@0
  1061
		break;	
sl@0
  1062
	case 7:
sl@0
  1063
		((CTLinkedFontsMemoryStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
sl@0
  1064
		((CTLinkedFontsMemoryStep*)iStep)->CloseTMSGraphicsStep();
sl@0
  1065
		TestComplete();
sl@0
  1066
		break;
sl@0
  1067
		}
sl@0
  1068
	((CTLinkedFontsMemoryStep*)iStep)->RecordTestResultL();
sl@0
  1069
	}
sl@0
  1070
sl@0
  1071
// --------------
sl@0
  1072
__CONSTRUCT_STEP__(LinkedFontsMemory)