graphicsdeviceinterface/directgdi/test/tglyphimagecache.cpp
changeset 0 5d03bc08d59c
equal deleted inserted replaced
-1:000000000000 0:5d03bc08d59c
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // This test is designed to run in environment with monotype font support.
       
    15 // To set up environment launch ityperast.cmd  from epoc32\winscw\, and 
       
    16 // then follow instruction on the screen.
       
    17 // 
       
    18 //
       
    19 
       
    20 #include "tglyphimagecache.h"
       
    21 #include <graphics/directgdiengine.h>
       
    22 #include <e32base.h>
       
    23 #include <VG/openvg.h>
       
    24 
       
    25 // The size of the target in pixels to use for these tests
       
    26 const TSize KGlyphCacheWindowSize(400, 400);
       
    27 
       
    28 enum TFontParam
       
    29 	{
       
    30 	ENormal, 
       
    31 	EUnderline = 0x1, 
       
    32 	EStrikeThrough = 0x2,
       
    33 	EBold = 0x4,
       
    34 	EUnderlineBold = 0x5, 
       
    35 	EItalic = 0x8,
       
    36 	EItalicStrikeThrough = 0xa,
       
    37 	};
       
    38 
       
    39 class TFontType
       
    40 	{
       
    41 public:
       
    42 	TInt iFontSize;
       
    43 	TFontParam iFontParam;
       
    44 	}; 
       
    45 
       
    46 LOCAL_C void CleanCache(TAny* aPtr)
       
    47 	{
       
    48 	MFontGlyphImageStorage* glyphImageStorage = reinterpret_cast<MFontGlyphImageStorage*> (aPtr);
       
    49 	glyphImageStorage->CleanGlyphImageCache();
       
    50 	}
       
    51 
       
    52 CTGlyphImageCache::CTGlyphImageCache()
       
    53 	{
       
    54 	SetTestStepName(KTGlyphImageCacheStep);
       
    55 	}
       
    56 
       
    57 CTGlyphImageCache::~CTGlyphImageCache()
       
    58 	{
       
    59 	}
       
    60 
       
    61 /**
       
    62 @SYMTestCaseID
       
    63 	GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0001
       
    64 
       
    65 @SYMPREQ 
       
    66 	PREQ39
       
    67 
       
    68 @SYMREQ
       
    69 	REQ9195
       
    70 	REQ9201 
       
    71 	REQ9202 
       
    72 	REQ9222 
       
    73 	REQ9223 
       
    74 	REQ9236 
       
    75 	REQ9237
       
    76 
       
    77 @SYMTestCaseDesc
       
    78 	Test requests Glyph Image elements from storage according their Glyph Key.
       
    79 
       
    80 @SYMTestStatus
       
    81 	Implemented
       
    82 
       
    83 @SYMTestPriority
       
    84 	High
       
    85 
       
    86 @SYMTestActions
       
    87 	Create Font Image Storage. In the cycle request aGlyph Image entry for a particular Glyph 
       
    88 	code and a font ID. 
       
    89 	Delete Glyph Storage.
       
    90 	
       
    91 @SYMTestExpectedResults
       
    92 	GlyphImage function must succeed; foreground, shadow and outlined images (if applicable) must be created
       
    93 */
       
    94 void CTGlyphImageCache::TestRetrieveEntryL(MFontGlyphImageStorage* aGlyphStorage, TGlyphBitmapType aGlyphType)
       
    95 	{
       
    96 	if(!aGlyphStorage)
       
    97 		return;	
       
    98 	_LIT(KTestName, "GlyphCache_RetrieveEntry"); 
       
    99 	if(!iRunningOomTests)
       
   100 		{
       
   101 		INFO_PRINTF1(KTestName);
       
   102 		}
       
   103 
       
   104 	TSize size(20, 30);
       
   105 	TInt bufferLength = size.iWidth * size.iHeight;
       
   106 	TUint8* buffer = (TUint8*)User::AllocL(bufferLength);
       
   107 	CleanupStack::PushL(buffer);
       
   108 	if(aGlyphType == EMonochromeGlyphBitmap)
       
   109 		{//to make decoding mechanizm work properly we need to fill the buffer
       
   110 		Mem::Fill(buffer, bufferLength, 0x1);
       
   111 		}
       
   112 	
       
   113 	TInt fontListId[] = 
       
   114 		{
       
   115 		1, 5, 3, 5
       
   116 		};
       
   117 	TInt numFont = sizeof(fontListId) / sizeof(fontListId[0]);
       
   118 	TUint charCodeList[] =
       
   119 		{
       
   120 		1, 2, 3, 2, 3,
       
   121 		};
       
   122 	TInt numGlyphCode = sizeof(charCodeList) / sizeof(charCodeList[0]);
       
   123 
       
   124 	for(TInt jj = 0; jj < numFont; jj++)
       
   125 		{
       
   126 		TInt fontId = fontListId[jj];
       
   127 		for(TInt ii = 0; ii < numGlyphCode; ii++)
       
   128 			{
       
   129 			TChar glyphCode = TChar(charCodeList[ii]);
       
   130 			VGImage foregroundImg = VG_INVALID_HANDLE;
       
   131 			VGImage shadowImg = VG_INVALID_HANDLE;
       
   132 			VGImage outlineImg = VG_INVALID_HANDLE;
       
   133 			TBool res = aGlyphStorage->GlyphImage(fontId, glyphCode, aGlyphType, buffer, size, &foregroundImg, &shadowImg, &outlineImg);
       
   134 			TESTNOERROR(res);
       
   135 			if(res != KErrNone)
       
   136 				{
       
   137 				User::Leave(res); 
       
   138 				}
       
   139 			else
       
   140 				{
       
   141 				TEST(foregroundImg);
       
   142 				if(aGlyphType == EFourColourBlendGlyphBitmap)
       
   143 					{
       
   144 					TEST(shadowImg);
       
   145 					TEST(outlineImg);
       
   146 					}
       
   147 				}	
       
   148 			}
       
   149 		}
       
   150 	CleanupStack::PopAndDestroy(buffer);
       
   151 	}
       
   152 
       
   153 /**
       
   154 @SYMTestCaseID
       
   155 	GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0002
       
   156 
       
   157 @SYMPREQ 
       
   158 	PREQ39
       
   159 
       
   160 @SYMREQ
       
   161 	REQ9195
       
   162 	REQ9201 
       
   163 	REQ9202 
       
   164 	REQ9222 
       
   165 	REQ9223 
       
   166 	REQ9236 
       
   167 	REQ9237
       
   168 
       
   169 @SYMTestCaseDesc
       
   170 	Drawing monochrome, anti-aliased and four colour fonts with different styles  
       
   171 
       
   172 @SYMTestStatus
       
   173 	Implemented
       
   174 
       
   175 @SYMTestPriority
       
   176 	High
       
   177 
       
   178 @SYMTestActions
       
   179 	Text is output with different effects (strikethrough, underline) and orientation 
       
   180 	(horizontal, vertical up, vertical down) and at different sizes and positions.
       
   181 	Clip region is also specified.
       
   182 
       
   183 @SYMTestExpectedResults
       
   184 	Test and reference images must match
       
   185 */
       
   186 void CTGlyphImageCache::TestDrawGlyphL(MFontGlyphImageStorage* aGlyphStorage, TGlyphBitmapType aGlyphBitmapType, DrawTextDirection aDirection, DrawTextAdjustment aDrawAdjustment, TBool aClipText)
       
   187 	{	
       
   188 	_LIT(KTestNameTemplate, "DrawGlyph%S_Dir%d_Clip%d_Adjust%d"); 
       
   189 	TBuf<128> testName;
       
   190 	_LIT(KTextOutput, "Hello world! Hello world! Hello world! Hello world! Hello world! Hello world!");
       
   191 	
       
   192 	switch(aGlyphBitmapType)
       
   193 		{
       
   194 	case EMonochromeGlyphBitmap:
       
   195 		_LIT(KMonochromeName, "Monochrome");
       
   196 		testName.Format(KTestNameTemplate, &KMonochromeName, aDirection, aClipText, aDrawAdjustment);
       
   197 		break;
       
   198 	case EAntiAliasedGlyphBitmap:
       
   199 		_LIT(KAntiAliasedName, "AntiAliased");
       
   200 		testName.Format(KTestNameTemplate, &KAntiAliasedName, aDirection, aClipText, aDrawAdjustment);
       
   201 		break;
       
   202 	case EFourColourBlendGlyphBitmap:
       
   203 		_LIT(KFourColourName, "FourColour");
       
   204 		testName.Format(KTestNameTemplate, &KFourColourName, aDirection, aClipText, aDrawAdjustment);
       
   205 		break;
       
   206 	default: 
       
   207 		User::Leave(KErrNotSupported);
       
   208 		break;	
       
   209 		}
       
   210 	
       
   211 	if(!iRunningOomTests)
       
   212 		{
       
   213 		INFO_PRINTF1(testName);
       
   214 		}
       
   215 	
       
   216 	ResetGc();
       
   217 	_LIT(KTestFontTypefaceName,"DejaVu Sans Condensed");
       
   218 	const TFontType fontType[] =
       
   219 		{
       
   220 		18, EStrikeThrough, 48, EUnderline, 16, EItalic, 78, EItalicStrikeThrough,
       
   221 
       
   222 		18, EStrikeThrough, 48, EUnderlineBold, 16, ENormal, 78, EStrikeThrough, 78, EBold, 
       
   223 		};
       
   224 	
       
   225 	TPoint pt(5, 5);
       
   226 	TInt *coord = & (pt.iY);
       
   227 
       
   228 	TSize size = iGdiTarget->SizeInPixels();
       
   229 	TRect rect = size;
       
   230 	rect.Shrink(20, 5);
       
   231 	RRegion region(rect);
       
   232 	TRect rect1;
       
   233 	if(aDirection == EDrawTextHorizontal)
       
   234 		{
       
   235 		rect1 = TRect(size.iWidth / 2 - 40, 40, size.iWidth / 2 + 40, size.iHeight - 40);
       
   236 		}
       
   237 	else
       
   238 		{
       
   239 		rect1 = TRect(20, size.iHeight / 2 - 40, size.iWidth - 20, size.iHeight / 2 + 40);
       
   240 		}	
       
   241 	region.SubRect(rect1);
       
   242 		
       
   243 	if(aDirection == EDrawTextVerticalUp || aDirection == EDrawTextVerticalDown)
       
   244 		{
       
   245 		if(aDirection == EDrawTextVerticalUp)
       
   246 			{
       
   247 			pt.iY = size.iHeight - 5;
       
   248 			}
       
   249 		coord = &(pt.iX);
       
   250 		}
       
   251 	
       
   252 	TInt arraySize = sizeof(fontType) / sizeof(fontType[0]);
       
   253 	
       
   254 	for(TInt ii = 0; ii < arraySize; ii++)
       
   255 		{
       
   256 		CFont *font = NULL;
       
   257 		TFontSpec fspec(KTestFontTypefaceName, fontType[ii].iFontSize);
       
   258 		fspec.iFontStyle.SetBitmapType(aGlyphBitmapType);
       
   259 		
       
   260 		iGc->Reset();
       
   261 
       
   262 		if(aClipText)
       
   263 			{
       
   264 			iGc->SetClippingRegion(region);
       
   265 			}
       
   266 
       
   267 		if(aGlyphBitmapType == EFourColourBlendGlyphBitmap)
       
   268 			{
       
   269 			fspec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
       
   270 			fspec.iFontStyle.SetEffects(FontEffect::EOutline, ETrue);
       
   271 			fspec.iFontStyle.SetEffects(FontEffect::EDropShadow, ETrue);
       
   272 			TRgb shadowColor = TRgb(0, 0, 255);
       
   273 			iGc->SetTextShadowColor(shadowColor);
       
   274 			TEST(shadowColor == iGc->TextShadowColor());
       
   275 			iGc->SetBrushColor(TRgb(255, 0, 0));
       
   276 			TEST(TRgb(255, 0, 0) == iGc->BrushColor());
       
   277 			}
       
   278 		else
       
   279 			{
       
   280 			iGc->SetBrushStyle(DirectGdi::ENullBrush);
       
   281 			iGc->SetPenStyle(DirectGdi::ESolidPen);
       
   282 			}	
       
   283 		iGc->SetPenColor(TRgb(0, 255, 0));
       
   284 		if(fontType[ii].iFontParam & EItalic)
       
   285 			{
       
   286 			fspec.iFontStyle.SetPosture(EPostureItalic);
       
   287 			}
       
   288 		if(fontType[ii].iFontParam & EBold)
       
   289 			{
       
   290 			fspec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
       
   291 			}
       
   292 			
       
   293 		User::LeaveIfError(iFontStore->GetNearestFontToDesignHeightInPixels((CFont*&) font, fspec));
       
   294 		if(iUseDirectGdi)
       
   295 			{
       
   296 			if(ii == 2)
       
   297 				{
       
   298 				iGc->SetFontNoDuplicate(font);
       
   299 				(reinterpret_cast <CTestDirectGdiContext*> (iGc))->NoJustifyAutoUpdate();
       
   300 				}
       
   301 			else
       
   302 				{
       
   303 				iGc->SetFont(font);
       
   304 				iGc->SetFontNoDuplicate(font);//shoudn't have any impact
       
   305 				(reinterpret_cast <CTestDirectGdiContext*> (iGc))->SetJustifyAutoUpdate();
       
   306 				}	
       
   307 			}
       
   308 		else
       
   309 			{
       
   310 			iGc->SetFont(font);
       
   311 			iGc->SetFontNoDuplicate(font);//shoudn't have any impact
       
   312 			}	
       
   313 		TEST(iGc->HasFont());
       
   314 		
       
   315 		TFontSpec fontSpec = font->FontSpecInTwips();
       
   316 		TGlyphBitmapType glyphBitmapType = fontSpec.iFontStyle.BitmapType();
       
   317 
       
   318 		TEST(glyphBitmapType == aGlyphBitmapType);	
       
   319 		if(fontType[ii].iFontParam & EUnderline)
       
   320 			{
       
   321 			iGc->SetUnderlineStyle(DirectGdi::EUnderlineOn);
       
   322 			}
       
   323 		else if(fontType[ii].iFontParam & EStrikeThrough)
       
   324 			{
       
   325 			iGc->SetStrikethroughStyle(DirectGdi::EStrikethroughOn);
       
   326 			}
       
   327 		
       
   328 		if(EDrawTextVerticalDown != aDirection)
       
   329 			{
       
   330 			*coord += font->HeightInPixels() + 5;
       
   331 			}
       
   332 		
       
   333 		if(aGlyphStorage && (ii == 0) && (arraySize > 1))
       
   334 			{
       
   335 			aGlyphStorage->CleanGlyphImageCache();
       
   336 			aGlyphStorage->EnforceOOMFailure(ETrue);
       
   337 			}
       
   338 		DrawText(KTextOutput, pt, aDirection, aDrawAdjustment, ii == 1);
       
   339 		if(aGlyphStorage)
       
   340 			{
       
   341 			aGlyphStorage->EnforceOOMFailure(EFalse);
       
   342 			}
       
   343 		
       
   344 		if(EDrawTextVerticalDown == aDirection)
       
   345 			{
       
   346 			*coord += font->HeightInPixels() + 5;
       
   347 			}
       
   348 
       
   349 		if(fontType[ii].iFontParam == ENormal)
       
   350 			{
       
   351 			iGc->SetUnderlineStyle(DirectGdi::EUnderlineOff);
       
   352 			iGc->SetStrikethroughStyle(DirectGdi::EStrikethroughOff);
       
   353 			}
       
   354 		iGc->ResetFont();
       
   355 		iFontStore->ReleaseFont(font);
       
   356 	
       
   357 		TEST(!iGc->HasFont());
       
   358 		}
       
   359 	region.Close();
       
   360 	if(aClipText)
       
   361 		{
       
   362 		iGc->ResetClippingRegion();
       
   363 		}
       
   364 
       
   365 	// Write the output to file.
       
   366 	//
       
   367 	TESTNOERROR(WriteTargetOutput(iTestParams, testName));
       
   368 	}
       
   369 
       
   370 /**
       
   371 @SYMTestCaseID
       
   372 	GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0003
       
   373 
       
   374 @SYMPREQ 
       
   375 	PREQ39
       
   376 
       
   377 @SYMREQ
       
   378 	REQ9195
       
   379 	REQ9201 
       
   380 	REQ9202 
       
   381 	REQ9222 
       
   382 	REQ9223 
       
   383 	REQ9236 
       
   384 	REQ9237
       
   385 
       
   386 @SYMTestCaseDesc
       
   387 	Filling up the glyph image cache
       
   388 
       
   389 @SYMTestStatus
       
   390 	Implemented
       
   391 
       
   392 @SYMTestPriority
       
   393 	High
       
   394 
       
   395 @SYMTestActions
       
   396 	1.	Fill glyph image storage with the same font but different glyphs until it exceeds its limit and resets the cache.
       
   397 	Repeat this operation for other glyph types
       
   398 
       
   399 	2.	Fill glyph image storage with different font and different glyph codes
       
   400 
       
   401 @SYMTestExpectedResults
       
   402 	Check that Glyph cache storage increments cache size correctly and deletes the least 
       
   403 	usable tree.
       
   404 */
       
   405 void CTGlyphImageCache::FillUpCacheL(MFontGlyphImageStorage* aGlyphStorage)
       
   406 	{
       
   407 	if(!aGlyphStorage)
       
   408 		return;
       
   409 	
       
   410 	aGlyphStorage->CleanGlyphImageCache();
       
   411 	TBuf<128> testName;
       
   412 	_LIT(KTestName, "GlyphCache_FillUpCache"); 
       
   413 	if(!iRunningOomTests)
       
   414 		{
       
   415 		INFO_PRINTF1(KTestName);
       
   416 		}
       
   417 	
       
   418 	const TSize size(12, 16);
       
   419 	TUint8* buffer = (TUint8*)User::AllocL(size.iWidth * size.iHeight);
       
   420 	CleanupStack::PushL(buffer);
       
   421 	TInt fontId = 10;
       
   422 	TGlyphBitmapType glyphTypeList[] = 
       
   423 		{
       
   424 		EMonochromeGlyphBitmap,
       
   425 		EAntiAliasedGlyphBitmap,
       
   426 		EFourColourBlendGlyphBitmap,
       
   427 		};
       
   428 	const TInt numGlyphType = sizeof(glyphTypeList) / sizeof(glyphTypeList[0]);
       
   429 	TESTL(aGlyphStorage->GlyphCacheSize() == 0);
       
   430 	
       
   431 	TInt glyphSizeInByte = 0;
       
   432 	TInt expectedSize = 0;
       
   433 	TUint32 glyphCode = 1;
       
   434 	
       
   435 	VGImage foregroundImg = VG_INVALID_HANDLE;
       
   436 	VGImage shadowImg = VG_INVALID_HANDLE;
       
   437 	VGImage outlineImg = VG_INVALID_HANDLE;
       
   438 	for(TInt ii = 0; ii < numGlyphType; ii++)
       
   439 		{
       
   440 		TGlyphBitmapType glyphType = glyphTypeList[ii];
       
   441 		//calculate the actual size of the glyph
       
   442 		glyphSizeInByte = GlyphImageSizeInByte(glyphType, size);
       
   443 
       
   444 		TUint maxGlyphSize = aGlyphStorage->MaxGlyphCacheSize() + glyphSizeInByte;
       
   445 		do 
       
   446 			{
       
   447 			TEST(expectedSize == aGlyphStorage->GlyphCacheSize());
       
   448 			TBool res = aGlyphStorage->GlyphImage(fontId, TChar(glyphCode), (TGlyphBitmapType)glyphType, buffer, size, &foregroundImg, &shadowImg, &outlineImg);
       
   449 			TESTNOERRORL(res);
       
   450 			glyphCode++;
       
   451 			expectedSize+= glyphSizeInByte; 
       
   452 			foregroundImg = VG_INVALID_HANDLE;
       
   453 			shadowImg = VG_INVALID_HANDLE;
       
   454 			outlineImg = VG_INVALID_HANDLE;
       
   455 			}while(expectedSize <= maxGlyphSize);
       
   456 		glyphCode = 1;	
       
   457 		expectedSize = 0;
       
   458 		TEST(glyphSizeInByte == aGlyphStorage->GlyphCacheSize());
       
   459 		aGlyphStorage->CleanGlyphImageCache();
       
   460 		}
       
   461 		
       
   462 	//now try to filling cache with different fonts and check that last usable font wont be removed
       
   463 	TUint maxGlyphSize = aGlyphStorage->MaxGlyphCacheSize();
       
   464 	glyphSizeInByte = GlyphImageSizeInByte(EMonochromeGlyphBitmap, size);
       
   465 	do 
       
   466 		{
       
   467 		TEST(expectedSize == aGlyphStorage->GlyphCacheSize());
       
   468 		TBool res = aGlyphStorage->GlyphImage(fontId, TChar(glyphCode), EMonochromeGlyphBitmap, buffer, size, &foregroundImg, &shadowImg, &outlineImg);
       
   469 		TESTNOERRORL(res);
       
   470 		glyphCode++;
       
   471 		expectedSize+= glyphSizeInByte; 
       
   472 		foregroundImg = VG_INVALID_HANDLE;
       
   473 		shadowImg = VG_INVALID_HANDLE;
       
   474 		outlineImg = VG_INVALID_HANDLE;
       
   475 		}while(expectedSize <= maxGlyphSize);
       
   476 
       
   477 	fontId += 10;
       
   478 	glyphCode = 1;
       
   479 
       
   480 	TBool res = aGlyphStorage->GlyphImage(fontId, TChar(glyphCode), EMonochromeGlyphBitmap, buffer, size, &foregroundImg, &shadowImg, &outlineImg);
       
   481 	TEST(glyphSizeInByte == aGlyphStorage->GlyphCacheSize());
       
   482 	TESTNOERROR(res);
       
   483 	
       
   484 	RArray<TUint32> listFontId;
       
   485 	aGlyphStorage->FontIdInOrder(listFontId);
       
   486 	TESTL(listFontId.Count() == 1);
       
   487 	TEST(listFontId[0] == fontId);
       
   488 	listFontId.Reset();
       
   489 	
       
   490 	CleanupStack::PopAndDestroy(buffer);
       
   491 	}
       
   492 
       
   493 /**
       
   494 @SYMTestCaseID
       
   495 	GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0004
       
   496 
       
   497 @SYMPREQ 
       
   498 	PREQ39
       
   499 
       
   500 @SYMREQ
       
   501 	REQ9195
       
   502 	REQ9201 
       
   503 	REQ9202 
       
   504 	REQ9222 
       
   505 	REQ9223 
       
   506 	REQ9236 
       
   507 	REQ9237
       
   508 
       
   509 @SYMTestCaseDesc
       
   510 	Tests filling the glyph image cache with different glyph images
       
   511 
       
   512 @SYMTestStatus
       
   513 	Implemented
       
   514 
       
   515 @SYMTestPriority
       
   516 	High
       
   517 
       
   518 @SYMTestActions
       
   519 	Specify glyphs which correspond to different fonts, glyph codes.
       
   520 	Request related VGImages.
       
   521 	Test the cache size is correct after each operation.
       
   522 	Get the driver's MDirectGdiDriverCacheSize interface.
       
   523 	Attempt to set the maximum size of the glyph cache to a size smaller than
       
   524 	the existing cache size.
       
   525 	Attempt to set the maximum size of the glyph cache to a size the same as
       
   526 	the existing cache size.
       
   527 	
       
   528 
       
   529 @SYMTestExpectedResults
       
   530 	Obtained glyph code and cache size must be correct each time.
       
   531 	Setting the maximum glyph cache size to a smaller size than the existing cache
       
   532 	size should fail with error KErrArgument.
       
   533 	Setting the maximum glyph cache size to a size the same as the existing cache
       
   534 	size should pass.
       
   535 */
       
   536 void CTGlyphImageCache::FillCacheL(MFontGlyphImageStorage* aGlyphStorage)
       
   537 	{
       
   538 	ASSERT(aGlyphStorage);		
       
   539 	
       
   540 	aGlyphStorage->CleanGlyphImageCache();
       
   541 	TBuf<128> testName;
       
   542 	_LIT(KTestName, "GlyphCache_FillCache"); 
       
   543 	if(!iRunningOomTests)
       
   544 		{
       
   545 		INFO_PRINTF1(KTestName);
       
   546 		}
       
   547 	
       
   548 	const TSize smallFontSize = TSize(12, 16);
       
   549 	const TSize smallFont1Size = TSize(10, 14);
       
   550 	const TSize bigFontSize = TSize(18, 24);
       
   551 	const TSize bigFont1Size = TSize(20, 26);
       
   552 	const TInt smallFontId = 10;
       
   553 	const TInt bigFontId = 20;
       
   554 	const TInt smallFont1Id = 30;
       
   555 	const TInt bigFont1Id = 40;
       
   556 	VGImage foregroundImg = VG_INVALID_HANDLE;
       
   557 	VGImage shadowImg = VG_INVALID_HANDLE;
       
   558 	VGImage outlineImg = VG_INVALID_HANDLE;
       
   559 	
       
   560 	TUint8* buffer = (TUint8*)User::AllocL(bigFontSize.iWidth * bigFontSize.iHeight);
       
   561 	CleanupStack::PushL(buffer);
       
   562 	TESTL(aGlyphStorage->GlyphCacheSize() == 0);
       
   563 	
       
   564 	TInt expectedCacheSize = 0;
       
   565 	TChar glyphCode = TChar(1);
       
   566 	TGlyphBitmapType glyphType = EMonochromeGlyphBitmap;
       
   567 	TBool res = aGlyphStorage->GlyphImage(smallFontId, glyphCode, glyphType, buffer, smallFontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   568 	TESTNOERRORL(res);
       
   569 	expectedCacheSize = GlyphImageSizeInByte(glyphType, smallFontSize);
       
   570 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize());
       
   571 
       
   572 	//try to retrieve the same glyph
       
   573 	res = aGlyphStorage->GlyphImage(smallFontId, glyphCode, glyphType, buffer, smallFontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   574 	TESTNOERRORL(res);
       
   575 	//the size should be the same
       
   576 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize()); 
       
   577 		
       
   578 	//now retrieving the same glyphCode but for the different font
       
   579 	res = aGlyphStorage->GlyphImage(bigFontId, glyphCode, glyphType, buffer, bigFontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   580 	TESTNOERRORL(res);
       
   581 	expectedCacheSize += GlyphImageSizeInByte(glyphType, bigFontSize);
       
   582 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize()); 
       
   583 
       
   584 	//last font but different glyphCode
       
   585 	glyphCode = TChar(2);
       
   586 	res = aGlyphStorage->GlyphImage(bigFontId, glyphCode, glyphType, buffer, bigFontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   587 	TESTNOERRORL(res);
       
   588 	expectedCacheSize += GlyphImageSizeInByte(glyphType, bigFontSize);
       
   589 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize()); 
       
   590 
       
   591 	//small font and last glyphCode
       
   592 	res = aGlyphStorage->GlyphImage(smallFontId, glyphCode, glyphType, buffer, smallFontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   593 	TESTNOERRORL(res);
       
   594 	expectedCacheSize += GlyphImageSizeInByte(glyphType, smallFontSize);
       
   595 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize()); 
       
   596 
       
   597 	//now change the type
       
   598 	glyphType = EAntiAliasedGlyphBitmap;
       
   599 	res = aGlyphStorage->GlyphImage(smallFont1Id, glyphCode, glyphType, buffer, smallFont1Size, &foregroundImg, &shadowImg, &outlineImg);
       
   600 	TESTNOERRORL(res);
       
   601 	expectedCacheSize += GlyphImageSizeInByte(glyphType, smallFont1Size);
       
   602 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize()); 
       
   603 	//try again
       
   604 	res = aGlyphStorage->GlyphImage(smallFont1Id, glyphCode, glyphType, buffer, smallFont1Size, &foregroundImg, &shadowImg, &outlineImg);
       
   605 	TESTNOERRORL(res);
       
   606 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize()); 
       
   607 
       
   608 	//now change the type again
       
   609 	glyphType = EFourColourBlendGlyphBitmap;
       
   610 	res = aGlyphStorage->GlyphImage(bigFont1Id, glyphCode, glyphType, buffer, bigFont1Size, &foregroundImg, &shadowImg, &outlineImg);
       
   611 	TESTNOERRORL(res);
       
   612 	expectedCacheSize += GlyphImageSizeInByte(glyphType, bigFont1Size);
       
   613 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize()); 
       
   614 
       
   615 	//using initial value.
       
   616 	glyphType = EMonochromeGlyphBitmap;
       
   617 	glyphCode = TChar(1);
       
   618 	res = aGlyphStorage->GlyphImage(smallFontId, glyphCode, glyphType, buffer, smallFontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   619 	TESTNOERRORL(res);
       
   620 	TEST(expectedCacheSize == aGlyphStorage->GlyphCacheSize());
       
   621 	
       
   622 	//get the driver's MDirectGdiDriverCacheSize extension interface and attempt
       
   623 	//to set the maximum cache size to be smaller than the existing cache size
       
   624 	CDirectGdiDriver* driver = CDirectGdiDriver::Static();
       
   625 	TESTL(driver != NULL);
       
   626 	MDirectGdiDriverCacheSize* driverCacheSize = NULL;
       
   627 	res = driver->GetInterface(TUid::Uid(KDirectGdiDriverCacheSizeUid), (TAny*&)driverCacheSize);
       
   628 	TESTNOERRORL(res);
       
   629 	//save the original cache size
       
   630 	TInt originalCacheSize = driverCacheSize->MaxGlyphCacheSize();
       
   631 	//setting the cache size to a size smaller than the existing cache should fail
       
   632 	res = driverCacheSize->SetMaxGlyphCacheSize(aGlyphStorage->GlyphCacheSize()-1);
       
   633 	TEST(res == KErrArgument);	
       
   634 	//setting the cache size to the same size as the existing cache should pass
       
   635 	res = driverCacheSize->SetMaxGlyphCacheSize(aGlyphStorage->GlyphCacheSize());
       
   636 	TESTNOERROR(res);
       
   637 	TEST(aGlyphStorage->GlyphCacheSize() == driverCacheSize->MaxGlyphCacheSize());
       
   638 	//reset the original driver cache size
       
   639 	res = driverCacheSize->SetMaxGlyphCacheSize(originalCacheSize);
       
   640 	TESTNOERROR(res);
       
   641 	
       
   642 	CleanupStack::PopAndDestroy(buffer);
       
   643 	}
       
   644 
       
   645 /**
       
   646 @SYMTestCaseID
       
   647 	GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0005
       
   648 
       
   649 @SYMPREQ 
       
   650 	PREQ39
       
   651 
       
   652 @SYMREQ
       
   653 	REQ9195
       
   654 	REQ9201 
       
   655 	REQ9202 
       
   656 	REQ9222 
       
   657 	REQ9223 
       
   658 	REQ9236 
       
   659 	REQ9237
       
   660 
       
   661 @SYMTestCaseDesc
       
   662 	Tests the ordering font IDs in the glyph image cache.
       
   663 
       
   664 @SYMTestStatus
       
   665 	Implemented
       
   666 
       
   667 @SYMTestPriority
       
   668 	High
       
   669 
       
   670 @SYMTestActions
       
   671 	Request glyph images for different fonts.
       
   672 
       
   673 @SYMTestExpectedResults
       
   674 	List of glyph cache trees must be arranged in order from most used to least used.
       
   675 */
       
   676 void CTGlyphImageCache::FontListIdOrderL(MFontGlyphImageStorage* aGlyphStorage)
       
   677 	{
       
   678 	if(!aGlyphStorage)
       
   679 		return;
       
   680 	
       
   681 	aGlyphStorage->CleanGlyphImageCache();
       
   682 	TBuf<128> testName;
       
   683 	_LIT(KTestName, "GlyphCache_FontListIdOrder"); 
       
   684 	if(!iRunningOomTests)
       
   685 		{
       
   686 		INFO_PRINTF1(KTestName);
       
   687 		}
       
   688 	
       
   689 	const TSize fontSize = TSize(12, 16);
       
   690 	TUint8* buffer = (TUint8*)User::AllocL(fontSize.iWidth * fontSize.iHeight);
       
   691 	CleanupStack::PushL(buffer);
       
   692 
       
   693 	TChar glyphCode = TChar(10);
       
   694 	TInt fontId = 10;
       
   695 	VGImage foregroundImg = VG_INVALID_HANDLE;
       
   696 	VGImage shadowImg = VG_INVALID_HANDLE;
       
   697 	VGImage outlineImg = VG_INVALID_HANDLE;
       
   698 	
       
   699 	TGlyphBitmapType glyphType = EMonochromeGlyphBitmap;
       
   700 	TInt res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   701 	TESTNOERRORL(res);
       
   702 
       
   703 	fontId = 20;
       
   704 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   705 	TESTNOERRORL(res);
       
   706 
       
   707 	fontId = 30;
       
   708 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   709 	TESTNOERRORL(res);
       
   710 
       
   711 	RArray<TUint32> fontListId;
       
   712 	res = aGlyphStorage->FontIdInOrder(fontListId);
       
   713 	if(res != KErrNone)
       
   714 		{
       
   715 		fontListId.Reset();
       
   716 		User::Leave(res);
       
   717 		}
       
   718 	
       
   719 	TESTL(fontListId.Count() == 3);
       
   720 	TEST(fontListId[0] == 30);
       
   721 	TEST(fontListId[1] == 20);
       
   722 	TEST(fontListId[2] == 10);
       
   723 	fontListId.Reset();
       
   724 
       
   725 	//call entries again to reorder font id list
       
   726 	fontId = 30;
       
   727 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   728 	TESTNOERRORL(res);
       
   729 	
       
   730 	fontId = 20;
       
   731 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   732 	TESTNOERRORL(res);
       
   733 
       
   734 	fontId = 40;
       
   735 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   736 	TESTNOERRORL(res);
       
   737 
       
   738 	fontId = 10;
       
   739 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   740 	TESTNOERRORL(res);
       
   741 
       
   742 	fontId = 50;
       
   743 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   744 	TESTNOERRORL(res);
       
   745 
       
   746 	res = aGlyphStorage->FontIdInOrder(fontListId);
       
   747 	if(res != KErrNone)
       
   748 		{
       
   749 		fontListId.Reset();
       
   750 		User::Leave(res);
       
   751 		}
       
   752 
       
   753 	TESTL(fontListId.Count() == 5);
       
   754 	TEST(fontListId[0] == 50);
       
   755 	TEST(fontListId[1] == 10);
       
   756 	TEST(fontListId[2] == 40);
       
   757 	TEST(fontListId[3] == 20);
       
   758 	TEST(fontListId[4] == 30);
       
   759 	fontListId.Reset();
       
   760 
       
   761 	CleanupStack::PopAndDestroy(buffer);
       
   762 	}
       
   763 
       
   764 /**
       
   765 @SYMTestCaseID
       
   766 	GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0006
       
   767 
       
   768 @SYMPREQ 
       
   769 	PREQ39
       
   770 
       
   771 @SYMREQ
       
   772 	REQ9195
       
   773 	REQ9222 
       
   774 	REQ9223 
       
   775 	REQ9236 
       
   776 	REQ9237
       
   777 
       
   778 @SYMTestCaseDesc
       
   779 	Test the operation of the glyph image cache when sent wrong parameters.
       
   780 
       
   781 @SYMTestStatus
       
   782 	Implemented
       
   783 
       
   784 @SYMTestPriority
       
   785 	High
       
   786 
       
   787 @SYMTestActions
       
   788 	Test requesting of glyph images with invalid paramaters - test an invalid glyph type
       
   789 	and test requesting a glyph image with zero height and one with zero width.
       
   790 
       
   791 @SYMTestExpectedResults
       
   792 	The function must identify wrong arguments and return the expected error.
       
   793 */
       
   794 void CTGlyphImageCache::WrongParameterL(MFontGlyphImageStorage* aGlyphStorage)
       
   795 	{
       
   796 	_LIT(KTestName, "GlyphCache_WrongParameters"); 
       
   797 	if(!iRunningOomTests)
       
   798 		{
       
   799 		INFO_PRINTF1(KTestName);
       
   800 		}
       
   801 	
       
   802 	aGlyphStorage->CleanGlyphImageCache();
       
   803 
       
   804 	TChar glyphCode = TChar(10);
       
   805 	TInt fontId = 10;
       
   806 	VGImage foregroundImg = VG_INVALID_HANDLE;
       
   807 	VGImage shadowImg = VG_INVALID_HANDLE;
       
   808 	VGImage outlineImg = VG_INVALID_HANDLE;
       
   809 	TSize fontSize = TSize(10, 12);
       
   810 	TUint8* buffer = (TUint8*)User::AllocL(fontSize.iWidth * fontSize.iHeight);
       
   811 	CleanupStack::PushL(buffer);
       
   812 
       
   813 	TGlyphBitmapType glyphType = EDefaultGlyphBitmap; // unsupported
       
   814 	
       
   815 	TInt res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, fontSize, &foregroundImg, &shadowImg, &outlineImg);
       
   816 	TEST(res == KErrNotSupported);
       
   817 	TEST(foregroundImg == VG_INVALID_HANDLE);
       
   818 	TEST(shadowImg == VG_INVALID_HANDLE);
       
   819 	TEST(outlineImg == VG_INVALID_HANDLE);
       
   820 	
       
   821 	glyphType = EMonochromeGlyphBitmap; // supported
       
   822 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, TSize(12, 0), &foregroundImg, &shadowImg, &outlineImg);
       
   823 	TEST(res == KErrArgument);
       
   824 	res = aGlyphStorage->GlyphImage(fontId, glyphCode, glyphType, buffer, TSize(0, 12), &foregroundImg, &shadowImg, &outlineImg);
       
   825 	TEST(res == KErrArgument);
       
   826 	TEST(foregroundImg == VG_INVALID_HANDLE);
       
   827 	TEST(shadowImg == VG_INVALID_HANDLE);
       
   828 	TEST(outlineImg == VG_INVALID_HANDLE);
       
   829 
       
   830 	CleanupStack::PopAndDestroy(buffer);
       
   831 	}
       
   832 
       
   833 TInt CTGlyphImageCache::GlyphImageSizeInByte(TGlyphBitmapType aGlyphType, const TSize& aSize) const
       
   834 	{
       
   835 	TInt glyphSizeInByte = 0;	
       
   836 		//calculate the actual size of the glyph
       
   837 	switch(aGlyphType)
       
   838 		{
       
   839 	case EMonochromeGlyphBitmap:
       
   840 		glyphSizeInByte = (((aSize.iWidth + 31) / 32) << 2) * aSize.iHeight;
       
   841 		break;
       
   842 	case EAntiAliasedGlyphBitmap:
       
   843 		glyphSizeInByte = aSize.iWidth * aSize.iHeight;
       
   844 		break;
       
   845 	case EFourColourBlendGlyphBitmap:
       
   846 		glyphSizeInByte = aSize.iWidth * aSize.iHeight;
       
   847 		//we have to allocate memory for shadow and outline bitmap as well
       
   848 		glyphSizeInByte *= 3;
       
   849 		break;
       
   850 	default :
       
   851 		break;
       
   852 		}
       
   853 	return glyphSizeInByte;
       
   854 	}
       
   855 /**
       
   856 Draws the text on the screen according its direction and alignment.
       
   857 */	
       
   858 void CTGlyphImageCache::DrawText(const TDesC& aText, const TPoint& aPt, DrawTextDirection aDirection, DrawTextAdjustment aDrawAdjustment, TBool aUpdateJustification)
       
   859 	{
       
   860 	const TSize size = iGdiTarget->SizeInPixels();
       
   861 	TRect rect = size;
       
   862 	
       
   863 	if(aDirection == EDrawTextHorizontal)
       
   864 		{
       
   865 		switch(aDrawAdjustment)
       
   866 			{
       
   867 		case EDrawFromPoint:
       
   868 			iGc->DrawText(aText, NULL, aPt);
       
   869 			break;
       
   870 		case EDrawInBox:
       
   871 			iGc->SetOrigin(aPt);
       
   872 			rect = TRect(-aPt, size);
       
   873 			iGc->DrawText(aText, NULL, rect);
       
   874 			break;
       
   875 		case EDrawRightAlignment:
       
   876 			rect.iTl = aPt;
       
   877 			rect.iBr.iX -= 30;
       
   878 			iGc->DrawText(aText, NULL, rect, 0, DirectGdi::ERight);
       
   879 			break;
       
   880 			}
       
   881 		}
       
   882 	else if ((aDirection == EDrawTextVerticalDown) || (aDirection == EDrawTextVerticalUp))
       
   883 		{
       
   884 		TBool up = (aDirection==EDrawTextVerticalUp);
       
   885 		switch(aDrawAdjustment)
       
   886 			{
       
   887 		case EDrawFromPoint:
       
   888 			iGc->DrawTextVertical(aText, NULL, aPt, up);
       
   889 			break;
       
   890 		case EDrawInBox:
       
   891 			iGc->SetOrigin(aPt);
       
   892 			rect = TRect(-aPt, size);
       
   893 			if(aUpdateJustification)
       
   894 				{
       
   895 				iGc->SetCharJustification(80, aText.Length());
       
   896 				iGc->UpdateJustificationVertical(aText, NULL, up);
       
   897 				}
       
   898 
       
   899 			iGc->DrawTextVertical(aText, NULL, rect, up);
       
   900 			iGc->SetOrigin(TPoint());
       
   901 			break;
       
   902 		case EDrawRightAlignment:
       
   903 			rect.iTl = aPt;
       
   904 			rect.iBr.iY -= 30;
       
   905 			iGc->DrawTextVertical(aText, NULL, rect, 0, DirectGdi::ERight);
       
   906 			break;
       
   907 			}
       
   908 		}
       
   909 	}
       
   910 
       
   911 /**
       
   912 Overrides of base class virtual
       
   913 @leave Gets system wide error code
       
   914 @return - TVerdict code
       
   915 */
       
   916 TVerdict CTGlyphImageCache::doTestStepPreambleL()
       
   917 	{			
       
   918 	CTDirectGdiStepBase::doTestStepPreambleL();
       
   919 	return TestStepResult();
       
   920 	}
       
   921 	
       
   922 /** 
       
   923 Overrides of base class pure virtual
       
   924 Our implementation only gets called if the base class doTestStepPreambleL() did
       
   925 not leave. That being the case, the current test result value will be EPass.
       
   926 @leave Gets system wide error code
       
   927 @return TVerdict code
       
   928 */	
       
   929 TVerdict CTGlyphImageCache::doTestStepL()
       
   930 	{		
       
   931 	// Test for each pixel format
       
   932 	TInt maxPixelFormat =  iTargetPixelFormatArray.Count() - 1;
       
   933 	for(TInt targetPixelFormatIndex = maxPixelFormat; targetPixelFormatIndex >= 0 ; targetPixelFormatIndex--)
       
   934 		{
       
   935 		iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[targetPixelFormatIndex];
       
   936 		SetTargetL(iTestParams.iTargetPixelFormat, EOneContextOneTarget, KGlyphCacheWindowSize);
       
   937 
       
   938 		if(maxPixelFormat == targetPixelFormatIndex)
       
   939 			{
       
   940 			iMonotypeFont = DetectMonotypeFontL();
       
   941 			
       
   942 			if(!iMonotypeFont)
       
   943 				{
       
   944 				WARN_PRINTF1(_L("!! Due to running the test in environment without monotype fonts, some test cases will not \
       
   945 be executed! To set up environment with monotype font support, launch ityperast.cmd \
       
   946 from epoc32\\winscw\\c\\, and then follow the instruction on the screen!!"));
       
   947 				}
       
   948 			else
       
   949 				{
       
   950 				INFO_PRINTF1(_L("Monotype fonts have been detected"));
       
   951 				}	
       
   952 			}
       
   953 		
       
   954 		RunTestsL();
       
   955 		if(targetPixelFormatIndex == 0)
       
   956 			{
       
   957 			RunOomTestsL();
       
   958 			}
       
   959 		}
       
   960 	CloseTMSGraphicsStep();
       
   961 	return TestStepResult();
       
   962 	}
       
   963 
       
   964 /**
       
   965 Overrides of base class pure virtual function
       
   966 Lists the tests to be run
       
   967 */
       
   968 void CTGlyphImageCache::RunTestsL()
       
   969 	{
       
   970 	MFontGlyphImageStorage* glyphStorage = NULL;
       
   971 	TBool testImageCache = (iUseDirectGdi && !iUseSwDirectGdi);
       
   972 	if(testImageCache)
       
   973 		{
       
   974 		TInt err = iGc->GetInterface(TUid::Uid(KDirectGdiGetGlyphStorageUid), (TAny*&) glyphStorage);
       
   975 		if(err != KErrNone)
       
   976 			{
       
   977 			ERR_PRINTF2(_L("Error while retrieving Glyph Storage Interface, err = %d"), err);
       
   978 			TESTNOERRORL(err);
       
   979 			}
       
   980 		User::LeaveIfNull(glyphStorage);
       
   981 		CleanupStack::PushL(TCleanupItem(CleanCache, glyphStorage));
       
   982 		glyphStorage->CleanGlyphImageCache();
       
   983 		}
       
   984 
       
   985 	if(testImageCache)
       
   986 		{
       
   987 		SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0001"));
       
   988 		TestRetrieveEntryL(glyphStorage, EAntiAliasedGlyphBitmap);
       
   989 		RecordTestResultL();
       
   990 		glyphStorage->CleanGlyphImageCache();
       
   991 		SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0001"));
       
   992 		TestRetrieveEntryL(glyphStorage, EFourColourBlendGlyphBitmap);
       
   993 		RecordTestResultL();
       
   994 		glyphStorage->CleanGlyphImageCache();
       
   995 		SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0001"));
       
   996 		TestRetrieveEntryL(glyphStorage, EMonochromeGlyphBitmap);
       
   997 		RecordTestResultL();
       
   998 		SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0006"));
       
   999 		WrongParameterL(glyphStorage);
       
  1000 		RecordTestResultL();
       
  1001 		SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0005"));
       
  1002 		FontListIdOrderL(glyphStorage);
       
  1003 		RecordTestResultL();
       
  1004 		glyphStorage->CleanGlyphImageCache();
       
  1005 		}
       
  1006 
       
  1007 	if(!iRunningOomTests)//fonts are cached in the array, where memory won't be freed even if the font is released
       
  1008 		{
       
  1009 		if(testImageCache)
       
  1010 			{
       
  1011 			SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0004"));
       
  1012 			FillCacheL(glyphStorage);
       
  1013 			RecordTestResultL();
       
  1014 			SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0003"));
       
  1015 			FillUpCacheL(glyphStorage);
       
  1016 			RecordTestResultL();
       
  1017 			glyphStorage->CleanGlyphImageCache();
       
  1018 			}
       
  1019 		for(TInt ii = EDrawTextHorizontal; ii < EDrawTextLast; ii++)
       
  1020 			{
       
  1021 			for(TInt kk = EDrawFromPoint; kk <= EDrawInBox; kk++)
       
  1022 				{
       
  1023 				DrawTextDirection direction = (DrawTextDirection) ii;
       
  1024 				DrawTextAdjustment adjustment = (DrawTextAdjustment) kk;
       
  1025 		
       
  1026 				SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0002"));
       
  1027 				TestDrawGlyphL(glyphStorage, EMonochromeGlyphBitmap, direction, adjustment, EFalse);
       
  1028 				RecordTestResultL();
       
  1029 				SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0002"));
       
  1030 				TestDrawGlyphL(glyphStorage, EMonochromeGlyphBitmap, direction, adjustment, ETrue);
       
  1031 				RecordTestResultL();
       
  1032 				SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0002"));
       
  1033 				TestDrawGlyphL(glyphStorage, EAntiAliasedGlyphBitmap, direction, adjustment, EFalse);
       
  1034 				RecordTestResultL();
       
  1035 				SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0002"));
       
  1036 				TestDrawGlyphL(glyphStorage, EAntiAliasedGlyphBitmap, direction, adjustment, ETrue);
       
  1037 				RecordTestResultL();
       
  1038 				
       
  1039 				if(iMonotypeFont)
       
  1040 					{
       
  1041 					SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0002"));
       
  1042 					TestDrawGlyphL(glyphStorage, EFourColourBlendGlyphBitmap, direction, adjustment, EFalse);
       
  1043 					RecordTestResultL();
       
  1044 					SetTestStepID(_L("GRAPHICS-DIRECTGDI-GLYPHIMAGECACHE-0002"));
       
  1045 					TestDrawGlyphL(glyphStorage, EFourColourBlendGlyphBitmap, direction, adjustment, ETrue);
       
  1046 					RecordTestResultL();
       
  1047 					}
       
  1048 				}
       
  1049 			}
       
  1050 		}
       
  1051 
       
  1052 	//next set of tests should start from clean cache to garantee consistent results
       
  1053 	if(testImageCache)
       
  1054 		{
       
  1055 		glyphStorage->CleanGlyphImageCache();
       
  1056 		CleanupStack::Pop(glyphStorage);
       
  1057 		}
       
  1058 	}
       
  1059 
       
  1060 /**
       
  1061 See if monotype font is installed on the platform we are running on. Monotype font is required
       
  1062 to run the glyph tests that use the glyph bitmap type EFourColourBlendGlyphBitmap to draw
       
  1063 outlined and shadowed fonts.
       
  1064 @return ETrue if monotype is installed, EFalse if it is not installed.
       
  1065  */
       
  1066 TBool CTGlyphImageCache::DetectMonotypeFontL()
       
  1067 	{
       
  1068 	CFont *font = NULL;
       
  1069 	_LIT(KTestFontTypefaceName,"DejaVu Sans Condensed");
       
  1070 	TFontSpec fspec(KTestFontTypefaceName, 12);
       
  1071 	fspec.iFontStyle.SetBitmapType(EFourColourBlendGlyphBitmap);
       
  1072 
       
  1073 	fspec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
       
  1074 	fspec.iFontStyle.SetEffects(FontEffect::EOutline, ETrue);
       
  1075 	fspec.iFontStyle.SetEffects(FontEffect::EDropShadow, ETrue);
       
  1076 
       
  1077 	User::LeaveIfError(iFontStore->GetNearestFontToDesignHeightInPixels((CFont*&) font, fspec));
       
  1078 
       
  1079 	TFontSpec fontSpec = font->FontSpecInTwips();
       
  1080 	TGlyphBitmapType glyphBitmapType = fontSpec.iFontStyle.BitmapType();
       
  1081 	iFontStore->ReleaseFont(font);
       
  1082 
       
  1083 	return (EFourColourBlendGlyphBitmap==glyphBitmapType);
       
  1084 	}