fbs/fontandbitmapserver/tfbs/tfbsglyphdata.cpp
author hgs
Fri, 30 Jul 2010 11:41:40 +0300
changeset 136 62bb7c97884c
parent 121 d72fc2aace31
permissions -rw-r--r--
201030_2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     1
// Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     2
// All rights reserved.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     7
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     8
// Initial Contributors:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    10
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    11
// Contributors:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    12
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    13
// Description:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    14
//
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    15
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    16
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    17
 @file
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    18
 @internalComponent - Internal Symbian test code
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    19
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    20
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
    21
#include <test/graphicsfontutils.h>
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    22
#include <EGL/egl.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    23
#include <VG/openvg.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    24
#include <graphics/fbsglyphmetricsarray.h> 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    25
#include <graphics/fbsglyphdataiterator.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    26
#include <sgresource/sgimage.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    27
#include <sgresource/sgdriver_test.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    28
#include <sgresource/sgdriver_profiling.h>
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    29
#include "FbsMessage.h"
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
_LIT(KTypefaceName, "DejaVu Sans Condensed");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    33
//_LIT(KMonoTypefaceName, "DejaVu Sans Mono");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    34
const TInt KNumGlyphCodesLatin = 96;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    35
const TUint KDejaVuInvalidGlyphCode = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    36
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    37
// Currently only used in debug. When TestMultithreadStressAtlas() test is enabled, #ifdef to be removed. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    38
#ifdef _DEBUG
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    39
const TInt KTestThreadMinHeapSize = 0x20000;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    40
const TInt KTestThreadMaxHeapSize = 0x20000;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    41
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    42
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    43
// 'most significant bit' flag to ensure value is interpreted as a glyph code rather than an ascii code
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    44
const TUint KGlyphCodeFlag = 0x80000000;      
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    45
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    46
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    47
// Please note the following macros which enable helper functions, and are declared in the header.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    48
// SAVEGLYPHSTOMBMDURINGCOMPARISON and
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    49
// SAVEGLYPHSTOMBMDEBUGFUNCTION
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    50
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
    51
// Utility function declarations - utilities used by the tests
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    52
static TFontSpec GenerateDejaVuFontSpec(TInt aSeed);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    53
static void CopyCharLine(TUint32*& aBinaryDataPtr,TInt aBufferWords,const TUint8* aData,TInt aBitShift,TInt aCharWidth, TInt16 aRepeatCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    54
static void DecodeBinaryData(const TSize& aDataSize, const TUint8* aData, TInt aStride,	TUint32* aBinaryData);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    55
static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    56
static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage, TUint8* aBuffer1, TUint8* aBuffer2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    57
// Following functions commented out because the tests which use these functions 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    58
// are currently commented out due to Broadcom defect 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    59
// ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    60
//static TInt FillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    61
//static TInt NearlyFillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    62
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    63
#if defined (SAVEGLYPHSTOMBMDEBUGFUNCTION) || defined (SAVEGLYPHSTOMBMDURINGCOMPARISON)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    64
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    65
Static utility function. Converts an A8 RSgImage into a CFbsBitmap.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    66
To do this, the RSgImage is converted to an EGLImage, then to a VGImage,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    67
where the image memory is read into a CFbsBitmap.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    68
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    69
@param aEGL The EGL helper object that will read the SgImage into a memory buffer.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    70
@param aSgImage The RSgImage to convert.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    71
@param aRect A rectangular region of the RSgImage to convert.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    72
@param aBitmap On success, holds a pointer to a CFbsBitmap which contains the image
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    73
	data of the RSgImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    74
@return One of the system-wide error codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    75
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    76
static TInt CreateBitmapFromSgImage(CEGLHelper* aEGL, const RSgImage& aSgImage, const TRect& aRect, CFbsBitmap*& aBitmap)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    77
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    78
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    79
	const TSize bufferSize = aRect.Size();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    80
	const TInt dataStride = bufferSize.iWidth;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    81
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    82
	TUint8* imageBuffer = reinterpret_cast<TUint8*>(User::AllocZ(bufferSize.iHeight * dataStride));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    83
	if (!imageBuffer)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    84
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    85
		return KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    86
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    87
	err = aEGL->GetSgImageData(aSgImage, aRect, imageBuffer);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    88
	if (err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    89
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    90
		User::Free(imageBuffer);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    91
		return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    92
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    93
	aBitmap = new CFbsBitmap();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    94
	if (!aBitmap)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    95
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    96
		User::Free(imageBuffer);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    97
		return KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    98
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
    99
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   100
	err = aBitmap->Create(bufferSize, EGray256);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   101
	if (KErrNone == err)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   102
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   103
		TUint8* buf = imageBuffer;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   104
		aBitmap->BeginDataAccess();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   105
		TUint8* dataAddress = reinterpret_cast<TUint8*>(aBitmap->DataAddress());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   106
		const TInt dataStride = aBitmap->DataStride();	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   107
		for (TInt scanline = 0; scanline < bufferSize.iHeight; scanline++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   108
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   109
			Mem::Copy(dataAddress, buf, bufferSize.iWidth);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   110
			dataAddress += dataStride;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   111
			buf += bufferSize.iWidth;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   112
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   113
		aBitmap->EndDataAccess(EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   114
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   115
	else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   116
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   117
		delete aBitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   118
		aBitmap = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   119
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   120
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   121
	User::Free(imageBuffer);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   122
	return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   123
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   124
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   125
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   126
Utility function to aid with debugging.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   127
Saves a bitmap to file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   128
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   129
@param aBmp Bitmap to save
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   130
@param aMeta Optional. If specified, it is added to the name of the bitmap file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   131
@param aRef Flag to show whether bitmap is a reference bitmap (ETrue) or test bitmap (EFalse).
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   132
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   133
static void SaveBmp(CFbsBitmap* aBmp, TPtrC* aMeta, TBool aRef)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   134
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   135
	if (!aBmp)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   136
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   137
		return;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   138
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   139
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   140
	TBuf<256> testFileName;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   141
	if (aRef)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   142
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   143
		testFileName.Append(_L("Ref"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   144
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   145
	else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   146
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   147
		testFileName.Append(_L("Test"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   148
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   149
	if (aMeta)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   150
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   151
		testFileName.Append(*aMeta);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   152
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   153
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   154
	TFileName mbmFile;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   155
	TBuf<20> testPathName;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   156
	#ifdef __WINS__
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   157
		testPathName.Append(_L("c:\\%S.mbm"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   158
	#else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   159
		testPathName.Append(_L("e:\\%S.mbm"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   160
	#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   161
	mbmFile.Format(testPathName, &testFileName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   162
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   163
	// As this is for debugging purposes only, doesn't matter reporting whether
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   164
	// saving succeeded or not.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   165
	aBmp->Save(mbmFile);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   166
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   167
#endif // SAVEGLYPHSTOMBMDEBUGFUNCTION OR SAVEGLYPHSTOMBMDURINGCOMPARISON
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   168
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   169
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   170
#ifdef SAVEGLYPHSTOMBMDEBUGFUNCTION
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   171
void CTFbsGlyphData::SaveRSgImagesAsMbms(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, const RSgImage& aImageB, const TRect& aRectB )
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   172
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   173
	static TInt countToAppend = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   174
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   175
	CFbsBitmap* bitmap = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   176
	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageA, aRectA, bitmap))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   177
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   178
		TBuf<KMaxFileName> buf( _L("String") );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   179
		buf.AppendNum( countToAppend );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   180
		TPtrC nameAppend( buf );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   181
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   182
		SaveBmp(bitmap, &nameAppend, EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   183
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   184
	delete bitmap;  
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   185
	bitmap = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   186
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   187
	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageB, aRectB, bitmap))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   188
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   189
		TBuf<KMaxFileName> buf( _L("String") );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   190
		buf.AppendNum( countToAppend );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   191
		TPtrC nameAppend( buf );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   192
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   193
		SaveBmp(bitmap, &nameAppend, ETrue);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   194
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   195
	delete bitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   196
	bitmap = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   197
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   198
	countToAppend++;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   199
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   200
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   201
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   202
Static debug utility method that outputs the glyph images of the given glyph
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   203
codes for the given font to a file.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   204
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   205
static void DumpFontGlyphs(CEGLHelper* aEGL, CFont* aFont, TInt aCodesCount)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   206
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   207
	TFontSpec fontSpec = aFont->FontSpecInTwips();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   208
	TOpenFontCharMetrics charMetrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   209
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   210
	const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   211
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   212
	for (TInt glyphCode = 0; glyphCode < aCodesCount; glyphCode++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   213
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   214
		CFont::TCharacterDataAvailability availability = aFont->GetCharacterData(glyphCode | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   215
		if (availability == CFont::EAllCharacterData)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   216
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   217
			RSgImage characterDataImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   218
			TInt err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   219
			if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   220
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   221
				CFbsBitmap* bitmap = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   222
				err = CreateBitmapFromSgImage(aEGL, characterDataImage, TRect(TPoint(0, 0), bitmapSize), bitmap);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   223
				if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   224
					{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   225
					TBuf<256> bitmapName;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   226
					bitmapName.AppendFormat(_L("%S-%i"), &(fontSpec.iTypeface.Name()), glyphCode);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   227
					TPtrC bitmapNamePtr(bitmapName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   228
					SaveBmp(bitmap, &bitmapNamePtr, EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   229
					delete bitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   230
					}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   231
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   232
			characterDataImage.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   233
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   234
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   235
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   236
#endif // SAVEGLYPHSTOMBMDEBUGFUNCTION
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   237
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   238
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   239
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   240
Utility to return a fontspec such that the font created from it will
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   241
not match any other font generated by a different seed. The font
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   242
will be useable by RFbsGlyphDataIterator and RFbsGlyphMetricsArray.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   243
It will always return a font based on the DejaVu fontspec, this is 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   244
so that the glyphcodes in DejaVuASCIIToGlyphCode are guaranteed to
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   245
work.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   246
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   247
@param aSeed Specifies a variant of the fontspec to create. Passing the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   248
	same seed will cause the same TFontSpec to be returned.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   249
@return The generated fontspec. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   250
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   251
static TFontSpec GenerateDejaVuFontSpec(TInt aSeed)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   252
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   253
	const TInt KFontHeightStep = 4;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   254
	const TInt KFontInitialHeight = 8;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   255
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   256
	const TInt KNumFontTypefaces = 3;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   257
	const TInt KNumFontBitmapTypes = 2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   258
	const TInt KNumFontStyles = 4;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   259
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   260
	TInt fontBitmapTypeVariant = aSeed % KNumFontBitmapTypes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   261
	TInt fontStyleVariant = (aSeed / KNumFontBitmapTypes) % KNumFontStyles;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   262
	TInt fontTypefaceVariant = (aSeed / ( KNumFontStyles * KNumFontBitmapTypes)) % KNumFontTypefaces;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   263
	TInt fontHeightVariant = aSeed / (KNumFontStyles * KNumFontTypefaces * KNumFontBitmapTypes);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   264
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   265
	TFontSpec fontSpec;	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   266
	fontSpec.iHeight = KFontInitialHeight + (fontHeightVariant * KFontHeightStep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   267
	// Set the typeface name
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   268
	// Set the style.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   269
	switch (fontStyleVariant)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   270
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   271
		case 1: // italic
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   272
			fontSpec.iFontStyle.SetPosture(EPostureItalic);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   273
			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   274
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   275
		case 2: // bold
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   276
			fontSpec.iFontStyle.SetPosture(EPostureUpright);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   277
			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   278
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   279
		case 3: // bold italic
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   280
			fontSpec.iFontStyle.SetPosture(EPostureItalic);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   281
			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   282
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   283
		default: // normal 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   284
			fontSpec.iFontStyle.SetPosture(EPostureUpright);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   285
			fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightNormal);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   286
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   287
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   288
	switch (fontTypefaceVariant)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   289
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   290
		case 1:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   291
			fontSpec.iTypeface.SetName(_L("DejaVu Sans Mono"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   292
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   293
		case 2:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   294
			fontSpec.iTypeface.SetName(_L("DejaVu Serif Condensed"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   295
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   296
		case 3:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   297
			fontSpec.iTypeface.SetName(_L("DejaVu Sans Condensed"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   298
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   299
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   300
	switch(fontBitmapTypeVariant)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   301
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   302
		case 1:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   303
			fontSpec.iFontStyle.SetBitmapType(EMonochromeGlyphBitmap);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   304
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   305
		default:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   306
			fontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   307
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   308
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   309
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   310
	return fontSpec;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   311
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   312
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   313
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   314
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   315
 * 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   316
 EGL helper class to retrieve image data from an SgImage into a memory buffer.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   317
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   318
CEGLHelper::CEGLHelper() :
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   319
	iDisplay(EGL_NO_DISPLAY),
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   320
	iContext(EGL_NO_CONTEXT),
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   321
	iSurface(EGL_NO_SURFACE)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   322
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   323
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   324
CEGLHelper::~CEGLHelper()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   325
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   326
	iMutex.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   327
	eglMakeCurrent(iDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   328
	eglDestroyContext(iDisplay, iContext);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   329
	eglDestroySurface(iDisplay, iSurface);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   330
	eglTerminate(iDisplay);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   331
	eglReleaseThread();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   332
	iSgDriver.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   333
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   334
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   335
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   336
Factory method to create CEGLHelper.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   337
@return A pointer to an instance of CEGLHelper.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   338
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   339
CEGLHelper* CEGLHelper::NewL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   340
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   341
	CEGLHelper* self = new CEGLHelper();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   342
	CleanupStack::PushL(self);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   343
	self->ConstructL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   344
	CleanupStack::Pop(1); // self
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   345
	return self;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   346
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   347
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   348
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   349
Opens handle to the process-wide synchronisation semaphore,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   350
loads EGL and VG extension function pointers,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   351
sets up EGL resources so that EGLImages can be constructed. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   352
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   353
void CEGLHelper::ConstructL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   354
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   355
	_LIT(KEGLMutex, "TFbsGlyphDataEGLMutex");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   356
	User::LeaveIfError(iMutex.CreateGlobal(KEGLMutex, EOwnerProcess));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   357
	User::LeaveIfError(iSgDriver.Open());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   358
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   359
	iDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   360
	if (iDisplay == EGL_NO_DISPLAY)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   361
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   362
		User::Leave(KErrNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   363
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   364
	if (EGL_TRUE != eglInitialize(iDisplay, NULL, NULL))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   365
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   366
		User::Leave(KErrNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   367
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   368
	eglBindAPI(EGL_OPENVG_API);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   369
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   370
	// Load the necessary EGL extensions...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   371
	eglCreateImageKHR = reinterpret_cast<PFNEGLCREATEIMAGEKHRPROC>(eglGetProcAddress("eglCreateImageKHR"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   372
	eglDestroyImageKHR = reinterpret_cast<PFNEGLDESTROYIMAGEKHRPROC>(eglGetProcAddress("eglDestroyImageKHR"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   373
	vgCreateImageTargetKHR = reinterpret_cast<TvgCreateEGLImageTargetKHRTypefPtr>(eglGetProcAddress("vgCreateEGLImageTargetKHR"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   374
	if (!eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateImageTargetKHR)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   375
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   376
		User::Leave(KErrExtensionNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   377
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   378
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   379
	// In order to create VGImages from EGLImages, a context must be current.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   380
	// Therefore create an EGLContext and EGLSurface to make current, using
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   381
	// a dummy RSgImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   382
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   383
	RSgImage dummySurface;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   384
	TSgImageInfo dummySurfaceInfo(TSize(1, 1), ESgPixelFormatRGB_565, ESgUsageBitOpenVgSurface);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   385
	User::LeaveIfError(dummySurface.Create(dummySurfaceInfo, NULL, 0));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   386
	CleanupClosePushL(dummySurface);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   387
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   388
	EGLint configAttribs[] = 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   389
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   390
		EGL_MATCH_NATIVE_PIXMAP, (EGLint)&dummySurface,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   391
		EGL_RENDERABLE_TYPE, EGL_OPENVG_BIT,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   392
		EGL_NONE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   393
		};
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   394
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   395
	EGLint configId = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   396
	EGLint numConfigs = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   397
	if (EGL_FALSE == eglChooseConfig(iDisplay, configAttribs, &configId, 1, &numConfigs) || numConfigs == 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   398
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   399
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   400
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   401
	iContext = eglCreateContext(iDisplay, configId, EGL_NO_CONTEXT, NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   402
	if (iContext == EGL_NO_CONTEXT)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   403
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   404
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   405
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   406
	iSurface = eglCreatePixmapSurface(iDisplay, configId, &dummySurface, NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   407
	if (iSurface == EGL_NO_SURFACE)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   408
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   409
		User::Leave(KErrGeneral);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   410
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   411
	CleanupStack::PopAndDestroy(1); // dummySurface
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   412
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   413
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   414
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   415
Retrieves the data from an A8 RSgImage into a buffer.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   416
To do this, the RSgImage is converted to an EGLImage, then to a VGImage,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   417
where the image memory is read into the given buffer.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   418
The function can be called from multiple threads and synchronisation
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   419
with EGL is controlled via a mutex.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   420
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   421
@param aSgImage The RSgImage to convert.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   422
@param aRect A rectangular region of the RSgImage to convert.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   423
@param aBuf On success, contains the image data of the RSgImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   424
@return One of the system-wide error codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   425
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   426
TInt CEGLHelper::GetSgImageData(const RSgImage& aSgImage, const TRect& aRect, TUint8*& aBuf)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   427
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   428
	const TSize bufferSize = aRect.Size();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   429
	const TInt dataStride = bufferSize.iWidth;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   430
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   431
	if (bufferSize == TSize(0,0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   432
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   433
		return KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   434
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   435
	iMutex.Wait();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   436
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   437
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   438
	EGLImageKHR eglImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   439
	if (EGL_FALSE == eglBindAPI(EGL_OPENVG_API))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   440
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   441
		err = KErrGeneral;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   442
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   443
	else if (EGL_FALSE == eglMakeCurrent(iDisplay, iSurface, iSurface, iContext))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   444
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   445
		err = KErrGeneral;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   446
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   447
	else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   448
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   449
		// Create EGLImages from the RSgImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   450
		EGLint imageAttribs[] =
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   451
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   452
			EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   453
			EGL_NONE
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   454
			};
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   455
		eglImage = eglCreateImageKHR(iDisplay, EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR, reinterpret_cast<EGLClientBuffer>(&aSgImage), imageAttribs);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   456
		if (eglImage == EGL_NO_IMAGE_KHR)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   457
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   458
			err = KErrArgument;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   459
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   460
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   461
	if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   462
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   463
		// Create VGImages from the EGLImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   464
		VGImage vgImage = vgCreateImageTargetKHR(eglImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   465
		eglDestroyImageKHR(iDisplay, eglImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   466
		if (vgImage == VG_INVALID_HANDLE)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   467
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   468
			err = KErrArgument;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   469
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   470
		else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   471
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   472
			// Get the image data in 8bpp format
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   473
			vgGetImageSubData(vgImage, aBuf, dataStride, VG_A_8, aRect.iTl.iX, aRect.iTl.iY, bufferSize.iWidth, bufferSize.iHeight);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   474
			vgDestroyImage(vgImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   475
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   476
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   477
	eglReleaseThread();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   478
	iMutex.Signal();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   479
	return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   480
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   481
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   482
CTFbsGlyphData::CTFbsGlyphData(CTestStep* aStep):
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   483
	CTGraphicsBase(aStep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   484
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   485
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   486
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   487
void CTFbsGlyphData::ConstructL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   488
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   489
	User::LeaveIfError(Logger().ShareAuto());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   490
	User::LeaveIfError(RFbsSession::Connect());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   491
	iFbs = RFbsSession::GetSession();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   492
	iTs = (CFbsTypefaceStore*)CFbsTypefaceStore::NewL(NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   493
	User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont, TFontSpec(KTypefaceName, 15)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   494
	User::LeaveIfError(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)iFont2, TFontSpec(KTypefaceName, 8)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   495
	
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   496
	CCharCodeConverter* converter = CCharCodeConverter::NewLC();
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   497
	converter->UseFontL(iFont);
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   498
	iGlyphCodesLatin = new(ELeave) TUint[KNumGlyphCodesLatin];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   499
	for (TInt ii = 0; ii < KNumGlyphCodesLatin; ++ii)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   500
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   501
		TUint asciiCode = ii+0x20; // ASCII characters from 0020 to 007F
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   502
		iGlyphCodesLatin[ii] = converter->GlyphCodeL(asciiCode);
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   503
		}
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
   504
	CleanupStack::PopAndDestroy(1); // converter
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   505
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   506
	User::LeaveIfError(iSgDriver.Open());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   507
	iEGL = CEGLHelper::NewL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   508
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   509
	// Creating a CFbsBitmap will force the RFbsSession to allocate a scanline buffer
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   510
	// now rather than in the middle of a test, thus avoiding heap check failure. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   511
	CFbsBitmap* dummyBitmap = new (ELeave) CFbsBitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   512
	CleanupStack::PushL(dummyBitmap);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   513
	User::LeaveIfError(dummyBitmap->Create(TSize(512, 1), EGray256));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   514
	CleanupStack::PopAndDestroy(dummyBitmap);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   515
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   516
	INFO_PRINTF1(_L("FBSERV Glyph Data Testing"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   517
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   518
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   519
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   520
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   521
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   522
CTFbsGlyphData::~CTFbsGlyphData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   523
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   524
	delete iEGL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   525
	iSgDriver.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   526
	if (iTs)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   527
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   528
		iTs->ReleaseFont(iFont);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   529
		iTs->ReleaseFont(iFont2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   530
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   531
	delete iTs;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   532
	delete[] iGlyphCodesLatin;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   533
	User::Free(iTempBuf1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   534
	User::Free(iTempBuf2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   535
	RFbsSession::Disconnect();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   536
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   537
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   538
void CTFbsGlyphData::RunTestCaseL(TInt aCurTestCase)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   539
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   540
	((CTFbsGlyphDataStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   541
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   542
	TRAPD(leave, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   543
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   544
	switch(aCurTestCase)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   545
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   546
	case 1:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   547
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0624"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   548
		TestConsistencyWithGetCharacterData();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   549
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   550
	case 2:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   551
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0625"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   552
		TestInvalidGlyphCode();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   553
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   554
	case 3:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   555
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0626"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   556
		TestGlyphMetricsArrayParameters();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   557
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   558
	case 4:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   559
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0627"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   560
		TestGlyphMetricsArrayReuse();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   561
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   562
	case 5:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   563
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0628"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   564
		TestGlyphDataIteratorClose();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   565
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   566
	case 6:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   567
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0629"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   568
		TestGlyphDataIteratorSequence();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   569
		break;	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   570
	case 7:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   571
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0632"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   572
		TestGlyphDataIteratorMultipleUsesOnMultipleFonts();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   573
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   574
	case 8:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   575
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0633"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   576
		TestGlyphDataIteratorImageValidity();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   577
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   578
	case 9:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   579
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0634"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   580
		TestGlyphDataIteratorOpenInvalidCode();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   581
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   582
	case 10:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   583
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0636"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   584
		TestGlyphDataIteratorOpenTwice();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   585
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   586
	case 11:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   587
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0637"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   588
		TestGlyphDataIteratorOpenTwiceWithDifferentFonts();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   589
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   590
	case 12:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   591
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0638"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   592
		TestGlyphDataIteratorOpenTooBigFont();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   593
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   594
	case 13:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   595
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0640"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   596
		TestGlyphDataIteratorOpenWithWrongArgument();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   597
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   598
	case 14:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   599
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0641"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   600
		TestGlyphDataIteratorImageMemoryLeak();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   601
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   602
	case 15:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   603
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0662"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   604
		TestGlyphDataIteratorNoGraphicsMemory();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   605
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   606
	case 16: 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   607
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0659"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   608
		TestGlyphDataIteratorLargeFontStress();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   609
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   610
	case 17: 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   611
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0660"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   612
		TestGlyphDataIteratorManyFontsStressL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   613
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   614
	case 18:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   615
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0666"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   616
		TestGlyphDataIteratorNextIsAtomic();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   617
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   618
	case 19:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   619
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0665"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   620
		TestGlyphDataIteratorSameGlyphCodes();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   621
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   622
	case 20:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   623
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0668"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   624
		TestGlyphDataIteratorManyArraySizes();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   625
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   626
	case 21:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   627
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0669"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   628
		TestBitmapFontSupport();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   629
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   630
	case 22:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   631
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0671"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   632
		TestMultithreadShareSingleFont();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   633
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   634
	case 23:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   635
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0672"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   636
		TestMultithreadStressAtlas();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   637
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   638
    case 24:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   639
        ((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0673"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   640
        TestGlyphMetricsArrayHeapOOML();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   641
        break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   642
    case 25:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   643
        ((CTFbsGlyphDataStep*)iStep)->SetTestStepID(_L("GRAPHICS-FBSERV-0674"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   644
        TestGlyphDataIteratorHeapOOML();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   645
        break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   646
	default:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   647
		((CTFbsGlyphDataStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   648
		((CTFbsGlyphDataStep*)iStep)->CloseTMSGraphicsStep();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   649
		TestComplete();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   650
		break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   651
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   652
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   653
	); // TRAPD
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   654
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   655
	if (leave != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   656
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   657
		ERR_PRINTF2(_L("Leave %d occurred during test"), leave);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   658
		iStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   659
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   660
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   661
	((CTFbsGlyphDataStep*)iStep)->RecordTestResultL();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   662
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   663
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   664
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   665
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   666
@SYMTestCaseID		GRAPHICS-FBSERV-0624
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   667
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   668
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   669
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   670
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   671
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   672
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   673
	Shows that RFbsGlyphMetricsArray::Get() and CFont::GetCharacterData() all 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   674
	provide the same metrics for the same set of glyph codes when using a CFbsFont.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   675
	Shows that RFbsGlyphDataIterator::Metrics() and CFont::GetCharacterData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   676
	provide the same metrics for the same set of glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   677
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   678
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   679
	i. Call RFbsGlyphMetricsArray::Get() for a set of glyph codes with 1 glyph code per call.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   680
	ii. Call RFbsGlyphMetricsArray::Get() for a set of glyph codes all in 1 call.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   681
	iii. Call RFbsGlyphDataIterator::Open() for a set of glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   682
	iv. Call CFont::GetCharacterData() for the same set of glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   683
	v. Compare the metrics for each glyph code from all calls.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   684
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   685
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   686
	For each glyph code, metrics received from RFbsGlyphMetricsArray::Get() and
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   687
	CFont::GetCharacterData() and RFbsGlyphDataIterator are all the same.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   688
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   689
void CTFbsGlyphData::TestConsistencyWithGetCharacterData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   690
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   691
	INFO_PRINTF1(_L("Test RFbsGlyphMetricsArray::Get() with GetCharacterData()"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   692
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   693
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   694
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   695
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   696
	RFbsGlyphMetricsArray glyphMetricsArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   697
	RFbsGlyphMetricsArray glyphMetricsArraySingle;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   698
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   699
	TInt numMismatches = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   700
	TOpenFontCharMetrics charMetrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   701
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   702
	const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   703
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   704
	// Retrieve list of metrics for all glyph codes in one call
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   705
	TInt err = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   706
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   707
	if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   708
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   709
		TEST(KNumGlyphCodesLatin == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   710
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   711
		TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   712
		TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   713
		TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   714
		for (; iterErr == KErrNone; iterErr = iter.Next(), index++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   715
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   716
			iFont->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   717
			
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   718
			// Retrieve the metrics for each glyph code, one at a time
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   719
			TESTNOERROR(err = glyphMetricsArraySingle.Get(*iFont, &iGlyphCodesLatin[index], 1));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   720
			if (KErrNone == err)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   721
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   722
				// Compare GetCharacterData() metrics with single RFbsGlyphMetricsArray.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   723
				TUint32 comparison1 = CompareMetrics(charMetrics, glyphMetricsArraySingle[0]); 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   724
				// Compare GetCharacterData() metrics with large RFbsGlyphMetricsArray.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   725
				TUint32 comparison2 = CompareMetrics(charMetrics, glyphMetricsArray[index]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   726
				// Compare GetCharacterData() metrics with RFbsGlyphDataIterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   727
				TUint32 comparison3 = CompareMetrics(charMetrics, iter.Metrics());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   728
				if (comparison1 != 0 || comparison2 != 0 || comparison3 != 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   729
					{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   730
					ERR_PRINTF5(_L("Glyphcode %i : Metrics mismatch: %d/%d/%d"), iGlyphCodesLatin[index], comparison1, comparison2, comparison3);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   731
					++numMismatches;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   732
					}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   733
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   734
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   735
			iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   736
			glyphMetricsArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   737
			glyphMetricsArraySingle.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   738
			TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   739
			TEST(numMismatches == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   740
			TEST(index == KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   741
		}		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   742
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   743
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   744
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   745
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   746
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   747
@return A series of success/fail booleans as a bitmask. A return value of zero
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   748
	indicates all tests passed, a result of 1 indicates the first test case failed, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   749
	a return of 3 indicates the first and second test failed, and so on.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   750
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   751
TUint32 CTFbsGlyphData::CompareMetrics(const TOpenFontCharMetrics& aMetrics1, const TOpenFontCharMetrics& aMetrics2)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   752
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   753
	TUint32 result = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   754
	result |= (aMetrics1.Width() == aMetrics2.Width()) ? 0 : (1 << 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   755
	result |= (aMetrics1.Height() == aMetrics2.Height()) ? 0 : (1 << 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   756
	result |= (aMetrics1.HorizBearingX() == aMetrics2.HorizBearingX()) ? 0 : (1 << 2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   757
	result |= (aMetrics1.HorizBearingY() == aMetrics2.HorizBearingY()) ? 0 : (1 << 3);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   758
	result |= (aMetrics1.HorizAdvance() == aMetrics2.HorizAdvance()) ? 0 : (1 << 4);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   759
	result |= (aMetrics1.VertBearingX() == aMetrics2.VertBearingX()) ? 0 : (1 << 5);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   760
	result |= (aMetrics1.VertBearingY() == aMetrics2.VertBearingY()) ? 0 : (1 << 6);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   761
	result |= (aMetrics1.VertAdvance() == aMetrics2.VertAdvance()) ? 0 : (1 << 7);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   762
	TRect rect1;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   763
	aMetrics1.GetHorizBounds(rect1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   764
	TRect rect2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   765
	aMetrics2.GetHorizBounds(rect2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   766
	result |= (rect1 == rect2) ? 0 : (1 << 8);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   767
	aMetrics1.GetVertBounds(rect1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   768
	aMetrics2.GetVertBounds(rect2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   769
	result |= (rect1 == rect2) ? 0 : (1 << 9);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   770
	return result;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   771
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   772
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   773
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   774
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   775
@SYMTestCaseID		GRAPHICS-FBSERV-0625
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   776
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   777
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   778
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   779
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   780
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   781
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   782
	Shows that RFbsGlyphMetricsArray::Get(), and CFont::GetCharacterData() show the same 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   783
	behaviour when asked for metrics for an invalid glyph code when using a	CFbsFont. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   784
	An invalid glyph code is one for which there is no character equivalent, such as 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   785
	0.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   786
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   787
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   788
	i. Call CFont::GetCharacterData() for an invalid glyph code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   789
	ii. Call RFbsGlyphMetricsArray::Get() for the same invalid glyph code, and either 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   790
		compare the metrics if i. was successful, or check an error code was returned
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   791
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   792
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   793
	If GetCharacterData() is successful, the metrics received from
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   794
	RFbsGlyphMetricsArray::Get() and CFont::GetCharacterData()	are the same, otherwise
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   795
	RFbsGlyphMetricsArray::Get() should return an error code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   796
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   797
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   798
void CTFbsGlyphData::TestInvalidGlyphCode()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   799
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   800
	INFO_PRINTF1(_L("Test behaviour of RFbsGlyphMetricsArray::Get() with invalid glyph code is consistent with GetCharacterData"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   801
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   802
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   803
	TInt arrayErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   804
	RFbsGlyphMetricsArray glyphMetricsArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   805
	TOpenFontCharMetrics charMetrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   806
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   807
	const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   808
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   809
	CFont::TCharacterDataAvailability availability = iFont->GetCharacterData(KDejaVuInvalidGlyphCode | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   810
	if (availability == CFont::ENoCharacterData)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   811
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   812
		// Some rasterizers fail to return any data for KDejaVuInvalidGlyphCode, therefore
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   813
		// rather than compare metrics, make sure RFbsGlyphDataIterator returns an error code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   814
		WARN_PRINTF1(_L("Rasterizer failed to return data for invalid glyph code; not comparing glyph metrics"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   815
		arrayErr = glyphMetricsArray.Get(*iFont, &KDejaVuInvalidGlyphCode, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   816
		TESTE(arrayErr != KErrNone, arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   817
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   818
	else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   819
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   820
		TESTNOERROR(arrayErr = glyphMetricsArray.Get(*iFont, &KDejaVuInvalidGlyphCode, 1));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   821
		if (KErrNone == arrayErr)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   822
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   823
			iFont->GetCharacterData(KDejaVuInvalidGlyphCode | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   824
			TUint comparisonResult = CompareMetrics(charMetrics, glyphMetricsArray[0]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   825
			TESTNOERROR( comparisonResult );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   826
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   827
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   828
	glyphMetricsArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   829
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   830
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   831
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   832
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   833
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   834
@SYMTestCaseID		GRAPHICS-FBSERV-0626
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   835
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   836
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   837
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   838
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   839
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   840
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   841
	Shows that RFbsGlyphMetricsArray::Get() returns with the correct error code when passed
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   842
	various combinations of parameters, and preserves the state of the array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   843
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   844
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   845
	Populate the array with a single metrics entry.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   846
	Call RFbsGlyphMetricsArray::Get with the following parameter combinations:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   847
		1. A negative count
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   848
		2. A positive count and null glyph code array pointer
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   849
		3. A zero count and non-null glyph code array pointer
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   850
		4. A zero count and null glyph code array pointer
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   851
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   852
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   853
	The following return codes are expected for each call:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   854
		1. KErrArgument
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   855
		2. KErrArgument
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   856
		3. KErrArgument
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   857
		4. KErrArgument	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   858
	For each case the glyph metrics array remains unchanged.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   859
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   860
void CTFbsGlyphData::TestGlyphMetricsArrayParameters()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   861
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   862
	INFO_PRINTF1(_L("Test the return values of GetGlyphMetrics with different parameters"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   863
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   864
	TInt arrayErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   865
	TOpenFontCharMetrics dummyMetrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   866
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   867
	RFbsGlyphMetricsArray glyphMetricsArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   868
	arrayErr = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   869
	TESTNOERROR(arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   870
	TEST(1 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   871
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   872
	// 1. Negative Count
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   873
	arrayErr = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, -1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   874
	TESTE(KErrArgument == arrayErr, arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   875
	TEST(1 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   876
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   877
	// 2. Positive Count and NULL Array Pointer
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   878
	arrayErr = glyphMetricsArray.Get(*iFont, NULL, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   879
	TESTE(KErrArgument == arrayErr, arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   880
	TEST(1 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   881
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   882
	// 3. Zero Count & Valid Array Pointer
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   883
	arrayErr = glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   884
	TESTE(KErrArgument == arrayErr, arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   885
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   886
	// 4. Zero Count & NULL Array Pointer
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   887
	arrayErr = glyphMetricsArray.Get(*iFont, NULL, 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   888
	TESTE(KErrArgument == arrayErr, arrayErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   889
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   890
	glyphMetricsArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   891
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   892
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   893
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   894
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   895
@SYMTestCaseID		GRAPHICS-FBSERV-0627
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   896
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   897
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   898
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   899
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   900
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   901
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   902
	Shows that reusing an RFbsGlyphMetricsArray works correctly.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   903
	In particular when the array is reused and filled with fewer entries
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   904
	and when the array is reused and filled with more entries than previously.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   905
	It also shows that when re-using an array that has been populated, memory 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   906
	is not de-allocated if the new array of glyphs is smaller.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   907
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   908
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   909
	i. Call RFbsGlyphMetricsArray::Get() for a set of 10 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   910
	ii. Check that the RFbsGlyphMetricsArray has 10 entries.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   911
	iii. Find the size of the heap-cell allocated to the array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   912
	iii. Call RFbsGlyphMetricsArray::Get() for a set of 5 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   913
	iv. Check that the RFbsGlyphMetricsArray has 5 entries.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   914
	v. Call RFbsGlyphMetricsArray::Get() for a set of 20 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   915
	vi. Check that the RFbsGlyphMetricsArray has 20 entries.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   916
	vii. Call RFbsGlyphMetricsArray::Get() for a set of 0 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   917
	viii. Check that the RFbsGlyphMetricsArray has 0 entries.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   918
	ix. Call RFbsGlyphMetricsArray::Get() for 1 glyph code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   919
	x. Check that the RFbsGlyphMetricsArray has 1 entries.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   920
	xi. Close the RFbsGlyphMetricsArray.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   921
	xii. Check that the RFbsGlyphMetricsArray has 0 entries.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   922
	During the test check that the size of the heap cell allocated to the array
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   923
	does not shrink.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   924
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   925
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   926
	After each call to RFbsGlyphMetricsArray::Get(), the array has the expected number of entries.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   927
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   928
void CTFbsGlyphData::TestGlyphMetricsArrayReuse()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   929
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   930
	INFO_PRINTF1(_L("Test reuse of array with RFbsGlyphMetricsArray"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   931
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   932
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   933
	RFbsGlyphMetricsArray glyphMetricsArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   934
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   935
	// Retrieve list of metrics for 10 glyph codes
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   936
	TESTNOERROR(glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, 10));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   937
	TEST(10 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   938
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   939
	// Find the size of the heap cell allocated for the array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   940
	TInt arrayHeapCellSize = User::Heap().AllocLen(&glyphMetricsArray[0]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   941
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   942
	// Retrieve list of metrics for 5 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   943
	// To ensure that different metrics are returned, use different glyph codes
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   944
	TESTNOERROR(glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[10], 5));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   945
	TEST(5 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   946
	// Check that memory has not been de-allocated for a smaller array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   947
	TEST(User::Heap().AllocLen(&glyphMetricsArray[0]) == arrayHeapCellSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   948
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   949
	// Retrieve list of metrics for 20 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   950
	// To ensure that different metrics are returned, use different glyph codes
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   951
	TESTNOERROR(glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[15], 20));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   952
	TEST(20 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   953
	arrayHeapCellSize = User::Heap().AllocLen(&glyphMetricsArray[0]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   954
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   955
	// Retrieve list of metrics for 0 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   956
	TEST(KErrArgument == glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[35], 0));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   957
	// We can't check whether memory has been de-allocated as glyphMetricsArray[0]
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   958
	// is null, therefore dereferencing it causes a panic.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   959
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   960
	// Retrieve list of metrics for 1 glyph code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   961
	// To ensure that different metrics are returned, use different glyph code
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   962
	TESTNOERROR(glyphMetricsArray.Get(*iFont, &iGlyphCodesLatin[35], 1));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   963
	TEST(1 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   964
	TEST(User::Heap().AllocLen(&glyphMetricsArray[0]) == arrayHeapCellSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   965
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   966
	// Test that after closing a non-empty array, the array has 0 size.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   967
	glyphMetricsArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   968
	TEST(0 == glyphMetricsArray.Count());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   969
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   970
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   971
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   972
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   973
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   974
@SYMTestCaseID		GRAPHICS-FBSERV-0628
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   975
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   976
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   977
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   978
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   979
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   980
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   981
	Validates the behaviour of RFbsGlyphDataIterator::Close() in the following use cases:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   982
		1. When called on an iterator instance which has not been opened, has no effect.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   983
		2. When called on an open iterator closes the iterator 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   984
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   985
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   986
	Use case 1:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   987
		i. Create an RFbsGlyphDataIterator instance but do not open.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   988
		ii. Call RFbsGlyphDataIterator::Close().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   989
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   990
	Use case 2:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   991
		i. Create an RFbsGlyphDataIterator instance and call RFbsGlyphDataIterator::Open().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   992
		ii. Call RFbsGlyphDataIterator::Next() to prove the iterator is open.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   993
		iii. Call RFbsGlyphDataIterator::Close().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   994
		iv. Check that RFbsGlyphDataIterator::IsOpen() returns false.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   995
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   996
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   997
	Each call to RFbsGlyphDataIterator::IsOpen() returns the expected value.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   998
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
   999
void CTFbsGlyphData::TestGlyphDataIteratorClose()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1000
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1001
	INFO_PRINTF1(_L("Test closing an RFbsGlyphDataIterator"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1002
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1003
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1004
	// Use case 1
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1005
	RFbsGlyphDataIterator iter1;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1006
	iter1.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1007
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1008
	// Use case 2
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1009
	RFbsGlyphDataIterator iter2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1010
	TESTNOERROR(iter2.Open(*iFont, iGlyphCodesLatin, 1));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1011
	TInt iterErr = iter2.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1012
	TESTE(KErrNotFound == iterErr, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1013
	iter2.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1014
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1015
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1016
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1017
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1018
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1019
@SYMTestCaseID		GRAPHICS-FBSERV-0629
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1020
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1021
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1022
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1023
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1024
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1025
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1026
	Show that the sequence of iterations when calling RFbsGlyphDataIterator::Next()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1027
	matches the order of the array of glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1028
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1029
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1030
	i. Create an RFbsGlyphDataIterator instance and call RFbsGlyphDataIterator::Open()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1031
		with an array of different glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1032
	ii. Iterate through all the glyph data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1033
		For each iteration check that the glyph code returned from 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1034
		RFbsGlyphDataIterator::GlyphCode() matches the corresponding glyph code
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1035
		passed into Open().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1036
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1037
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1038
	Each comparison of glyph code should match.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1039
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1040
void CTFbsGlyphData::TestGlyphDataIteratorSequence()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1041
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1042
	INFO_PRINTF1(_L("Test the iterator sequence of RFbsGlyphDataIterator"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1043
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1044
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1045
	TBool matches = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1046
	TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1047
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1048
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1049
	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1050
	TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1051
	for (; index < KNumGlyphCodesLatin && matches && (iterErr == KErrNone); iterErr = iter.Next(), index++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1052
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1053
		if (iter.GlyphCode() != iGlyphCodesLatin[index])
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1054
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1055
			ERR_PRINTF4(_L("Failed at iteration %d: wanted %d, got %d"), index, iGlyphCodesLatin[index], iter.GlyphCode());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1056
			matches = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1057
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1058
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1059
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1060
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1061
	TEST(matches);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1062
	TEST(index == KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1063
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1064
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1065
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1066
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1067
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1068
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1069
@SYMTestCaseID		GRAPHICS-FBSERV-0632
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1070
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1071
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1072
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1073
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1074
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1075
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1076
	Ensure it is possible to reuse a closed iterator on another CFbsFont.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1077
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1078
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1079
	i. Open an RFbsGlyphDataIterator with sample data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1080
	ii. Iterate through until the end of the iterator has been reached by calling 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1081
		Next() on the final element.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1082
	iii. Re-open the same RFbsGlyphDataIterator with sample data on a different CFbsFont.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1083
	iv. Iterate through a second time until the end has been reached by calling Next()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1084
		on the final element.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1085
	v. Close the iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1086
	vi. During both iterations the bitmap data returned and metrics are compared with
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1087
		the equivalent from GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1088
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1089
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1090
	The iterator should be opened successfully for both fonts and the data returned
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1091
	should match the data from GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1092
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1093
void CTFbsGlyphData::TestGlyphDataIteratorMultipleUsesOnMultipleFonts()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1094
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1095
	INFO_PRINTF1(_L("Reuse a closed iterator on a second CFbsFont"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1096
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1097
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1098
	const TUint8* bitmapData;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1099
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1100
	TOpenFontCharMetrics charMetrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1101
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1102
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1103
	// Array of fonts to iterate through.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1104
	CFbsFont* font[2] = {iFont, iFont2};
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1105
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1106
	for (TInt fontId = 0; fontId < 2; fontId++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1107
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1108
		// On the first iteration, open and use a font until all glyphs have been iterated through.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1109
		// On second iteration, use the same iterator on a different font and repeat.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1110
        CFbsFont* currentFont = font[fontId];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1111
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1112
		//Open the iterator on the first font and compare the returned bitmaps against GetCharacterData
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1113
		TInt iterErr = iter.Open(*currentFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1114
		TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1115
		TFontSpec fontSpec = currentFont->FontSpecInTwips();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1116
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1117
		TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1118
		for (; (iterErr == KErrNone) && (index < KNumGlyphCodesLatin); iterErr = iter.Next(), ++index)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1119
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1120
			currentFont->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1121
			
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1122
			TESTNOERROR(CompareMetrics(charMetrics, iter.Metrics()));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1123
			if (bitmapSize == TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1124
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1125
				TEST(bitmapSize == iter.Rect().Size());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1126
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1127
			else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1128
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1129
				// Compare images.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1130
				TBool match = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1131
				RSgImage characterDataImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1132
				TInt err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1133
				if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1134
					{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1135
					err = CompareSgImages(iEGL, iter.Image(), iter.Rect(), characterDataImage, TRect(bitmapSize), match);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1136
					}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1137
				characterDataImage.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1138
				if (err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1139
					{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1140
					TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1141
					break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1142
					}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1143
				TEST(match);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1144
				}		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1145
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1146
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1147
		TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1148
		TEST(index == KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1149
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1150
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1151
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1152
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1153
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1154
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1155
@SYMTestCaseID		GRAPHICS-FBSERV-0633
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1156
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1157
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1158
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1159
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1160
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1161
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1162
	Check that for various Latin fonts, the images of the glyphs stored on the 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1163
	RSgImage matches those provided by GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1164
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1165
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1166
	Create a selection of fonts, using various typefaces, sizes and bitmap types.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1167
	For each font:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1168
	i. Open the RFbsGlyphDataIterator and iterate each glyph.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1169
	ii. For each glyph, call GetCharacterData() with the expected glyph code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1170
	iii. Convert the character data to an RSgImage.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1171
	iv. Perform a comparison between the character RSgImage and the iterator 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1172
		image. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1173
	v. After all iterations, close the iterator and check all expected glyphs
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1174
		were iterated through.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1175
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1176
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1177
	All glyph images should match.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1178
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1179
void CTFbsGlyphData::TestGlyphDataIteratorImageValidity()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1180
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1181
	INFO_PRINTF1(_L("Test the glyph images of the iterator match GetCharacterData()"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1182
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1183
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1184
	const TInt KNumFonts = 20;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1185
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1186
	// Create a new typeface store for this test so that heap checking will not
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1187
	// be affected by cached CFbsFonts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1188
	CFbsTypefaceStore* typefaceStore = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1189
	TRAPD(err, typefaceStore = CFbsTypefaceStore::NewL(NULL));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1190
	if (err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1191
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1192
		ERR_PRINTF1(_L("Failed to construct typeface store. Test aborted."));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1193
		__UHEAP_RESET;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1194
		iStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1195
		return;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1196
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1197
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1198
	for (TInt font = 0; font < KNumFonts; ++font)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1199
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1200
		// Use either a pre-created bitmap-font TFontSpec, or generate a Deja-vu one.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1201
		TFontSpec fontSpec = GenerateDejaVuFontSpec(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1202
		CFbsFont* latinFont = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1203
		TESTNOERROR(typefaceStore->GetNearestFontToDesignHeightInPixels((CFont*&)latinFont, fontSpec));	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1204
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1205
		fontSpec = latinFont->FontSpecInTwips();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1206
		InfoPrintFontSpec(*latinFont);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1207
				
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1208
		RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1209
		TInt iterErr = iter.Open(*latinFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1210
		TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1211
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1212
		err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1213
		TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1214
		TInt numMismatches = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1215
		// For each iteration, get the character data of the expected glyph.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1216
		// Create RSgImage from character data, and compare iter image with constructed image.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1217
		for (; (iterErr == KErrNone) && (err == KErrNone) && (index < KNumGlyphCodesLatin); (iterErr = iter.Next()), ++index)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1218
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1219
			TBool glyphMatches = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1220
			const RSgImage& iteratorImage = iter.Image();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1221
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1222
			const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1223
			TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1224
			TOpenFontCharMetrics metrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1225
			TInt characterDataAvailability = latinFont->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1226
			if (bitmapSize == TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1227
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1228
				glyphMatches = (bitmapSize == iter.Rect().Size());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1229
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1230
			else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1231
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1232
				RSgImage characterDataImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1233
				TESTNOERROR(CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1234
				err = CompareSgImages(iEGL, iteratorImage, iter.Rect(), characterDataImage, TRect(bitmapSize), glyphMatches);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1235
				characterDataImage.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1236
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1237
			if (err == KErrNone && !glyphMatches)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1238
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1239
				ERR_PRINTF2(_L("Glyphcode %i : Image mismatch"), iGlyphCodesLatin[index]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1240
				++numMismatches;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1241
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1242
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1243
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1244
		TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1245
		TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1246
		TEST(index == KNumGlyphCodesLatin);	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1247
		TEST(numMismatches == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1248
		typefaceStore->ReleaseFont(latinFont);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1249
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1250
	delete typefaceStore;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1251
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1252
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1253
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1254
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1255
@SYMTestCaseID      GRAPHICS-FBSERV-0634
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1256
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1257
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1258
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1259
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1260
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1261
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1262
	To ensure that if the glyph image iterator has a current invalid 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1263
	character code, the SgImage returned by the iterator will match 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1264
	to the image obtained from the GetCharacterData() function
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1265
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1266
	i. Retrieve bitmap data and metrics by using GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1267
	ii. Open a glyph data iterator passing an invalid character code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1268
	iii. If i. was unsuccessful, check that opening the iterator returned
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1269
		an error code and skip to ix.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1270
	iv. Create SgImage from bitmap data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1271
	v. Get SgImage from the glyph data iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1272
	vi. Compare SgImages obtained on iv and v steps.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1273
	vii. Get font metrics from the glyph data iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1274
	viii. Compare metrics obtained on i and vii steps.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1275
	vii. Close the iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1276
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1277
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1278
	If the request to get the character data failed, the return value of 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1279
	RFbsGlyphDataIterator::Open() must not be KErrNone.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1280
	Otherwise, images obtained from the iterator and GetCharacterData() should
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1281
	match.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1282
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1283
void CTFbsGlyphData::TestGlyphDataIteratorOpenInvalidCode()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1284
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1285
	INFO_PRINTF1(_L("Ensure that the image returned by the iterator will \
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1286
match to the image obtained from GetCharacterData() if character code is invalid"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1287
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1288
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1289
	const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1290
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1291
	TOpenFontCharMetrics metrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1292
	const TFontSpec fontSpec = iFont->FontSpecInTwips();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1293
	CFont::TCharacterDataAvailability availability = iFont->GetCharacterData(KDejaVuInvalidGlyphCode | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1294
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1295
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1296
	TInt err = iter.Open(*iFont, &KDejaVuInvalidGlyphCode, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1297
	if (availability == CFont::ENoCharacterData)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1298
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1299
		// Some rasterizers fail to return any data for KDejaVuInvalidGlyphCode, therefore
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1300
		// rather than compare image contents, make sure RFbsGlyphDataIterator returns an error code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1301
		WARN_PRINTF1(_L("Rasterizer failed to return data for invalid glyph code; not comparing image contents"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1302
		TESTE(err != KErrNone, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1303
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1304
	else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1305
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1306
		TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1307
		if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1308
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1309
			TBool glyphMatches = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1310
			if (bitmapSize == TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1311
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1312
				glyphMatches = (bitmapSize == iter.Rect().Size());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1313
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1314
			else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1315
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1316
				RSgImage characterDataImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1317
				TESTNOERROR(CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1318
				TESTNOERROR(CompareSgImages(iEGL, iter.Image(), iter.Rect(), characterDataImage, TRect(bitmapSize), glyphMatches));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1319
				characterDataImage.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1320
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1321
			TESTNOERROR(CompareMetrics(metrics, iter.Metrics()));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1322
			TEST(glyphMatches);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1323
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1324
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1325
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1326
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1327
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1328
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1329
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1330
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1331
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1332
@SYMTestCaseID      GRAPHICS-FBSERV-0636
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1333
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1334
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1335
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1336
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1337
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1338
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1339
	To ensure that opening the glyph data iterator which has already been opened with the same font
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1340
	has no effect on the state of the iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1341
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1342
	i. Open glyph data iterator on 2 glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1343
	ii. Try to open the glyph data iterator again on the same font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1344
	iii. Call RFbsGlyphDataIterator::Next() on the iterator and check error code, making the last
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1345
		glyph code the current iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1346
	iv. Call RFbsGlyphDataIterator::Next() again.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1347
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1348
	The second attempt to open the glyph data iterator will result an error with code KErrInUse.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1349
	The last two calls to RFbsGlyphDataIterator::Next() should return KErrNone and KErrNotFound
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1350
	respectively, showing the iterator was not modified when the call to Open() failed.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1351
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1352
void CTFbsGlyphData::TestGlyphDataIteratorOpenTwice()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1353
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1354
	INFO_PRINTF1(_L("Ensure that opening the glyph data iterator which has already been opened with the same font has no effect"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1355
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1356
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1357
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1358
	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, 2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1359
	TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1360
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1361
	iterErr = iter.Open(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1362
	TESTE(iterErr == KErrInUse, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1363
	iterErr = iter.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1364
	TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1365
	iterErr = iter.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1366
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1367
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1368
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1369
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1370
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1371
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1372
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1373
@SYMTestCaseID      GRAPHICS-FBSERV-0637
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1374
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1375
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1376
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1377
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1378
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1379
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1380
	To ensure that opening the glyph data iterator which has already been opened with different font
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1381
	has no effect on the state of the iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1382
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1383
	i. Open glyph data iterator on an 2 glyph codes
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1384
	ii. Try to open the glyph data iterator again with a different font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1385
	iii. Call RFbsGlyphDataIterator::Next() on the iterator and check error code, making the last
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1386
		glyph code the current iteration.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1387
	iv. Call RFbsGlyphDataIterator::Next() again.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1388
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1389
	The second attempt to open the glyph data iterator will result an error with code KErrInUse.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1390
	The Next() call after this should return KErrNone, signifying the iterator is still open.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1391
	The last Next() call should return KErrNotFound, signifying the iterator has iterated 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1392
	through the two original glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1393
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1394
void CTFbsGlyphData::TestGlyphDataIteratorOpenTwiceWithDifferentFonts()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1395
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1396
	INFO_PRINTF1(_L("Ensure that opening the glyph data iterator which has already been opened with different font has no effect"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1397
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1398
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1399
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1400
	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, 2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1401
	TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1402
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1403
	iterErr = iter.Open(*iFont2, iGlyphCodesLatin, 2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1404
	TESTE(iterErr == KErrInUse, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1405
	iterErr = iter.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1406
	TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1407
	iterErr = iter.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1408
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1409
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1410
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1411
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1412
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1413
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1414
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1415
@SYMTestCaseID      GRAPHICS-FBSERV-0638
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1416
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1417
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1418
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1419
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1420
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1421
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1422
	To ensure that opening of glyph data iterator with the font greater than 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1423
	2048 by 2048 will not be supported 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1424
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1425
	i. Create font with the height greater than 2048
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1426
	ii. Try to open the glyph data iterator with the font created on previous step
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1427
	iii Release the font
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1428
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1429
	Must fail with error code KErrTooBig
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1430
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1431
void CTFbsGlyphData::TestGlyphDataIteratorOpenTooBigFont()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1432
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1433
	INFO_PRINTF1(_L("To ensure that opening of glyph data iterator with the font greater than 2048X2048 will not be supported"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1434
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1435
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1436
	CFbsFont* bigFont;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1437
	const TInt maxHeight = 2048;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1438
	const TInt maxHeightLimit = maxHeight + 20; //max size after we stop trying to create the font
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1439
	// the loop below will guarantee that if the font with the size greater than 2048 is available it will be created
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1440
	for(TInt height = maxHeight + 1; height < maxHeightLimit; height++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1441
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1442
		TESTNOERROR(iTs->GetNearestFontToDesignHeightInPixels((CFont*&)bigFont, TFontSpec(KTypefaceName, height)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1443
		TInt realHeight = bigFont->FontMaxHeight();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1444
		if(realHeight > maxHeight)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1445
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1446
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1447
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1448
		iTs->ReleaseFont(bigFont);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1449
		bigFont = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1450
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1451
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1452
	if (bigFont)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1453
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1454
		RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1455
		TInt iterErr = iter.Open(*bigFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1456
		TESTE(iterErr == KErrTooBig, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1457
		iTs->ReleaseFont(bigFont); 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1458
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1459
	else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1460
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1461
		//It is legitimate to fail to create the font, as there are no requirements for the rasterizer here to support such big font. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1462
		//In this case we will skip the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1463
		WARN_PRINTF1(_L("Failed to create font with height greater than 2048"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1464
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1465
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1466
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1467
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1468
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1469
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1470
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1471
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1472
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1473
@SYMTestCaseID      GRAPHICS-FBSERV-0640
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1474
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1475
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1476
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1477
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1478
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1479
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1480
	To ensure that the glyph data iterator processes wrong arguments correctly
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1481
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1482
	i. Try to open the glyph data iterator with the negative count passed in
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1483
	ii. Try to open the glyph data iterator with the positive count and NULL 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1484
	glyph code array pointer passed in
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1485
	iii. Try to open the glyph data iterator with a valid glyph code array and 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1486
	count equal to zero
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1487
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1488
	At all steps the returned value is set to KErrArgument.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1489
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1490
void CTFbsGlyphData::TestGlyphDataIteratorOpenWithWrongArgument()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1491
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1492
	INFO_PRINTF1(_L("To ensure that the glyph data iterator processes wrong arguments correctly"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1493
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1494
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1495
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1496
	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, -1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1497
	TESTE(iterErr == KErrArgument, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1498
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1499
	iterErr = iter.Open(*iFont, NULL, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1500
	TESTE(iterErr == KErrArgument, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1501
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1502
	iterErr = iter.Open(*iFont, iGlyphCodesLatin, 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1503
	TESTE(iterErr == KErrArgument, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1504
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1505
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1506
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1507
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1508
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1509
@SYMTestCaseID      GRAPHICS-FBSERV-0641
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1510
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1511
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1512
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1513
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1514
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1515
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1516
	To ensure that all allocated RSgImages were released after the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1517
	glyph data iterator has been opened and closed multiple times.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1518
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1519
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1520
	i. Retrieve MSgDriver_Test interface from the SgDriver
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1521
	ii. Mark alloc start and obtain resorce count from the interface
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1522
	iii. Iterate through glyph data by calling RFbsGlyphDataIterator::Next() 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1523
	iv. Retrieve SgImage from the glyph data iterator instance
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1524
	v. Repeate steps iii and iv multiple times
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1525
	vi. Release font
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1526
	vii.  Mark alloc end and obtain resorce count from the interface
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1527
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1528
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1529
	Resorce count at the end matches resorce count at the beginning. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1530
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1531
void CTFbsGlyphData::TestGlyphDataIteratorImageMemoryLeak()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1532
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1533
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1534
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1535
	MSgDriver_Test* sgDriverTestInterface = NULL; 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1536
	TInt err = iSgDriver.GetInterface(sgDriverTestInterface);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1537
	if(err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1538
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1539
		__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1540
		WARN_PRINTF2(_L("Failed to obtain MSgDriver_Test interface with error code: %d, the test will be skipped"), err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1541
		return;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1542
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1543
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1544
	TEST(sgDriverTestInterface != NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1545
	sgDriverTestInterface->AllocMarkStart();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1546
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1547
	MSgDriver_Profiling* sgDriverProfilInterface = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1548
	err = iSgDriver.GetInterface(sgDriverProfilInterface);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1549
	if(err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1550
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1551
		sgDriverTestInterface->AllocMarkEnd(0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1552
		__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1553
		WARN_PRINTF2(_L("Failed to obtain MSgDriver_Profiling interface with error code: %d, the test will be skipped"), err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1554
		return;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1555
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1556
	const TInt resCount = sgDriverProfilInterface->LocalResourceCount();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1557
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1558
	CFbsFont* font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1559
	err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KTypefaceName, 15));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1560
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1561
	if(err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1562
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1563
		__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1564
		return;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1565
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1566
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1567
	for (TInt ii = 0; ii < 10; ii++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1568
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1569
		TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1570
		RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1571
		TInt iterErr = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1572
		TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1573
		for (; (iterErr == KErrNone) && (index < KNumGlyphCodesLatin); iterErr = iter.Next(), ++index)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1574
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1575
			const RSgImage& image = iter.Image();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1576
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1577
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1578
		TEST(index == KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1579
		TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1580
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1581
	iTs->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1582
	const TInt resCountEnd = sgDriverProfilInterface->LocalResourceCount();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1583
	TEST(resCountEnd == resCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1584
	sgDriverTestInterface->AllocMarkEnd(0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1585
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1586
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1587
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1588
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1589
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1590
@SYMTestCaseID      GRAPHICS-FBSERV-0659
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1591
@SYMTestPriority    Med
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1592
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1593
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1594
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1595
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1596
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1597
	Uses the RFbsGlyphDataIterator to render a large amount of unique glyphs, at a very large 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1598
	size, to ensure that if graphics memory runs out while the iterator is in use, eviction 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1599
	takes place and does not corrupt the glyph images in any way.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1600
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1601
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1602
	i. Create a large CFbsFont from the typeface store (size 100+)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1603
	ii. Simulate a low graphics-memory situation by creating enough RSgImages to fill the memory,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1604
		releasing one image in order to allow some small amount for the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1605
	iii. Open a RFbsGlyphDataIterator on the font, using a large array of unique glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1606
	iv. Iterate through the glyphs, comparing each returned SgImage against the system-memory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1607
		representation of the glyph as returned by CFont::GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1608
	v. Check for errors and mismatches, and release all images created by ii.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1609
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1610
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1611
	At each iteration, each glyph should match in size and contents. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1612
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1613
void CTFbsGlyphData::TestGlyphDataIteratorLargeFontStress()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1614
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1615
	INFO_PRINTF1(_L("Stress test using a RFbsGlyphDataIterator with a large font"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1616
#ifdef __WINS__
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1617
	// Cannot run test on emulator reliably - this is because on emulator
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1618
	// system-memory is used for RSgImages, so using up RSgImage memory may 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1619
	// cause heap-allocation failures unrelated to the area being tested. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1620
	// This test is specifically testing the behaviour when running out of
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1621
	// RSgImage-based memory (i.e. graphics memory), but on emulator this 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1622
	// will cause a failed allocation anywhere.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1623
	INFO_PRINTF1(_L("Skipping test on emulator..."));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1624
#else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1625
	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1626
	TEST(EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1627
/*	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1628
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1629
	const TInt KFontSize = 128;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1630
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1631
	CFbsFont* font;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1632
	TInt err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KMonoTypefaceName, KFontSize));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1633
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1634
	// Output the actual fontspec used in the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1635
	InfoPrintFontSpec(*font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1636
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1637
	// Create 2 buffers for use in comparing SgImages so that we don't run out 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1638
	// of system memory through allocating memory in the test
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1639
	TInt maxFontWidth = font->MaxCharWidthInPixels();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1640
	TInt maxFontHeight = font->HeightInPixels();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1641
	iTempBuf1 = (TUint8*) User::AllocZ(maxFontWidth * maxFontHeight);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1642
	iTempBuf2 = (TUint8*) User::AllocZ(maxFontWidth * maxFontHeight);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1643
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1644
	// In order for the image comparisons to have enough memory to perform, keep 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1645
	// one large RSgImage which is created before the rest of the graphics memory 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1646
	// is filled.  This image can then be closed before doing the image comparison 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1647
	// and recreated after the image comparison to ensure that the graphics 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1648
	// memory is full.  Without this image, the image comparison could fail with 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1649
	// out of memory and the test would fail. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1650
	RSgImage tempImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1651
	TESTNOERROR(tempImage.Create(TSgImageInfo(TSize(1000, 1000), ESgPixelFormatA_8, ESgUsageBitOpenVgImage)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1652
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1653
	TFontSpec actualFontSpec;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1654
	actualFontSpec = font->FontSpecInTwips();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1655
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1656
	// Create RSgImages from character data independently from using iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1657
	// These will be used for comparing with RSgImages retrieved from iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1658
	RArray <RSgImage> sgImageFromCharDataArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1659
	TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1660
	for(; (index < KNumGlyphCodesLatin) && (err == KErrNone); ++index)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1661
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1662
		RSgImage characterDataSgImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1663
		TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1664
		const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1665
		TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1666
		TOpenFontCharMetrics metrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1667
		font->GetCharacterData(iGlyphCodesLatin[index] | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1668
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1669
		if (bitmapSize != TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1670
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1671
			err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, actualFontSpec.iFontStyle.BitmapType(), characterDataSgImage, iTempBuf1, iTempBuf2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1672
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1673
		if (KErrNone == err)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1674
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1675
			err = sgImageFromCharDataArray.Append(characterDataSgImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1676
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1677
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1678
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1679
	TEST(index == KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1680
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1681
	// Simulate low OOGM situation by creating many RSgImages until out of memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1682
	RArray <RSgImage> sgImageArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1683
	if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1684
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1685
		TESTNOERROR(NearlyFillGraphicsMemoryWithImages(TSize(256, 256), sgImageArray));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1686
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1687
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1688
	// Open Iterator on long string of data...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1689
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1690
	TInt iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1691
	if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1692
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1693
		iterErr = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1694
		TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1695
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1696
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1697
	// For each glyph, compare it to the system-memory version from GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1698
	TInt numMismatches = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1699
	for(index = 0; (iterErr == KErrNone) && (index < sgImageFromCharDataArray.Count()) && (err == KErrNone); iterErr = iter.Next(), ++index)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1700
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1701
		const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1702
		TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1703
		TOpenFontCharMetrics metrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1704
		font->GetCharacterData(iter.GlyphCode() | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1705
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1706
		if (iter.Rect().Size() == TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1707
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1708
			numMismatches += (bitmapSize != TSize(0, 0)) ? 1 : 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1709
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1710
		else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1711
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1712
			// Free up memory so that the image compariso succeeds
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1713
			// Release all the images used to simulate OOGM.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1714
			for (TInt i = sgImageArray.Count() - 1; i >= 0; --i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1715
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1716
				sgImageArray[i].Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1717
				sgImageArray.Remove(i);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1718
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1719
			
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1720
			TBool match = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1721
			err = CompareSgImages(iEGL, sgImageFromCharDataArray[index], TRect(bitmapSize), iTempBuf1, iter.Image(), iter.Rect(), iTempBuf2, match);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1722
			if (err == KErrNone && !match)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1723
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1724
				++numMismatches;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1725
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1726
			TInt result = FillGraphicsMemoryWithImages(TSize(256, 256), sgImageArray);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1727
			TESTE(result == KErrNoMemory || result == KErrNoGraphicsMemory, result);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1728
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1729
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1730
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1731
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1732
	// Release all images created from character data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1733
	for (TInt i = sgImageFromCharDataArray.Count()-1; i >= 0; --i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1734
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1735
		sgImageFromCharDataArray[i].Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1736
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1737
	sgImageFromCharDataArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1738
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1739
	// Release all the images used to simulate OOGM.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1740
	for (TInt i = sgImageArray.Count() - 1; i >= 0; --i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1741
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1742
		sgImageArray[i].Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1743
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1744
	sgImageArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1745
	tempImage.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1746
	iTs->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1747
	User::Free(iTempBuf1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1748
	User::Free(iTempBuf2);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1749
	iTempBuf1 = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1750
	iTempBuf2 = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1751
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1752
	// Log any errors only after memory is freed - this ensures there is enough
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1753
	// memory for the logger.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1754
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1755
	TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1756
	TEST(index == KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1757
	TEST(numMismatches == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1758
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1759
	__UHEAP_MARKEND;*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1760
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1761
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1762
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1763
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1764
@SYMTestCaseID      GRAPHICS-FBSERV-0660
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1765
@SYMTestPriority    Med
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1766
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1767
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1768
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1769
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1770
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1771
	Opens an RFbsGlyphDataIterator on many different fonts of different sizes and typefaces
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1772
	and uses many fonts, in order to test that the iterator can cope with being used on many
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1773
	fonts with many glyphs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1774
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1775
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1776
	i. Perform test of 100 iterations, where:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1777
		1. A new Latin font is created every iteration in order to force the Typeface Store
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1778
			to create a brand-new server-side font at each iteration. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1779
		2. For this font, open an RFbsGlyphDataIterator and cycle through all Latin glyphs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1780
		3. For each glyph, compare against the glyph image returned by CFont::GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1781
		4. Keep a record of the number of mismatches, and carry on to next font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1782
	ii. Perform i. again, but using the existing fonts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1783
	iii. Check that there are no mismatches, all glyphs and fonts were successfully checked, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1784
		and no error codes returned during the test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1785
	iv. Clean up all resources.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1786
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1787
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1788
	The glyphs provided by the iterator should match that returned by GetCharacterData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1789
	for every font and every iteration. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1790
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1791
void CTFbsGlyphData::TestGlyphDataIteratorManyFontsStressL()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1792
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1793
	INFO_PRINTF1(_L("Stress test using a RFbsGlyphDataIterator with hundreds of fonts"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1794
	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1795
	TEST(EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1796
	/*__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1797
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1798
	const TInt KNumFonts = 100;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1799
	const TInt KNumRepeatsPerFont = 2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1800
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1801
	TInt numGlyphMismatches = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1802
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1803
	CFbsFont** font = new (ELeave) CFbsFont*[KNumFonts];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1804
	Mem::FillZ(font, sizeof(CFbsFont*) * KNumFonts);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1805
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1806
	// Do the whole thing KNumRepeatsPerFont times. The second+ repeats will 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1807
	// re-use the fonts created in the first repeat, to ensure that fonts that 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1808
	// may have been evicted are able to be re-used with the iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1809
	for (TInt rep = 0; (rep < KNumRepeatsPerFont) && (err == KErrNone); ++rep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1810
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1811
		// Iterate through all the font variants:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1812
		// Iterate all font styles, for all latin typefaces, at increasing sizes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1813
		TInt i = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1814
		for (; (i < KNumFonts) && (err == KErrNone); ++i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1815
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1816
			// Only create this font if this font isn't already valid (i.e. when this is the 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1817
			// first rep) otherwise re-use it.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1818
			if (!font[i])
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1819
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1820
				TFontSpec requestedFontSpec = GenerateDejaVuFontSpec(i);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1821
				err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font[i], requestedFontSpec);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1822
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1823
			if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1824
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1825
				RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1826
				TInt iterErr = iter.Open(*(font[i]), iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1827
				if (iterErr != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1828
					{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1829
					ERR_PRINTF2(_L("Failed to open RFbsGlyphDataIterator [err=%d]"), iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1830
					InfoPrintFontSpec(*(font[i]));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1831
					iStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1832
					}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1833
				else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1834
					{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1835
					TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1836
					for(; (iterErr == KErrNone) && (index < KNumGlyphCodesLatin) && (err == KErrNone) ; iterErr = iter.Next(), index++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1837
						{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1838
						const TUint8* bitmapData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1839
						TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1840
						TOpenFontCharMetrics metrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1841
						font[i]->GetCharacterData(iter.GlyphCode() | KGlyphCodeFlag, metrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1842
						if (iter.Rect().Size() == TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1843
							{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1844
							numGlyphMismatches += (bitmapSize != TSize(0, 0)) ? 1 : 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1845
							}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1846
						else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1847
							{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1848
							TBool match = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1849
							const TFontSpec fontSpec = font[i]->FontSpecInTwips();							
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1850
							// Compare to system-memory version of glyph
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1851
							RSgImage characterDataImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1852
							err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, fontSpec.iFontStyle.BitmapType(), characterDataImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1853
							if (err == KErrNone) 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1854
								{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1855
								err = CompareSgImages(iEGL, iter.Image(), iter.Rect(), characterDataImage, TRect(bitmapSize), match);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1856
								}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1857
							if (err == KErrNone && !match)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1858
								{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1859
								++numGlyphMismatches;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1860
								}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1861
							characterDataImage.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1862
							}					
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1863
						}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1864
					iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1865
					TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1866
					TEST(index == KNumGlyphCodesLatin);					
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1867
					}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1868
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1869
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1870
		// Check all the fonts were iterated through.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1871
		TEST(i == KNumFonts);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1872
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1873
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1874
	TEST(numGlyphMismatches == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1875
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1876
	// Cleanup
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1877
	for (TInt ii = 0; ii < KNumFonts; ii++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1878
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1879
		iTs->ReleaseFont(font[ii]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1880
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1881
	delete [] font;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1882
	__UHEAP_MARKEND;*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1883
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1884
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1885
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1886
@SYMTestCaseID      GRAPHICS-FBSERV-0662
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1887
@SYMTestPriority    Low
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1888
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1889
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1890
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1891
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1892
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1893
	Uses a RFbsGlyphDataIterator when there is no graphics memory available in the system.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1894
	It shows that when under low graphics memory, Next() returns the correct error code
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1895
	as per the API (either KErrNoMemory or KErrNoGraphicsMemory, depending on the implementation 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1896
	of Graphics Resource being used).
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1897
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1898
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1899
	i. Create a CFbsFont from the typeface store.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1900
	ii. Simulate a low graphics-memory situation by creating enough RSgImages to fill the memory,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1901
	iii. Open a RFbsGlyphDataIterator on the font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1902
	iv. Attempt to use the iterator, calling Next(), checking the returned code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1903
	v. Close the iterator and release all graphics memory from ii.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1904
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1905
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1906
	Next() should return either KErrNoMemory or KErrNoGraphicsMemory depending on the implmentation
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1907
	of Graphics Resource used. It should return the same error as is returned when filling
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1908
	the graphics memory reaches the limit.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1909
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1910
void CTFbsGlyphData::TestGlyphDataIteratorNoGraphicsMemory()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1911
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1912
	INFO_PRINTF1(_L("Test that when there is no GPU memory available, Next() returns correct error"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1913
	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85LDV7 - TB10.1 Closing of RSgImage with duplicate handle used in same thread does not release GPU RAM"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1914
	TEST(EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1915
	/*__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1916
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1917
	const TInt KFontSize = 128;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1918
	CFbsFont* font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1919
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1920
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1921
	TInt err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)font, TFontSpec(KMonoTypefaceName, KFontSize));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1922
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1923
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1924
	// Simulate low OOGM situation by creating many RSgImages until out of memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1925
	if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1926
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1927
		InfoPrintFontSpec(*font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1928
		RArray <RSgImage> sgImageArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1929
		TInt iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1930
		TInt gfxMemErr = FillGraphicsMemoryWithImages(TSize(KFontSize, KFontSize), sgImageArray);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1931
		TESTE(gfxMemErr == KErrNoMemory || gfxMemErr == KErrNoGraphicsMemory, gfxMemErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1932
		if (gfxMemErr == KErrNoMemory || gfxMemErr == KErrNoGraphicsMemory)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1933
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1934
			// Next() could either fail with KErrNoMemory or KErrNoGraphicsMemory, but should
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1935
			// be the same error code as the last attempted creation of an SgImage, done in 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1936
			// FillGraphicsMemoryWithImages() so compare against that code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1937
			iterErr = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1938
			for (; iterErr == KErrNone; iterErr = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1939
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1940
				// no operation
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1941
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1942
			iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1943
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1944
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1945
		// Release all the images used to simulate OOGM.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1946
		for (TInt i = sgImageArray.Count() - 1; i >= 0; --i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1947
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1948
			sgImageArray[i].Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1949
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1950
		sgImageArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1951
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1952
		// Log any errors only after memory is freed - this ensures there is enough
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1953
		// memory for the logger.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1954
		TESTE(iterErr == gfxMemErr, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1955
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1956
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1957
	iTs->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1958
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1959
	__UHEAP_MARKEND;*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1960
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1961
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1962
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1963
@SYMTestCaseID      GRAPHICS-FBSERV-0666
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1964
@SYMTestPriority    Low
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1965
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1966
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1967
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1968
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1969
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1970
	Uses a RFbsGlyphDataIterator after Next() returns an error, in order to show that 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1971
	an error does not invalidate the state of the iterator and it is still usable. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1972
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1973
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1974
	i. Open the RFbsGlyphDataIterator on 1 glyph code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1975
	ii. Store the data of the iterator and call Next() to reach the end of the iterator
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1976
	iii. Access the glyph data repeatedly and check that the iterator members
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1977
		 still match those in ii.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1978
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1979
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1980
	The calls to Next() should cause KErrNotFound since it is past the final glyph.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1981
	The iterator data should match at all times since the iterator is never moved.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1982
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1983
void CTFbsGlyphData::TestGlyphDataIteratorNextIsAtomic()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1984
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1985
	INFO_PRINTF1(_L("To ensure that Next() is atomic, if it returns an error it is still useable"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1986
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1987
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1988
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1989
	TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1990
	TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1991
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1992
	TSgDrawableId id = iter.Image().Id();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1993
	TOpenFontCharMetrics metrics = iter.Metrics();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1994
	TUint glyphCode = iter.GlyphCode();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1995
	TRect rect = iter.Rect();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1996
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1997
	for (TInt i = 0; i < 2; i++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1998
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  1999
		iterErr = iter.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2000
		TESTE(iterErr == KErrNotFound, iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2001
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2002
		TEST(id == iter.Image().Id());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2003
		TEST(glyphCode == iter.GlyphCode());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2004
		TEST(rect == iter.Rect());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2005
		TEST(CompareMetrics(metrics, iter.Metrics()) == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2006
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2007
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2008
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2009
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2010
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2011
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2012
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2013
@SYMTestCaseID      GRAPHICS-FBSERV-0665
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2014
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2015
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2016
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2017
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2018
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2019
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2020
	Glyph Atlas white-box test.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2021
	To ensure that the same RSgImage is used for repeated requests for the 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2022
	same glyph in the same call to RFbsGlyphDataIterator:Open().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2023
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2024
	i Open the glyph data iterator with a list of glyph codes which are all the same
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2025
	ii Retrieve the drawable id of each iteration 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2026
	iii Check that the same drawable id is retrieved in each iteration  
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2027
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2028
	Each iteration returns the same drawable id. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2029
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2030
void CTFbsGlyphData::TestGlyphDataIteratorSameGlyphCodes()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2031
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2032
	INFO_PRINTF1(_L("White box test - Ensure that the same RSgImage is used for repeated requests for the same glyph in the same call to Open()"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2033
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2034
136
62bb7c97884c 201030_2
hgs
parents: 121
diff changeset
  2035
	const TUint KSameRepeatedGlyphCode = iGlyphCodesLatin['A' - 0x20];
121
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2036
	const TInt KNumGlyphs = 10;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2037
	TUint* sameRepeatedGlyphCodes = new TUint[KNumGlyphs];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2038
	for (TInt ii = 0; ii < KNumGlyphs; ++ii)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2039
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2040
		sameRepeatedGlyphCodes[ii] = KSameRepeatedGlyphCode;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2041
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2042
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2043
	TInt err = iter.Open(*iFont, sameRepeatedGlyphCodes, KNumGlyphs);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2044
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2045
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2046
	if (KErrNone == err)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2047
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2048
		// get the drawable id of the first glyph and check that the id is valid
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2049
		TSgDrawableId referenceId = iter.Image().Id();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2050
		RSgImage image;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2051
		TESTNOERROR(image.Open(referenceId));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2052
		image.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2053
		TESTNOERROR(iter.Next());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2054
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2055
		for (;KErrNone == err; err = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2056
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2057
			TEST(referenceId == iter.Image().Id());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2058
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2059
		TESTE(KErrNotFound == err, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2060
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2061
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2062
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2063
	delete[] sameRepeatedGlyphCodes;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2064
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2065
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2066
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2067
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2068
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2069
@SYMTestCaseID      GRAPHICS-FBSERV-0668
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2070
@SYMTestPriority    High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2071
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2072
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2073
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2074
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2075
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2076
	To ensure that the iterator can successfully be opened on an array
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2077
	of glyph codes of various array sizes. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2078
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2079
	Perform many iterations of opening an array and cycling through the glyphs,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2080
	increasing the size of the array after each iteration. Some simple sanity-checking
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2081
	of the glyphs is performed.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2082
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2083
	KErrNone should be returned at all times. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2084
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2085
void CTFbsGlyphData::TestGlyphDataIteratorManyArraySizes()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2086
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2087
	INFO_PRINTF1(_L("Ensure that the RFbsGlyphDataIterator successfully opens glyph code arrays of many sizes"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2088
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2089
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2090
	RFbsGlyphMetricsArray glyphMetricsArray;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2091
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2092
	TESTNOERROR(glyphMetricsArray.Get(*iFont, iGlyphCodesLatin, KNumGlyphCodesLatin));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2093
	TInt iterErr = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2094
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2095
	for (TInt arraySize = 1; (arraySize < KNumGlyphCodesLatin) && (iterErr == KErrNone); ++arraySize)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2096
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2097
		RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2098
		TInt iterErr = iter.Open(*iFont, iGlyphCodesLatin, arraySize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2099
		TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2100
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2101
		for (TInt index = 0; iterErr == KErrNone; iterErr = iter.Next(), ++index)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2102
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2103
			// sanity checking...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2104
			if (iter.GlyphCode() != iGlyphCodesLatin[index])
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2105
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2106
				ERR_PRINTF4(_L("Test failed at array size %d - Wanted glyphcode %d, got %d"), arraySize, iGlyphCodesLatin[index], iter.GlyphCode());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2107
				iStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2108
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2109
			if (CompareMetrics(iter.Metrics(), glyphMetricsArray[index]) != 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2110
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2111
				ERR_PRINTF3(_L("Test failed at array size %d, metrics check failed at glyphcode %d"), arraySize, iGlyphCodesLatin[index]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2112
				iStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2113
				}			
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2114
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2115
		iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2116
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2117
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2118
	glyphMetricsArray.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2119
	TESTNOERROR(iterErr);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2120
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2121
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2122
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2123
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2124
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2125
@SYMTestCaseID      GRAPHICS-FBSERV-0669
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2126
@SYMTestPriority    Low
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2127
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2128
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2129
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2130
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2131
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2132
	Negative test case to show that RFbsGlyphDataIterator and RFbsGlyphMetricsArray
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2133
	do not support bitmap fonts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2134
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2135
	i. Load a bitmap font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2136
	ii. Attempt to open an RFbsGlyphDataIterator and RFbsGlyphMetricsArray with the font.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2137
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2138
	KErrNotSupported should be returned in both instances. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2139
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2140
 void CTFbsGlyphData::TestBitmapFontSupport()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2141
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2142
	INFO_PRINTF1(_L("Test bitmap font not supported"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2143
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2144
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2145
	CFbsFont* bitmapFont = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2146
	TInt err = iTs->GetNearestFontToDesignHeightInPixels((CFont*&)bitmapFont, TFontSpec(_L("Digital"), 14));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2147
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2148
	TEST(!bitmapFont->IsOpenFont());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2149
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2150
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2151
	err = iter.Open(*bitmapFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2152
	TEST(err == KErrNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2153
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2154
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2155
	RFbsGlyphMetricsArray array;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2156
	err = array.Get(*bitmapFont, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2157
	TEST(err == KErrNotSupported);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2158
	array.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2159
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2160
	iTs->ReleaseFont(bitmapFont);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2161
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2162
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2163
 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2164
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2165
@SYMTestCaseID		GRAPHICS-FBSERV-0671
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2166
@SYMTestPriority	High
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2167
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2168
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2169
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2170
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2171
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2172
	Shows that different threads (and therefore RFbsSessions) using fonts with the same
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2173
	TFontSpec share the same glyphs	in the atlas and do not create duplicate entries
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2174
	in the Glyph Atlas, and that releasing a font clears all associated glyphs in the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2175
	atlas.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2176
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2177
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2178
	i. Create a handle to a test font in the current process.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2179
	ii. Spawn a test thread and wait for it to complete. Within the thread :
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2180
		1. Create a font with the same fontspec as the parent process.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2181
		2. Use the RFbsGlyphDataIterator API to force rasterization into the glyph atlas.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2182
		3. Release the iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2183
	iii. Check there were no leaves from the thread.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2184
	iv. Repeat ii. and iii. several times. Before using RFbsGlyphDataIterator,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2185
		the thread checks that the glyphs are still in the atlas from the first thread.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2186
	v. Check that the number of fonts in the atlas has increased by one only.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2187
	vi. Check that the number of glyphs in the atlas has increased by the size of the 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2188
		glyph code array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2189
	vii. Release the font in the parent process, thereby releasing the font and glyphs
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2190
		in the glyph atlas, and check that the state of the atlas is the same as before
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2191
		the test is run.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2192
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2193
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2194
	All threads should return no errors or leaves or panics.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2195
	After all threads have finished:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2196
		The glyph count should have increased by the size of the glyph code array used
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2197
		in the RFbsGlyphDataIterator, showing that	glyphs are only being added to the atlas
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2198
		once. The number of fonts in the atlas should have increased by one, showing
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2199
		that only the single underlying font object is being added to the atlas, despite
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2200
		different RFbsSessions and CFbsFont instances used.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2201
	After the test font is released in the main process:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2202
		The glyph count and font count return to the pre-test value, showing that when
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2203
		the last handle to a TFontSpec is released, the atlas frees its associated data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2204
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2205
void CTFbsGlyphData::TestMultithreadShareSingleFont()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2206
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2207
	INFO_PRINTF1(_L("Test glyphs shared between RFbsSessions/threads/processes"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2208
#ifndef _DEBUG
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2209
	// Test relies on debug-only FBS messages EFbsMessAtlasGlyphCount and EFbsMessAtlasFontCount
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2210
	INFO_PRINTF1(_L("Skipping test in release mode"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2211
#else	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2212
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2213
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2214
	_LIT(KThreadName, "GlyphDataTestThread");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2215
	const TInt KNumTestThreads = 5;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2216
	const TFontSpec KTestFontSpec(KTypefaceName, 50);	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2217
	const TInt atlasFontCountStart = iFbs->SendCommand(EFbsMessAtlasFontCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2218
	const TInt atlasGlyphCountStart = iFbs->SendCommand(EFbsMessAtlasGlyphCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2219
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2220
	CFbsFont* testFont;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2221
	TInt err = iTs->GetNearestFontToDesignHeightInPixels( (CFont*&)testFont, KTestFontSpec);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2222
	if (err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2223
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2224
		ERR_PRINTF2(_L("Could not load font, err = %d"), err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2225
		iStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2226
		return;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2227
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2228
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2229
	// Check there are no glyphs belonging to the test font before the test starts.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2230
	TInt atlasFontGlyphCount = iFbs->SendCommand(EFbsMessAtlasGlyphCount, testFont->Handle());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2231
	TEST(atlasFontGlyphCount == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2232
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2233
	TGlyphDataMultithreadParams params = {KTestFontSpec, iGlyphCodesLatin, KNumGlyphCodesLatin, NULL};
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2234
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2235
	// Run the test threads sequentially, and check its exit status.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2236
	RThread testThread;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2237
	TInt numThreadsPassed = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2238
	for (TInt i = 0; i < KNumTestThreads; i++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2239
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2240
		TBool threadPassed = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2241
		TGlyphDataThreadInfo info = {EGlyphDataMultiSessionTestShareGlyphs, params, i, iStep};
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2242
		err = testThread.Create(KThreadName, CTFbsGlyphData::ThreadFunction, KDefaultStackSize, KTestThreadMinHeapSize, KTestThreadMaxHeapSize, &info);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2243
		TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2244
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2245
		TRequestStatus statusThread;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2246
		testThread.Logon(statusThread);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2247
		testThread.Resume();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2248
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2249
		User::WaitForRequest(statusThread);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2250
		TInt threadResult = testThread.ExitReason();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2251
		if (threadResult != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2252
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2253
			ERR_PRINTF3(_L("Thread %i: Terminated with reason %d"), i, threadResult);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2254
			threadPassed = EFalse; 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2255
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2256
		TExitCategoryName exitCategory = testThread.ExitCategory();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2257
		if (exitCategory.Compare(_L("Kill")) != 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2258
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2259
			ERR_PRINTF3(_L("Thread %i: Terminated with reason category '%S'"), i, &exitCategory);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2260
			threadPassed = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2261
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2262
		testThread.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2263
		numThreadsPassed += (threadPassed) ? 1 : 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2264
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2265
	TEST(numThreadsPassed == KNumTestThreads);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2266
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2267
	// Check that the atlas still contains the glyphs and the font created by the threads
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2268
	// after they have died, since the font is still open in this process.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2269
	atlasFontGlyphCount = iFbs->SendCommand(EFbsMessAtlasGlyphCount, testFont->Handle());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2270
	TEST(atlasFontGlyphCount == params.iGlyphCodesCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2271
	TInt atlasFontCount = iFbs->SendCommand(EFbsMessAtlasFontCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2272
	TEST(atlasFontCount == (atlasFontCountStart + 1));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2273
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2274
	iTs->ReleaseFont(testFont);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2275
	testFont = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2276
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2277
	// Check the atlas state is now the same as it was before the test started,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2278
	// now that the last remaining handle to the font used in the threads is released.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2279
	TInt atlasGlyphCountEnd = iFbs->SendCommand(EFbsMessAtlasGlyphCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2280
	TEST(atlasGlyphCountStart == atlasGlyphCountEnd);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2281
	TInt atlasFontCountEnd = iFbs->SendCommand(EFbsMessAtlasFontCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2282
	TEST(atlasFontCountStart == atlasFontCountEnd);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2283
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2284
#endif
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2285
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2286
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2287
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2288
Worker thread for TestMultithreadShareSingleFont().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2289
The thread uses RFbsGlyphDataIterator on a CFbsFont of the given TFontSpec.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2290
Once complete the atlas is queried for the number of associated glyphs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2291
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2292
void CTFbsGlyphData::ThreadShareGlyphsL(TInt aThreadNum, TGlyphDataMultithreadParams& aParam, CTestStep* aStep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2293
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2294
	User::LeaveIfError(RFbsSession::Connect());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2295
	CFbsTypefaceStore* ts = CFbsTypefaceStore::NewL(NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2296
	CleanupStack::PushL(ts);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2297
	RFbsSession* fbs = RFbsSession::GetSession();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2298
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2299
	CFbsFont* font;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2300
	TInt err = ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, aParam.iFontSpec);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2301
	User::LeaveIfError(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2302
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2303
	if (aThreadNum > 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2304
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2305
		// If this is not the first thread, it means the first thread has already executed and 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2306
		// populated the glyph atlas with the glyphs. The font created by this thread 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2307
		// should already have its glyphs in the atlas.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2308
		TInt fontGlyphCount = fbs->SendCommand(EFbsMessAtlasGlyphCount, font->Handle());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2309
		if (fontGlyphCount != aParam.iGlyphCodesCount)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2310
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2311
			aStep->ERR_PRINTF4(_L("Thread %d: Only %d glyphs in atlas before first iteration, expected %d"), aThreadNum, fontGlyphCount, aParam.iGlyphCodesCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2312
			aStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2313
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2314
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2315
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2316
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2317
	for (err = iter.Open(*font, aParam.iGlyphCodes, aParam.iGlyphCodesCount); err == KErrNone; err = iter.Next())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2318
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2319
		// no-op
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2320
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2321
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2322
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2323
	// Check that the glyphs of this font have been added to the atlas
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2324
	TInt fontGlyphCount = fbs->SendCommand(EFbsMessAtlasGlyphCount, font->Handle());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2325
	if (fontGlyphCount != aParam.iGlyphCodesCount)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2326
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2327
		aStep->ERR_PRINTF5(_L("Thread %d: Only %d glyphs in atlas after last iteration, expected %d (err=%d)"), aThreadNum, fontGlyphCount, aParam.iGlyphCodesCount, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2328
		aStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2329
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2330
	if (err != KErrNotFound)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2331
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2332
		aStep->ERR_PRINTF3(_L("Thread %d: Error during test = %d"), aThreadNum, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2333
		aStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2334
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2335
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2336
	ts->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2337
	CleanupStack::PopAndDestroy(1); // ts
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2338
	RFbsSession::Disconnect();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2339
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2340
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2341
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2342
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2343
@SYMTestCaseID		GRAPHICS-FBSERV-0672
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2344
@SYMTestPriority	Medium
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2345
@SYMTestType		UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2346
@SYMTestStatus		Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2347
@SYMPREQ			PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2348
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2349
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2350
	Tests that with many concurrent sessions connected to Fbserv, the atlas successfully
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2351
	returns the correct glyph images even if the atlas becomes full and has to evict glyphs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2352
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2353
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2354
	i. Create 25 threads, each a unique session with Fbserv.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2355
	ii. Launch the threads simultaneously. In each thread:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2356
		1. Create a FBS typeface store and create a font which is unique in the process.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2357
		2. Use RFbsGlyphDataIterator to iterate through the latin glyph codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2358
		3. Check the image is correct for each glyph against the image returned by 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2359
			CFont::GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2360
		4. Close the iterator.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2361
		5. Release the font and close the typeface store. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2362
	iii. Once all threads have finished, check the exit status of each thread
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2363
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2364
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2365
	Every glyph for every thread should match the image returned by GetCharacterData()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2366
	All threads should exit normally with no Leave code.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2367
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2368
_LIT(KTestMultithreadStressFinishSemaphore, "TestMultithreadStressAtlasFinish");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2369
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2370
void CTFbsGlyphData::TestMultithreadStressAtlas()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2371
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2372
	INFO_PRINTF1(_L("Stress test glyph atlas with multiple RFbsSessions"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2373
	WARN_PRINTF1(_L("---Stress test TO BE REVISITED due to Broadcom defect ESLM-85NEFT - TB10.1 eglCreateImageKHR hangs during multithreading"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2374
	TEST(EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2375
	/*__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2376
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2377
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2378
	const TInt KNumTestThreads = 25;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2379
	_LIT(KThreadNameFormat, "GlyphDataTestThread%i");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2380
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2381
	// Create a semaphore that is signalled by each test thread when it has finished.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2382
	RSemaphore threadFinishSemaphore;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2383
	err = threadFinishSemaphore.CreateGlobal(KTestMultithreadStressFinishSemaphore, 0, EOwnerThread);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2384
	TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2385
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2386
	// Prepare the testdata for the threads
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2387
	// Each thread will have a TFontSpec which will cause unique CFbsFonts
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2388
	// to be created in the server, and therefore the atlas.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2389
	RThread testThread[KNumTestThreads];
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2390
	TGlyphDataThreadInfo testInfo[KNumTestThreads];	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2391
	for (TInt i = 0; i < KNumTestThreads; ++i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2392
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2393
		testInfo[i].iStep = iStep;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2394
		testInfo[i].iTest = EGlyphDataMultiSessionTestStressAtlas;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2395
		testInfo[i].iParams.iFontSpec = GenerateDejaVuFontSpec(i);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2396
		testInfo[i].iParams.iGlyphCodes = iGlyphCodesLatin;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2397
		testInfo[i].iParams.iGlyphCodesCount = KNumGlyphCodesLatin;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2398
		testInfo[i].iParams.iEGL = iEGL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2399
		testInfo[i].iThreadNum = i;	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2400
		TBuf<128> threadName;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2401
		threadName.AppendFormat(KThreadNameFormat, i);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2402
		err = testThread[i].Create(threadName, CTFbsGlyphData::ThreadFunction, KDefaultStackSize, KTestThreadMinHeapSize, KTestThreadMaxHeapSize, &testInfo[i]);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2403
		TESTNOERROR(err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2404
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2405
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2406
	// All threads are created, start them simultaneously.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2407
	for (TInt i = 0; i < KNumTestThreads; ++i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2408
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2409
		testThread[i].Resume();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2410
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2411
	// Wait for all threads to finish.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2412
	for (TInt i = 0; i < KNumTestThreads; ++i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2413
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2414
		threadFinishSemaphore.Wait();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2415
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2416
	// Allow some time for remaining threads to finish tidy-up.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2417
	User::After(100000);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2418
	threadFinishSemaphore.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2419
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2420
	TInt numThreadsPassed = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2421
	for (TInt i = 0; i < KNumTestThreads; ++i)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2422
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2423
		TBool threadPassed = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2424
		TInt threadResult = testThread[i].ExitReason();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2425
		if (threadResult != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2426
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2427
			ERR_PRINTF3(_L("Thread %i: Terminated with reason %d"), i, threadResult);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2428
			threadPassed = EFalse; 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2429
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2430
		TExitCategoryName exitCategory = testThread[i].ExitCategory();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2431
		if (exitCategory.Compare(_L("Kill")) != 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2432
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2433
			ERR_PRINTF3(_L("Thread %i: Terminated with reason category '%S'"), i, &exitCategory);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2434
			threadPassed = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2435
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2436
		testThread[i].Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2437
		numThreadsPassed += (threadPassed) ? 1 : 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2438
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2439
	TEST(numThreadsPassed == KNumTestThreads);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2440
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2441
	__UHEAP_MARKEND;*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2442
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2443
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2444
Worker thread for TestMultithreadStressAtlas().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2445
The thread uses RFbsGlyphDataIterator on a CFbsFont of the given TFontSpec.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2446
For each glyph, the image returned by the iterator is compared to the image 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2447
returned from CFont::GetCharacterData().
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2448
Once complete, the semaphore is signalled to tell the parent process it has
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2449
finished.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2450
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2451
void CleanupFinishSemaphore(TAny* aItem)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2452
    {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2453
    RSemaphore* semaphore = reinterpret_cast<RSemaphore*>(aItem);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2454
    semaphore->Signal();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2455
    semaphore->Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2456
    }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2457
void CTFbsGlyphData::ThreadStressAtlasL(TInt aThreadNum, TGlyphDataMultithreadParams& aParam, CTestStep* aStep)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2458
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2459
	TOpenFontCharMetrics charMetrics;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2460
	const TUint8* bitmapData;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2461
	TSize bitmapSize;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2462
	RSgImage charDataImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2463
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2464
	RSemaphore threadFinishSemaphore;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2465
	User::LeaveIfError(threadFinishSemaphore.OpenGlobal(KTestMultithreadStressFinishSemaphore));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2466
	CleanupStack::PushL(TCleanupItem(CleanupFinishSemaphore, &threadFinishSemaphore));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2467
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2468
	User::LeaveIfError(RFbsSession::Connect());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2469
	CFbsTypefaceStore* ts = CFbsTypefaceStore::NewL(NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2470
	CleanupStack::PushL(ts);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2471
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2472
	CFbsFont* font;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2473
	User::LeaveIfError(ts->GetNearestFontToDesignHeightInPixels((CFont*&)font, aParam.iFontSpec));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2474
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2475
	TInt numGlyphMatches = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2476
	TInt index = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2477
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2478
	RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2479
	for (err = iter.Open(*font, aParam.iGlyphCodes, aParam.iGlyphCodesCount); err == KErrNone; err = iter.Next(), ++index)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2480
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2481
		TBool glyphMatch = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2482
		font->GetCharacterData(aParam.iGlyphCodes[index] | KGlyphCodeFlag, charMetrics, bitmapData, bitmapSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2483
		if (bitmapSize == TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2484
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2485
			glyphMatch = (bitmapSize == iter.Rect().Size());
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2486
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2487
		else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2488
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2489
			err = CreateSgImageFromCharacterData(bitmapData, bitmapSize, font->FontSpecInTwips().iFontStyle.BitmapType(), charDataImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2490
			if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2491
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2492
				err = CompareSgImages(aParam.iEGL, iter.Image(), iter.Rect(), charDataImage, TRect(bitmapSize), glyphMatch);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2493
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2494
			charDataImage.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2495
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2496
		if (err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2497
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2498
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2499
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2500
		numGlyphMatches += (glyphMatch) ? 1 : 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2501
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2502
	iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2503
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2504
	if (index != aParam.iGlyphCodesCount)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2505
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2506
		aStep->ERR_PRINTF5(_L("Thread %d: Iterator terminated early - %d out of %d glyphs (err=%d)"), aThreadNum, index, aParam.iGlyphCodesCount, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2507
		aStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2508
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2509
	if (index != numGlyphMatches)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2510
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2511
		aStep->ERR_PRINTF4(_L("Thread %d: Matched %d out of %d glyphs"), aThreadNum, numGlyphMatches, aParam.iGlyphCodesCount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2512
		aStep->SetTestStepResult(EFail);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2513
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2514
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2515
	ts->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2516
	CleanupStack::PopAndDestroy(2); // ts, threadFinishSemaphore
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2517
	RFbsSession::Disconnect();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2518
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2519
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2520
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2521
@SYMTestCaseID      GRAPHICS-FBSERV-0673
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2522
@SYMTestPriority    Medium
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2523
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2524
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2525
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2526
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2527
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2528
    Tests the robustness of using RFbsGlyphMetricsArray when the client heap and the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2529
    FbServ private heap experience failures allocating memory, causing no panics 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2530
    or leaves.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2531
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2532
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2533
    i. Set the default heap failure for the next heap allocation.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2534
    ii. Create a new CFbsFont using a TFontSpec not already in the glyph atlas.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2535
    iii. Call RFbsGlyphMetricsArray::Get(), and close the array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2536
    iv. Release the font so that nothing is left in the cache as a result of
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2537
        attempting to use it, and reset the heap failure state.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2538
    v. While iii returns KErrNoMemory, increment the failure count and repeat
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2539
        step ii.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2540
    vi. Using a separate font so that the test is not affected by the earlier
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2541
        run, repeat ii. to v., but rather than setting the default heap to 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2542
        fail, the FbServ private heap is set to fail, via IPC messages to Fbs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2543
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2544
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2545
    If no errors occur, KErrNone should be returned after a certain number of
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2546
    repetitions. Any other error code denotes a problem handling low-memory 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2547
    situtations.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2548
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2549
void CTFbsGlyphData::TestGlyphMetricsArrayHeapOOML()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2550
    {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2551
    INFO_PRINTF1(_L("Test RFbsGlyphMetricsArray during heap alloc failure"));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2552
    __UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2553
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2554
    // Create a font that wont be in the cache already...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2555
    TInt rep = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2556
    TInt err = KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2557
    CFbsFont* font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2558
    
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2559
    while (err == KErrNoMemory)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2560
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2561
        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(10)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2562
        __UHEAP_FAILNEXT(rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2563
        RFbsGlyphMetricsArray array;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2564
        err = array.Get(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2565
        array.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2566
        __UHEAP_RESET;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2567
        iTs->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2568
        font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2569
        ++rep;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2570
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2571
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2572
	TESTE(err == KErrNone, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2573
    if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2574
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2575
        INFO_PRINTF2(_L("Client Heap OOM : Test passed after rep %d"), rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2576
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2577
    else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2578
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2579
        ERR_PRINTF3(_L("Client Heap OOM : Test failed with err=%d, after rep %d"), err, rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2580
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2581
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2582
    // Now test when the server-side FbServ heap fails...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2583
    rep = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2584
    err = KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2585
    
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2586
    while (err == KErrNoMemory)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2587
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2588
        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(11)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2589
        iFbs->SendCommand(EFbsMessSetHeapFail, RFbsSession::EHeapFailTypeServerMemory, rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2590
        RFbsGlyphMetricsArray array;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2591
        err = array.Get(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2592
        array.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2593
        iFbs->SendCommand(EFbsMessSetHeapReset, RFbsSession::EHeapFailTypeServerMemory);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2594
        iTs->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2595
        font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2596
        ++rep;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2597
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2598
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2599
	TESTE(err == KErrNone, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2600
    if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2601
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2602
        INFO_PRINTF2(_L("FBServ Heap OOM : Test passed after rep %d"), rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2603
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2604
    else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2605
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2606
        ERR_PRINTF3(_L("FBServ Heap OOM : Test failed with err=%d, after rep %d"), err, rep);      
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2607
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2608
    __UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2609
    }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2610
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2611
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2612
@SYMTestCaseID      GRAPHICS-FBSERV-0674
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2613
@SYMTestPriority    Medium
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2614
@SYMTestType        UT
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2615
@SYMTestStatus      Implemented
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2616
@SYMPREQ            PREQ2678
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2617
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2618
@SYMTestCaseDesc
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2619
    Tests the robustness of using RFbsGlyphDataIterator when the client heap and the
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2620
    FbServ private heap experience failures allocating memory, causing no panics 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2621
    or leaves.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2622
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2623
@SYMTestActions
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2624
    i. Set the default heap failure for the next heap allocation.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2625
    ii. Create a new CFbsFont using a TFontSpec not already in the glyph atlas.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2626
    iii. Call RFbsGlyphDataIterator::Open(), and close the array.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2627
    iv. Release the font so that nothing is left in the cache as a result of
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2628
        attempting to use it, and reset the heap failure state.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2629
    v. While iii returns KErrNoMemory, increment the failure count and repeat
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2630
        step ii.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2631
    vi. Using a separate font so that the test is not affected by the earlier
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2632
        run, repeat ii. to v., but rather than setting the default heap to 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2633
        fail, the FbServ private heap is set to fail, via IPC messages to Fbs.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2634
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2635
@SYMTestExpectedResults
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2636
    If no errors occur, KErrNone should be returned after a certain number of
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2637
    repetitions. Any other error code denotes a problem handling low-memory 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2638
    situtations.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2639
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2640
void CTFbsGlyphData::TestGlyphDataIteratorHeapOOML()
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2641
    {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2642
    INFO_PRINTF1(_L("Test RFbsGlyphDataIterator during heap alloc failure"));    
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2643
    __UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2644
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2645
    // Create a font that wont be in the cache already...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2646
    TInt rep = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2647
    TInt err = KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2648
    CFbsFont* font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2649
    
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2650
    while (err == KErrNoMemory)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2651
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2652
        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(10)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2653
        __UHEAP_FAILNEXT(rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2654
        RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2655
        err = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2656
        if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2657
            {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2658
            while (err == KErrNone) 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2659
               {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2660
               err = iter.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2661
               }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2662
            err = (err == KErrNotFound) ? KErrNone : err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2663
            }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2664
        iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2665
        __UHEAP_RESET;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2666
        iTs->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2667
        font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2668
        ++rep;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2669
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2670
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2671
	TESTE(err == KErrNone, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2672
    if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2673
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2674
        INFO_PRINTF2(_L("Client Heap OOM : Test passed after rep %d"), rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2675
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2676
    else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2677
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2678
        ERR_PRINTF3(_L("Client Heap OOM : Test failed with err=%d, after rep %d"), err, rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2679
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2680
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2681
    // Now test when the server-side FbServ heap fails...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2682
    rep = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2683
    err = KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2684
    
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2685
    while (err == KErrNoMemory)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2686
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2687
        User::LeaveIfError(iTs->GetNearestFontInPixels((CFont*&)font, GenerateDejaVuFontSpec(11)));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2688
        iFbs->SendCommand(EFbsMessSetHeapFail, RFbsSession::EHeapFailTypeServerMemory, rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2689
        RFbsGlyphDataIterator iter;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2690
        err = iter.Open(*font, iGlyphCodesLatin, KNumGlyphCodesLatin);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2691
        if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2692
            {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2693
            while (err == KErrNone) 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2694
               {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2695
               err = iter.Next();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2696
               }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2697
            err = (err == KErrNotFound) ? KErrNone : err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2698
            }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2699
        iter.Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2700
        iFbs->SendCommand(EFbsMessSetHeapReset, RFbsSession::EHeapFailTypeServerMemory);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2701
        iTs->ReleaseFont(font);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2702
        font = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2703
        ++rep;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2704
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2705
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2706
	TESTE(err == KErrNone, err);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2707
    if (err == KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2708
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2709
        INFO_PRINTF2(_L("FBServ Heap OOM : Test passed after rep %d"), rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2710
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2711
    else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2712
        {
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2713
        ERR_PRINTF3(_L("FBServ Heap OOM : Test failed with err=%d, after rep %d"), err, rep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2714
        }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2715
    __UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2716
    }
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2717
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2718
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2719
Utility function. Prints out a description of the font's fontspec to the log.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2720
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2721
void CTFbsGlyphData::InfoPrintFontSpec(const CFont& aFont)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2722
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2723
	_LIT(KMonochromeBitmap, "Mono");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2724
	_LIT(KAntiAliasedBitmap, "AA");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2725
	_LIT(KStyleItalic, "Italic");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2726
	_LIT(KStyleBold, "Bold");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2727
	_LIT(KStyleNormal, "Normal");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2728
	_LIT(KUnknown, "Unknown");
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2729
	TBufC<9> bitmapType;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2730
	TBuf<12> fontStyle;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2731
	TFontSpec fontSpec = aFont.FontSpecInTwips();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2732
	switch(fontSpec.iFontStyle.BitmapType())
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2733
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2734
		case EMonochromeGlyphBitmap:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2735
			bitmapType = KMonochromeBitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2736
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2737
		case EAntiAliasedGlyphBitmap:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2738
			bitmapType = KAntiAliasedBitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2739
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2740
		default:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2741
			bitmapType = KUnknown;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2742
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2743
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2744
	if (fontSpec.iFontStyle.StrokeWeight() == EStrokeWeightBold)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2745
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2746
		fontStyle.Append(KStyleBold);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2747
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2748
	if (fontSpec.iFontStyle.Posture() == EPostureItalic)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2749
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2750
		fontStyle.Append(KStyleItalic);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2751
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2752
	if (fontStyle.Length() == 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2753
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2754
		fontStyle = KStyleNormal;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2755
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2756
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2757
	INFO_PRINTF5(_L("Font: name=%S size=%dtw type=%S style=%S"), &(fontSpec.iTypeface.iName), fontSpec.iHeight, &bitmapType, &fontStyle);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2758
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2759
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2760
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2761
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2762
Static utility function. Performs a per-pixel comparison of two open RSgImages.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2763
To do this requires access to the binary data of the images, only accessable
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2764
via EGL and Khronos APIs. This function will bind the RSgImages to VGImages 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2765
and uses OpenVG to retrieve the image data in 8bpp.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2766
@param aEGL An EGL Helper to read the SgImages into system memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2767
@param aImageA The first image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2768
@param aRectA A rectangular portion in pixels of the first image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2769
@param aImageB The second image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2770
@param aRectB A rectangular portion in pixels fo the second image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2771
@param aMatch A boolean value, which on return tells the caller whether the two
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2772
	images were deemed to match.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2773
@return KErrNone, if the comparison took place, otherwise one of the system-wide
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2774
	error codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2775
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2776
TInt CTFbsGlyphData::CompareSgImages(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, const RSgImage& aImageB, const TRect& aRectB, TBool& aMatch)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2777
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2778
	return CTFbsGlyphData::CompareSgImages(aEGL, aImageA, aRectA, NULL, aImageB, aRectB, NULL, aMatch);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2779
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2780
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2781
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2782
Static utility function. Performs a per-pixel comparison of two open RSgImages.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2783
To do this requires access to the binary data of the images, only accessable
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2784
via EGL and Khronos APIs. This function will bind the RSgImages to VGImages 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2785
and uses OpenVG to retrieve the image data in 8bpp.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2786
This version allows pre-created memory to be used in the comparison, to avoid
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2787
allocation failure in low memory testing.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2788
@param aEGL An EGL Helper to read the SgImages into system memory buffers.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2789
@param aImageA The first image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2790
@param aRectA A rectangular portion in pixels of the first image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2791
@param aBufferA If non-NULL, specifies a memory buffer to read the data of
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2792
	aImageA into, otherwise a buffer is dynamically allocated.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2793
@param aImageB The second image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2794
@param aRectB A rectangular portion in pixels fo the second image to compare.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2795
@param aBufferB If non-NULL, specifies a memory buffer to read the data of
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2796
	aImageB into, otherwise a buffer is dynamically allocated.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2797
@param aMatch A boolean value, which on return tells the caller whether the two
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2798
	images were deemed to match.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2799
@return KErrNone, if the comparison took place, otherwise one of the system-wide
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2800
	error codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2801
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2802
TInt CTFbsGlyphData::CompareSgImages(CEGLHelper* aEGL, const RSgImage& aImageA, const TRect& aRectA, TUint8* aBufferA, const RSgImage& aImageB, const TRect& aRectB, TUint8* aBufferB, TBool& aMatch)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2803
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2804
	// By default, assume they do not match.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2805
	aMatch = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2806
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2807
#ifdef SAVEGLYPHSTOMBMDURINGCOMPARISON
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2808
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2809
	static TInt countToAppend = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2810
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2811
	CFbsBitmap* bitmap = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2812
	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageA, aRectA, bitmap))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2813
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2814
		TBuf<KMaxFileName> buf;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2815
		buf.AppendNum( countToAppend );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2816
		TPtrC nameAppend( buf );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2817
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2818
		SaveBmp(bitmap, &nameAppend, EFalse);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2819
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2820
	delete bitmap;	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2821
	if (KErrNone == CreateBitmapFromSgImage(aEGL, aImageB, aRectB, bitmap))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2822
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2823
		TBuf<KMaxFileName> buf;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2824
		buf.AppendNum( countToAppend );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2825
		TPtrC nameAppend( buf );
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2826
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2827
		SaveBmp(bitmap, &nameAppend, ETrue);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2828
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2829
	delete bitmap;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2830
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2831
	countToAppend++;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2832
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2833
#endif // SAVEGLYPHSTOMBMDURINGCOMPARISON
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2834
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2835
	TSgImageInfo imageInfoA;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2836
	TSgImageInfo imageInfoB;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2837
	if (aImageA.GetInfo(imageInfoA) != KErrNone ||
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2838
		aImageB.GetInfo(imageInfoB) != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2839
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2840
		return KErrBadHandle;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2841
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2842
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2843
	// Check the sizes of the images match, and the rects reside on the images.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2844
	if (aRectA.Size() != aRectB.Size() ||
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2845
		!TRect(imageInfoA.iSizeInPixels).Intersects(aRectA) ||
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2846
		!TRect(imageInfoB.iSizeInPixels).Intersects(aRectB))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2847
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2848
		return KErrNone;		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2849
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2850
	const TSize KBufferSize = aRectA.Size();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2851
	const TInt KDataStride = KBufferSize.iWidth;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2852
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2853
	TBool freeTempBufA = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2854
	TBool freeTempBufB = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2855
	if (!aBufferA)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2856
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2857
		aBufferA = (TUint8*) User::AllocZ(KDataStride * KBufferSize.iHeight);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2858
		freeTempBufA = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2859
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2860
	if (!aBufferA)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2861
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2862
		return KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2863
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2864
	TInt err = aEGL->GetSgImageData(aImageA, aRectA, aBufferA);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2865
	if (err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2866
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2867
		if (freeTempBufA)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2868
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2869
			User::Free(aBufferA);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2870
			aBufferA = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2871
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2872
		return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2873
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2874
	if (!aBufferB)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2875
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2876
		aBufferB = (TUint8*) User::AllocZ(KDataStride * KBufferSize.iHeight);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2877
		freeTempBufB = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2878
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2879
	if (!aBufferB)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2880
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2881
		if (freeTempBufA)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2882
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2883
			User::Free(aBufferA);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2884
			aBufferA = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2885
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2886
		return KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2887
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2888
	err = aEGL->GetSgImageData(aImageB, aRectB, aBufferB);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2889
	if (err != KErrNone)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2890
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2891
		if (freeTempBufA)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2892
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2893
			User::Free(aBufferA);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2894
			aBufferA = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2895
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2896
		if (freeTempBufB)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2897
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2898
			User::Free(aBufferB);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2899
			aBufferB = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2900
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2901
		return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2902
		}	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2903
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2904
	// Perform a per-pixel comparison, scanline by scanline.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2905
	// The loop will break as soon as a mismatch is detected.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2906
	aMatch = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2907
	for (TInt scanline = 0; (scanline < KBufferSize.iHeight) && aMatch; ++scanline)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2908
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2909
		TUint8* scanlineImageA = aBufferA + (scanline * KDataStride);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2910
		TUint8* scanlineImageB = aBufferB + (scanline * KDataStride);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2911
		aMatch = (Mem::Compare(scanlineImageA, KBufferSize.iWidth, scanlineImageB, KBufferSize.iWidth) == 0);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2912
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2913
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2914
	if (freeTempBufA)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2915
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2916
		User::Free(aBufferA);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2917
		aBufferA = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2918
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2919
	if (freeTempBufB)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2920
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2921
		User::Free(aBufferB);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2922
		aBufferB = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2923
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2924
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2925
	return KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2926
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2927
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2928
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2929
Second thread entry function for multi-threaded tests.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2930
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2931
TInt CTFbsGlyphData::ThreadFunction(TAny* aParam)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2932
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2933
	__UHEAP_MARK;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2934
	CTrapCleanup* cleanupStack = CTrapCleanup::New();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2935
	if (!cleanupStack)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2936
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2937
		return KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2938
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2939
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2940
	TGlyphDataThreadInfo* info = static_cast<TGlyphDataThreadInfo*>(aParam);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2941
	TRAPD(result,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2942
	switch(info->iTest)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2943
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2944
		case EGlyphDataMultiSessionTestShareGlyphs:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2945
			CTFbsGlyphData::ThreadShareGlyphsL(info->iThreadNum, info->iParams, info->iStep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2946
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2947
		case EGlyphDataMultiSessionTestStressAtlas:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2948
			CTFbsGlyphData::ThreadStressAtlasL(info->iThreadNum, info->iParams, info->iStep);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2949
			break;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2950
		default:
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2951
			User::Leave(KErrArgument);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2952
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2953
	);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2954
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2955
	delete cleanupStack;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2956
	__UHEAP_MARKEND;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2957
	return result;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2958
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2959
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2960
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2961
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2962
/*
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2963
	-----------------------------------------
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2964
	Static utility Methods used by the tests.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2965
	-----------------------------------------
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2966
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2967
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2968
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2969
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2970
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2971
Utility method that fills the RSgImage memory with RSgImages until either KErrNoMemory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2972
or KErrNoGraphicsMemory is returned.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2973
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2974
@param aSize The size of the image used to fill the graphics memory - a form of granularity
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2975
@param aImages Returns the array of the images used to fill the graphics memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2976
@return KErrNoGraphicsMemory or KErrNoMemory if successful, otherwise one of the system
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2977
	wide error codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2978
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2979
/*static TInt FillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2980
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2981
	TInt err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2982
	while (KErrNone == err)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2983
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2984
		RSgImage sgImage;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2985
		err = sgImage.Create(TSgImageInfo(aSize, ESgPixelFormatA_8, ESgUsageBitOpenVgImage));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2986
		if (KErrNone == err)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2987
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2988
			err = aImages.Append(sgImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2989
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2990
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2991
	return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2992
	}*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2993
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2994
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2995
Utility method that fills the RSgImage memory with RSgImages until either KErrNoMemory
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2996
or KErrNoGraphicsMemory is returned and then closes one RSgImage to free up some memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2997
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2998
@param aSize The size of the image used to fill the graphics memory - a form of granularity
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  2999
@param aImages Returns the array of the images used to fill the graphics memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3000
@return KErrNone if successful, otherwise one of the system	wide error codes.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3001
 */
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3002
/*static TInt NearlyFillGraphicsMemoryWithImages(const TSize& aSize, RArray<RSgImage>& aImages)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3003
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3004
	TInt err = FillGraphicsMemoryWithImages(aSize, aImages);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3005
	if (err == KErrNoMemory || err == KErrNoGraphicsMemory)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3006
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3007
		if (aImages.Count() > 0)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3008
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3009
			// Remove an image to free up some memory.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3010
			TInt lastIndex = aImages.Count() - 1;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3011
			aImages[lastIndex].Close();
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3012
			aImages.Remove(lastIndex);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3013
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3014
		err = KErrNone;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3015
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3016
	return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3017
	}*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3018
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3019
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3020
Static utility function. Creates an 8bpp RSgImage from 1bpp or 8bpp character
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3021
data, with VGImage usage flag set.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3022
@param aData The character image data. Either in 8bpp or 1bpp RLE format.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3023
@param aSize The size of the character image in pixels.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3024
@param aType The type of glyph - Monochrome or Antialiased. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3025
@param aSgImage A closed image which will be populated with 8bpp image data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3026
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3027
static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3028
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3029
	return CreateSgImageFromCharacterData(aData, aSize, aType, aImage, NULL, NULL);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3030
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3031
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3032
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3033
Static utility function. Creates an 8bpp RSgImage from 1bpp or 8bpp character
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3034
data, with VGImage usage flag set. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3035
This overload allows the memory for the buffers to be pre-created to avoid
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3036
memory allocation failure during low-memory testing.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3037
@param aData The character image data. Either in 8bpp or 1bpp RLE format.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3038
@param aSize The size of the character image in pixels.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3039
@param aType The type of glyph - Monochrome or Antialiased. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3040
@param aSgImage A closed image which will be populated with 8bpp image data.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3041
@param aBuffer1 If non-NULL, used as a memory buffer for reading the decoded 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3042
	image data into for monochrome images.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3043
@param aBuffer2 If non-NULL, used as a memory buffer for the decoded image
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3044
	data for monochrome images.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3045
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3046
static TInt CreateSgImageFromCharacterData(const TUint8* aData, const TSize& aSize, TGlyphBitmapType aType, RSgImage& aImage, TUint8* aBuffer1, TUint8* aBuffer2)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3047
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3048
	TInt err = KErrNone;	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3049
	if (aSize == TSize(0, 0))
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3050
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3051
		return KErrArgument;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3052
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3053
	TUint8* dataBuf = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3054
	TInt dataStride = 0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3055
	TBool freeDataBuf = EFalse;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3056
	if (aType == EAntiAliasedGlyphBitmap)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3057
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3058
		dataBuf = const_cast<TUint8*>(aData);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3059
		dataStride = aSize.iWidth;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3060
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3061
	else if (aType == EMonochromeGlyphBitmap)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3062
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3063
		TUint8* binaryData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3064
		TUint8* tempBuf = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3065
		TInt binaryDataStride = ((aSize.iWidth + 31) / 32) << 2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3066
		TInt binaryDataSize = binaryDataStride * aSize.iHeight;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3067
		if (aBuffer1 && User::AllocLen(aBuffer1) >= binaryDataSize)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3068
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3069
			binaryData = aBuffer1;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3070
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3071
		else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3072
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3073
			tempBuf = (TUint8*) User::AllocZ(binaryDataSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3074
			if (!tempBuf)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3075
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3076
				return KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3077
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3078
			binaryData = tempBuf;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3079
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3080
		// Unpack the run length encoded data into 1bpp
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3081
		DecodeBinaryData(aSize, aData, binaryDataStride, reinterpret_cast<TUint32*&>(binaryData));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3082
		dataStride = aSize.iWidth;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3083
		TInt byteDataSize = dataStride * aSize.iHeight;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3084
		TUint8* byteData = NULL;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3085
		// If aByteBuf supplied, use that instead of allocating a new buffer here.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3086
		if (aBuffer2 && User::AllocLen(aBuffer2) >= byteDataSize)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3087
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3088
			byteData = aBuffer2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3089
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3090
		else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3091
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3092
			byteData = (TUint8*) User::AllocZ(byteDataSize);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3093
			if (!byteData)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3094
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3095
				User::Free(tempBuf);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3096
				return KErrNoMemory;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3097
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3098
			freeDataBuf = ETrue;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3099
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3100
		dataBuf = byteData;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3101
		for (TInt scanline = 0; scanline < aSize.iHeight; ++scanline)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3102
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3103
			TUint8* srcByte = binaryData;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3104
			for (TInt pixel = 0; pixel < aSize.iWidth; pixel++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3105
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3106
				*(byteData+pixel) = ((*srcByte & (1 << (pixel % 8))) == 0) ? 0 : 0xFF;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3107
				if (((pixel + 1) % 8) == 0) srcByte++;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3108
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3109
			byteData += dataStride;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3110
			binaryData += binaryDataStride;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3111
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3112
		User::Free(tempBuf);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3113
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3114
	else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3115
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3116
		return KErrArgument;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3117
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3118
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3119
	// Create RSgImage from CFbsBitmap.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3120
	TSgImageInfo sgImageInfo(aSize, ESgPixelFormatA_8, ESgUsageBitOpenVgImage);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3121
	err = aImage.Create(sgImageInfo, dataBuf, dataStride);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3122
	if (freeDataBuf)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3123
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3124
		User::Free(dataBuf);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3125
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3126
	return err;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3127
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3128
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3129
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3130
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3131
Static utility function, Copies image data line(s) to a destination.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3132
@param aBinaryDataPtr pointer to a destination buffer.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3133
@param aBufferWords Stride of the image.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3134
@param aData Pointer to a source buffer.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3135
@param aBitShift Number of bits, binary data will be shifted. 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3136
@param aCharWidth Width of the image.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3137
@param aRepeatCount Number of lines to copy.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3138
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3139
static void CopyCharLine(TUint32*& aBinaryDataPtr,TInt aBufferWords,const TUint8* aData,TInt aBitShift,TInt aCharWidth, TInt16 aRepeatCount)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3140
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3141
	aBitShift&=7;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3142
	TInt wordstocopy=(aCharWidth+31)>>5;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3143
	if(wordstocopy>aBufferWords) wordstocopy=aBufferWords;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3144
	TUint32* ptrlimit=aBinaryDataPtr+wordstocopy;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3145
	TUint32* dataword=(TUint32*)(TInt(aData)&~3);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3146
	aBitShift+=(TInt(aData)-TInt(dataword))<<3;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3147
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3148
	TUint32* startBinaryDataPtr = aBinaryDataPtr;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3149
	while(aBinaryDataPtr<ptrlimit)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3150
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3151
		*aBinaryDataPtr=*dataword++;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3152
		*aBinaryDataPtr>>=aBitShift;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3153
		if(aBitShift) *aBinaryDataPtr|=(*dataword<<(32-aBitShift));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3154
		aBinaryDataPtr++;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3155
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3156
	
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3157
	TUint32* curStartBinaryDataPtr = aBinaryDataPtr;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3158
	TInt byteToCopy = wordstocopy << 2;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3159
	while(aRepeatCount > 1)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3160
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3161
		Mem::Copy(curStartBinaryDataPtr, startBinaryDataPtr, byteToCopy);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3162
		curStartBinaryDataPtr += wordstocopy;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3163
		
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3164
		aRepeatCount--;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3165
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3166
	aBinaryDataPtr = curStartBinaryDataPtr;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3167
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3168
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3169
/**
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3170
Static utility function. Decodes a monochrome glyph whose data is run length encoded, 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3171
into a 1bpp bitmap.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3172
@param aDataSize Image size in pixels.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3173
@param aData Pointer to a source buffer.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3174
@param aStride Image data stride.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3175
@param aBinaryData Pointer to a destination buffer. This buffer must be allocated 
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3176
	by the caller.
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3177
*/
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3178
static void DecodeBinaryData(const TSize& aDataSize, const TUint8* aData, TInt aStride,
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3179
											TUint32* aBinaryData)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3180
	{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3181
	const TInt datalength = aDataSize.iWidth;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3182
	const TInt dataheight = aDataSize.iHeight;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3183
	TInt bitindex=0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3184
	TInt16 repeatcount=0;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3185
	TUint32* slbuffer=aBinaryData;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3186
	const TInt slwords=aStride;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3187
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3188
	for(TInt charline=0;charline<dataheight;charline+=repeatcount) // for lines in the character...
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3189
		{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3190
		repeatcount=CFbsBitGc::Load16(aData+(bitindex>>3));
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3191
		repeatcount>>=bitindex&7;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3192
		const TInt multilineflag=repeatcount&1;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3193
		repeatcount>>=1;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3194
		repeatcount&=0xf;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3195
		bitindex+=5;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3196
		if(multilineflag)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3197
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3198
			for(TInt currentline=0;currentline<repeatcount;currentline++)
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3199
				{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3200
				CopyCharLine(slbuffer,slwords,aData+(bitindex>>3),bitindex&7,datalength, 1);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3201
				bitindex+=datalength;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3202
				}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3203
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3204
		else
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3205
			{
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3206
			CopyCharLine(slbuffer,slwords,aData+(bitindex>>3),bitindex&7,datalength, repeatcount);
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3207
			bitindex+=datalength;
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3208
			}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3209
		}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3210
	}
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3211
//--------------
d72fc2aace31 201027_1
hgs
parents:
diff changeset
  3212
__CONSTRUCT_STEP__(FbsGlyphData)