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