os/textandloc/fontservices/fontstore/src/linkedfonts.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <s32file.h>
sl@0
    20
#include <graphics/shapeimpl.h>
sl@0
    21
#include "FNTSTORE.H"
sl@0
    22
#include "OPENFONT.H"
sl@0
    23
#include "FNTBODY.H"
sl@0
    24
#include "FNTSTD.H"
sl@0
    25
#include <graphics/shaperparams.h>
sl@0
    26
#include "linkedfonts.h"
sl@0
    27
#include "linkedfontsprivate.h"
sl@0
    28
#include "openfontsprivate.h"
sl@0
    29
#include "fbs.h"
sl@0
    30
#include <openfontlinkedtypefaceelementspec.h>
sl@0
    31
#include <graphics/openfontlinkedtypefacespecification.h>
sl@0
    32
sl@0
    33
EXPORT_C CLinkedTypefaceSpecification* CLinkedTypefaceSpecification::NewLC(const TDesC& aTypefaceName)
sl@0
    34
	{
sl@0
    35
	CLinkedTypefaceSpecification* self = new (ELeave) CLinkedTypefaceSpecification();
sl@0
    36
	CleanupStack::PushL(self);
sl@0
    37
	self->ConstructL(aTypefaceName);
sl@0
    38
	return self;
sl@0
    39
	}
sl@0
    40
sl@0
    41
CLinkedTypefaceSpecification::CLinkedTypefaceSpecification()
sl@0
    42
	{
sl@0
    43
	}
sl@0
    44
sl@0
    45
void CLinkedTypefaceSpecification::ConstructL(const TDesC &aTypefaceName)
sl@0
    46
	{
sl@0
    47
	iBody = new (ELeave) CLinkedTypefaceSpecificationBody();
sl@0
    48
sl@0
    49
	TInt length = aTypefaceName.Length();
sl@0
    50
	if ((length > KMaxTypefaceNameLength) || (length == 0))
sl@0
    51
		User::Leave(KErrArgument);
sl@0
    52
sl@0
    53
	iBody->iLinkedTypefaceName = aTypefaceName.AllocL();
sl@0
    54
	}
sl@0
    55
sl@0
    56
EXPORT_C void CLinkedTypefaceSpecification::AddTypefaceAtIndexL(CLinkedTypefaceElementSpec& aElementSpec, TInt aIndex)
sl@0
    57
	{
sl@0
    58
	DoAddTypefaceL(aElementSpec, aIndex);
sl@0
    59
	}
sl@0
    60
sl@0
    61
EXPORT_C void CLinkedTypefaceSpecification::AddTypefaceAtBackL(CLinkedTypefaceElementSpec& aElementSpec)
sl@0
    62
	{
sl@0
    63
	DoAddTypefaceL(aElementSpec, iBody->iTypefaces.Count());
sl@0
    64
	}
sl@0
    65
sl@0
    66
EXPORT_C TInt CLinkedTypefaceSpecification::RemoveTypeface(TInt aIndex)
sl@0
    67
	{
sl@0
    68
	if  ( (aIndex < iBody->iTypefaces.Count()) && (aIndex >= 0) )
sl@0
    69
		{
sl@0
    70
		CLinkedTypefaceElementSpec* elementSpec = iBody->iTypefaces[aIndex];
sl@0
    71
		iBody->iTypefaces.Remove(aIndex);
sl@0
    72
		delete elementSpec;
sl@0
    73
		return KErrNone;
sl@0
    74
		}
sl@0
    75
	else
sl@0
    76
		return KErrNotFound;
sl@0
    77
	}
sl@0
    78
sl@0
    79
EXPORT_C void CLinkedTypefaceSpecification::RegisterLinkedTypefaceL(CFbsTypefaceStore& aStore)
sl@0
    80
	{
sl@0
    81
	//Leave if there is no canonical element, or there are multiples.
sl@0
    82
	//The remaining validation must be performed in fntstore.
sl@0
    83
	User::LeaveIfError(CanonicalIndex());
sl@0
    84
	User::LeaveIfError(aStore.RegisterLinkedTypeface(*this));
sl@0
    85
	}
sl@0
    86
sl@0
    87
EXPORT_C void CLinkedTypefaceSpecification::FetchLinkedTypefaceSpecificationL(CFbsTypefaceStore& aStore)
sl@0
    88
	{	
sl@0
    89
	aStore.GetLinkedTypefaceL(*this);
sl@0
    90
	}
sl@0
    91
sl@0
    92
EXPORT_C TInt CLinkedTypefaceSpecification::TypefaceCount() const
sl@0
    93
	{
sl@0
    94
	return iBody->iTypefaces.Count();
sl@0
    95
	}
sl@0
    96
sl@0
    97
EXPORT_C TPtrC CLinkedTypefaceSpecification::Name() const
sl@0
    98
	{
sl@0
    99
	return *iBody->iLinkedTypefaceName;
sl@0
   100
	}
sl@0
   101
sl@0
   102
EXPORT_C CLinkedTypefaceSpecification::~CLinkedTypefaceSpecification()
sl@0
   103
	{
sl@0
   104
	delete iBody;
sl@0
   105
	}
sl@0
   106
sl@0
   107
EXPORT_C TInt CLinkedTypefaceSpecification::CanonicalIndex()
sl@0
   108
	{
sl@0
   109
	TInt index = KErrNotFound;
sl@0
   110
	for (TInt i = iBody->iTypefaces.Count()-1 ; i >= 0; i--)
sl@0
   111
		{
sl@0
   112
		if (iBody->iTypefaces[i]->Canonical())
sl@0
   113
			{
sl@0
   114
			if (index == KErrNotFound)
sl@0
   115
				index = i;
sl@0
   116
			else 
sl@0
   117
				return KErrOverflow;
sl@0
   118
			}
sl@0
   119
		}
sl@0
   120
	return index;
sl@0
   121
	}
sl@0
   122
sl@0
   123
EXPORT_C CLinkedTypefaceElementSpec* CLinkedTypefaceSpecification::Typeface(TInt aIndex) const
sl@0
   124
	{
sl@0
   125
	if ((aIndex >= iBody->iTypefaces.Count()) || (aIndex < 0))
sl@0
   126
		{
sl@0
   127
		return NULL;
sl@0
   128
		}
sl@0
   129
	else
sl@0
   130
		{
sl@0
   131
		return iBody->iTypefaces[aIndex];
sl@0
   132
		}
sl@0
   133
	}
sl@0
   134
sl@0
   135
void CLinkedTypefaceSpecification::DoAddTypefaceL(CLinkedTypefaceElementSpec& aElementSpec, TInt aPos)
sl@0
   136
	{
sl@0
   137
	if (iBody->iTypefaces.Count() == KMaxLinkedTypefaces)
sl@0
   138
		User::Leave(KErrOverflow);
sl@0
   139
	
sl@0
   140
	TInt err = iBody->iTypefaces.Find(&aElementSpec);
sl@0
   141
sl@0
   142
	if (err != KErrNotFound)
sl@0
   143
		User::Leave(KErrAlreadyExists);
sl@0
   144
	
sl@0
   145
	if (aElementSpec.Canonical() && CanonicalIndex() != KErrNotFound)
sl@0
   146
		User::Leave(KErrArgument);
sl@0
   147
sl@0
   148
	if (GroupById(aElementSpec.GroupId()) == NULL)
sl@0
   149
		User::Leave(KErrArgument);
sl@0
   150
	
sl@0
   151
	err = iBody->iTypefaces.Insert(&aElementSpec, aPos);
sl@0
   152
sl@0
   153
	User::LeaveIfError(err);
sl@0
   154
	}
sl@0
   155
sl@0
   156
EXPORT_C void CLinkedTypefaceSpecification::AddLinkedTypefaceGroupL(CLinkedTypefaceGroup& aGroup)
sl@0
   157
	{
sl@0
   158
	if (iBody->iGroups.Count() == KMaxLinkedTypefaceGroups)
sl@0
   159
		User::Leave(KErrOverflow);
sl@0
   160
	
sl@0
   161
	for (TInt i = iBody->iGroups.Count()-1 ; i >= 0 ; i--)
sl@0
   162
		{
sl@0
   163
		if (iBody->iGroups[i]->GroupId() == aGroup.GroupId())
sl@0
   164
			User::Leave(KErrAlreadyExists);
sl@0
   165
		}
sl@0
   166
	iBody->iGroups.AppendL(&aGroup);
sl@0
   167
	}
sl@0
   168
sl@0
   169
EXPORT_C TInt CLinkedTypefaceSpecification::RemoveLinkedTypefaceGroup(TInt aGroupId)
sl@0
   170
	{
sl@0
   171
	//Search for & remove the group if it exists
sl@0
   172
	CLinkedTypefaceGroup* remove = GroupById(aGroupId);
sl@0
   173
	//If the group has been found & removed remove all associated typefaces
sl@0
   174
	if (remove)
sl@0
   175
		{
sl@0
   176
		CLinkedTypefaceElementSpec* elementSpec;
sl@0
   177
		for (TInt i = iBody->iTypefaces.Count()-1 ; i >= 0 ; i--)
sl@0
   178
			{
sl@0
   179
			elementSpec = iBody->iTypefaces[i];
sl@0
   180
			if (elementSpec->GroupId() == aGroupId)
sl@0
   181
				RemoveTypeface(i);
sl@0
   182
			}
sl@0
   183
		iBody->iGroups.Remove(iBody->iGroups.Find(remove));
sl@0
   184
		delete remove;
sl@0
   185
		return KErrNone;
sl@0
   186
		}
sl@0
   187
	return KErrNotFound;
sl@0
   188
	}
sl@0
   189
sl@0
   190
EXPORT_C CLinkedTypefaceGroup* CLinkedTypefaceSpecification::GroupById(TInt aGroupId) const
sl@0
   191
	{
sl@0
   192
	TInt index;
sl@0
   193
	TBool found = EFalse;
sl@0
   194
	for (index = iBody->iGroups.Count()-1; index != -1 ; index--)
sl@0
   195
		{
sl@0
   196
		if (iBody->iGroups[index]->GroupId() == aGroupId)
sl@0
   197
			{
sl@0
   198
			found = ETrue;
sl@0
   199
			break;
sl@0
   200
			}
sl@0
   201
		}
sl@0
   202
	
sl@0
   203
	if (found)
sl@0
   204
		return iBody->iGroups[index];
sl@0
   205
	else
sl@0
   206
		return NULL;
sl@0
   207
	}
sl@0
   208
sl@0
   209
EXPORT_C CLinkedTypefaceGroup* CLinkedTypefaceSpecification::Group(TInt aGroupIndex) const
sl@0
   210
	{
sl@0
   211
	if ( (aGroupIndex >= 0) && (aGroupIndex < iBody->iGroups.Count()) )
sl@0
   212
		return iBody->iGroups[aGroupIndex];
sl@0
   213
	else
sl@0
   214
		return NULL;
sl@0
   215
	}
sl@0
   216
sl@0
   217
EXPORT_C TInt CLinkedTypefaceSpecification::GroupCount() const
sl@0
   218
	{
sl@0
   219
	return iBody->iGroups.Count();
sl@0
   220
	}
sl@0
   221
sl@0
   222
EXPORT_C void CLinkedTypefaceSpecification::Clear()
sl@0
   223
	{
sl@0
   224
	iBody->iGroups.ResetAndDestroy();
sl@0
   225
	iBody->iTypefaces.ResetAndDestroy();
sl@0
   226
	}
sl@0
   227
sl@0
   228
EXPORT_C void CLinkedTypefaceSpecification::UpdateLinkedTypefaceL(CFbsTypefaceStore& aStore)
sl@0
   229
	{
sl@0
   230
	User::LeaveIfError(aStore.UpdateLinkedTypeface(*this));
sl@0
   231
	}
sl@0
   232
sl@0
   233
CLinkedTypefaceSpecificationBody::CLinkedTypefaceSpecificationBody()
sl@0
   234
	{
sl@0
   235
	}
sl@0
   236
sl@0
   237
CLinkedTypefaceSpecificationBody::~CLinkedTypefaceSpecificationBody()
sl@0
   238
	{
sl@0
   239
	delete iLinkedTypefaceName;
sl@0
   240
	iTypefaces.ResetAndDestroy();
sl@0
   241
	iGroups.ResetAndDestroy();
sl@0
   242
	}
sl@0
   243
sl@0
   244
EXPORT_C CLinkedTypefaceElementSpec* CLinkedTypefaceElementSpec::NewLC(const TDesC& aElementName, TInt aGroupId)
sl@0
   245
	{
sl@0
   246
	CLinkedTypefaceElementSpec* self = new(ELeave)CLinkedTypefaceElementSpec(aGroupId);
sl@0
   247
	CleanupStack::PushL(self);
sl@0
   248
	self->ConstructL(aElementName);
sl@0
   249
	return self;
sl@0
   250
	}
sl@0
   251
sl@0
   252
EXPORT_C CLinkedTypefaceElementSpec::~CLinkedTypefaceElementSpec()
sl@0
   253
	{
sl@0
   254
	delete iElementName;
sl@0
   255
	}
sl@0
   256
sl@0
   257
EXPORT_C TPtrC CLinkedTypefaceElementSpec::ElementName() const
sl@0
   258
	{
sl@0
   259
	return *iElementName;
sl@0
   260
	}
sl@0
   261
sl@0
   262
EXPORT_C void CLinkedTypefaceElementSpec::SetCanonical(TBool aIsCanonical)
sl@0
   263
	{
sl@0
   264
	iIsCanonical = aIsCanonical;
sl@0
   265
	}
sl@0
   266
sl@0
   267
EXPORT_C TBool CLinkedTypefaceElementSpec::Canonical() const
sl@0
   268
	{
sl@0
   269
	return iIsCanonical;
sl@0
   270
	}
sl@0
   271
sl@0
   272
CLinkedTypefaceElementSpec::CLinkedTypefaceElementSpec(TInt aGroupId)
sl@0
   273
	{
sl@0
   274
	iGroupId = aGroupId;
sl@0
   275
	iIsCanonical = EFalse;
sl@0
   276
	}
sl@0
   277
sl@0
   278
EXPORT_C TInt CLinkedTypefaceElementSpec::GroupId() const
sl@0
   279
	{
sl@0
   280
	return iGroupId;
sl@0
   281
	}
sl@0
   282
sl@0
   283
EXPORT_C COpenFontLinkedTypefaceSpecification* COpenFontLinkedTypefaceSpecification::NewLC(const TDesC& aTypefaceName)
sl@0
   284
	{
sl@0
   285
	COpenFontLinkedTypefaceSpecification* self = new (ELeave) COpenFontLinkedTypefaceSpecification();
sl@0
   286
	CleanupStack::PushL(self);
sl@0
   287
	self->ConstructL(aTypefaceName);
sl@0
   288
	return self;
sl@0
   289
	}
sl@0
   290
sl@0
   291
EXPORT_C COpenFontLinkedTypefaceSpecification* COpenFontLinkedTypefaceSpecification::NewLC(const TLinkedTypefaceSpecificationArgs& aSpecArgs)
sl@0
   292
	{
sl@0
   293
	COpenFontLinkedTypefaceSpecification* self = new (ELeave) COpenFontLinkedTypefaceSpecification();
sl@0
   294
	CleanupStack::PushL(self);
sl@0
   295
	self->ConstructL(aSpecArgs);
sl@0
   296
	return self;
sl@0
   297
	}
sl@0
   298
sl@0
   299
COpenFontLinkedTypefaceSpecification::COpenFontLinkedTypefaceSpecification()
sl@0
   300
	{
sl@0
   301
	}
sl@0
   302
sl@0
   303
void COpenFontLinkedTypefaceSpecification::ConstructL(const TDesC &aTypefaceName)
sl@0
   304
	{
sl@0
   305
	TInt length = aTypefaceName.Length();
sl@0
   306
	if ((length > KMaxTypefaceNameLength) || (length == 0))
sl@0
   307
		User::Leave(KErrArgument);
sl@0
   308
sl@0
   309
	iLinkedTypefaceName = aTypefaceName.AllocL();
sl@0
   310
	}
sl@0
   311
sl@0
   312
void COpenFontLinkedTypefaceSpecification::ConstructL(const TLinkedTypefaceSpecificationArgs& aSpecArgs)
sl@0
   313
	{
sl@0
   314
	iLinkedTypefaceName = aSpecArgs.iName.AllocL();
sl@0
   315
sl@0
   316
	TInt i;
sl@0
   317
	
sl@0
   318
	for (i = 0; i != aSpecArgs.iGroupSize ; i++)
sl@0
   319
		{
sl@0
   320
		CLinkedTypefaceGroup* grp = CLinkedTypefaceGroup::NewLC(aSpecArgs.iGroups[i].iGroupId);
sl@0
   321
		grp->SetBaselineShift(aSpecArgs.iGroups[i].iBaselineShift);
sl@0
   322
		grp->SetBoldnessPercentage(aSpecArgs.iGroups[i].iBoldnessPercentage);
sl@0
   323
		grp->SetItalicAngle(aSpecArgs.iGroups[i].iItalicAngle);
sl@0
   324
		grp->SetScalingOption(aSpecArgs.iGroups[i].iScalingOption);
sl@0
   325
		AddLinkedTypefaceGroupL(*grp);
sl@0
   326
		CleanupStack::Pop(grp);
sl@0
   327
		}
sl@0
   328
	
sl@0
   329
	for (i = 0 ; i != aSpecArgs.iSize ; i++)
sl@0
   330
		{
sl@0
   331
		COpenFontLinkedTypefaceElementSpec* es = COpenFontLinkedTypefaceElementSpec::NewLC(aSpecArgs.iTypefaces[i].iName, aSpecArgs.iTypefaces[i].iGroupId);
sl@0
   332
		es->SetCanonical(aSpecArgs.iTypefaces[i].iIsCanonical);
sl@0
   333
		AddTypefaceAtBackL(*es);
sl@0
   334
		CleanupStack::Pop(es);
sl@0
   335
		}
sl@0
   336
	
sl@0
   337
	//ASSERT Can. Indexs match.
sl@0
   338
	}
sl@0
   339
sl@0
   340
EXPORT_C COpenFontLinkedTypefaceSpecification::~COpenFontLinkedTypefaceSpecification()
sl@0
   341
	{
sl@0
   342
	delete iLinkedTypefaceName;
sl@0
   343
	iTypefaces.ResetAndDestroy();
sl@0
   344
	iTypefaces.Close();
sl@0
   345
	iGroups.ResetAndDestroy();
sl@0
   346
	iGroups.Close();
sl@0
   347
	}
sl@0
   348
sl@0
   349
EXPORT_C void COpenFontLinkedTypefaceSpecification::AddTypefaceAtIndexL(COpenFontLinkedTypefaceElementSpec& aElementSpec, TInt aIndex)
sl@0
   350
	{
sl@0
   351
	DoAddTypefaceL(aElementSpec, aIndex);
sl@0
   352
	}
sl@0
   353
sl@0
   354
EXPORT_C void COpenFontLinkedTypefaceSpecification::AddTypefaceAtBackL(COpenFontLinkedTypefaceElementSpec& aElementSpec)
sl@0
   355
	{
sl@0
   356
	DoAddTypefaceL(aElementSpec, iTypefaces.Count());
sl@0
   357
	}
sl@0
   358
sl@0
   359
EXPORT_C TInt COpenFontLinkedTypefaceSpecification::RemoveTypeface(TInt aIndex)
sl@0
   360
	{
sl@0
   361
	if  ( (aIndex < iTypefaces.Count()) && (aIndex >= 0) )
sl@0
   362
		{
sl@0
   363
		COpenFontLinkedTypefaceElementSpec* elementSpec = iTypefaces[aIndex];
sl@0
   364
		iTypefaces.Remove(aIndex);
sl@0
   365
sl@0
   366
		delete elementSpec;
sl@0
   367
		return KErrNone;
sl@0
   368
		}
sl@0
   369
	else
sl@0
   370
		return KErrNotFound;
sl@0
   371
	}
sl@0
   372
sl@0
   373
EXPORT_C TInt COpenFontLinkedTypefaceSpecification::TypefaceCount() const
sl@0
   374
	{
sl@0
   375
	return iTypefaces.Count();
sl@0
   376
	}
sl@0
   377
sl@0
   378
EXPORT_C TPtrC COpenFontLinkedTypefaceSpecification::Name() const
sl@0
   379
	{
sl@0
   380
	return *iLinkedTypefaceName;
sl@0
   381
	}
sl@0
   382
sl@0
   383
EXPORT_C TInt COpenFontLinkedTypefaceSpecification::CanonicalIndex() const
sl@0
   384
	{
sl@0
   385
	TInt index = KErrNotFound;
sl@0
   386
	for (TInt i = iTypefaces.Count()-1 ; i >= 0; i--)
sl@0
   387
		{
sl@0
   388
		if (iTypefaces[i]->Canonical())
sl@0
   389
			{
sl@0
   390
			if (index == KErrNotFound)
sl@0
   391
				index = i;
sl@0
   392
			else 
sl@0
   393
				return KErrOverflow;
sl@0
   394
			}
sl@0
   395
		}
sl@0
   396
	return index;
sl@0
   397
	}
sl@0
   398
sl@0
   399
EXPORT_C COpenFontLinkedTypefaceElementSpec* COpenFontLinkedTypefaceSpecification::Typeface(TInt aIndex) const
sl@0
   400
	{
sl@0
   401
	if ((aIndex >= iTypefaces.Count()) || (aIndex < 0))
sl@0
   402
		{
sl@0
   403
		return NULL;
sl@0
   404
		}
sl@0
   405
	else
sl@0
   406
		{
sl@0
   407
		return iTypefaces[aIndex];
sl@0
   408
		}
sl@0
   409
	}
sl@0
   410
sl@0
   411
void COpenFontLinkedTypefaceSpecification::DoAddTypefaceL(COpenFontLinkedTypefaceElementSpec& aElementSpec, TInt aPos)
sl@0
   412
	{
sl@0
   413
	if (iTypefaces.Count() == KMaxLinkedTypefaces)
sl@0
   414
		User::Leave(KErrOverflow);
sl@0
   415
	
sl@0
   416
	TInt err = iTypefaces.Find(&aElementSpec);
sl@0
   417
sl@0
   418
	if (err != KErrNotFound)
sl@0
   419
		User::Leave(KErrAlreadyExists);
sl@0
   420
	
sl@0
   421
	if (aElementSpec.Canonical() && CanonicalIndex() >= 0)
sl@0
   422
		User::Leave(KErrArgument);
sl@0
   423
	
sl@0
   424
	if (GroupById(aElementSpec.GroupId()) == NULL)
sl@0
   425
		User::Leave(KErrArgument);
sl@0
   426
	
sl@0
   427
	err = iTypefaces.Insert(&aElementSpec, aPos);
sl@0
   428
sl@0
   429
	User::LeaveIfError(err);
sl@0
   430
	}
sl@0
   431
sl@0
   432
EXPORT_C void COpenFontLinkedTypefaceSpecification::AddLinkedTypefaceGroupL(CLinkedTypefaceGroup& aGroup)
sl@0
   433
	{
sl@0
   434
	if (iGroups.Count() == KMaxLinkedTypefaceGroups)
sl@0
   435
		User::Leave(KErrOverflow);
sl@0
   436
	
sl@0
   437
	for (TInt i = iGroups.Count()-1 ; i >= 0 ; i--)
sl@0
   438
		{
sl@0
   439
		if (iGroups[i]->GroupId() == aGroup.GroupId())
sl@0
   440
			User::Leave(KErrAlreadyExists);
sl@0
   441
		}
sl@0
   442
	iGroups.AppendL(&aGroup);
sl@0
   443
	}
sl@0
   444
sl@0
   445
EXPORT_C TInt COpenFontLinkedTypefaceSpecification::RemoveLinkedTypefaceGroup(TInt aGroupId)
sl@0
   446
	{
sl@0
   447
	//Search for & remove the group if it exists
sl@0
   448
	CLinkedTypefaceGroup* remove = GroupById(aGroupId);
sl@0
   449
	//If the group has been found & removed remove all associated typefaces
sl@0
   450
	if (remove)
sl@0
   451
		{
sl@0
   452
		COpenFontLinkedTypefaceElementSpec* elementSpec;
sl@0
   453
		for (TInt i = iTypefaces.Count()-1 ; i >= 0 ; i--)
sl@0
   454
			{
sl@0
   455
			elementSpec = iTypefaces[i];
sl@0
   456
			if (elementSpec->GroupId() == aGroupId)
sl@0
   457
				RemoveTypeface(i);
sl@0
   458
			}
sl@0
   459
		iGroups.Remove(iGroups.Find(remove));
sl@0
   460
		delete remove;
sl@0
   461
		return KErrNone;
sl@0
   462
		}
sl@0
   463
	return KErrNotFound;
sl@0
   464
	}
sl@0
   465
sl@0
   466
EXPORT_C CLinkedTypefaceGroup* COpenFontLinkedTypefaceSpecification::GroupById(TInt aGroupId) const
sl@0
   467
	{
sl@0
   468
	TInt index;
sl@0
   469
	TBool found = EFalse;
sl@0
   470
	for (index = iGroups.Count()-1; index != -1 ; index--)
sl@0
   471
		{
sl@0
   472
		if (iGroups[index]->GroupId() == aGroupId)
sl@0
   473
			{
sl@0
   474
			found = ETrue;
sl@0
   475
			break;
sl@0
   476
			}
sl@0
   477
		}
sl@0
   478
	
sl@0
   479
	if (found)
sl@0
   480
		return iGroups[index];
sl@0
   481
	else
sl@0
   482
		return NULL;
sl@0
   483
	}
sl@0
   484
sl@0
   485
EXPORT_C const CLinkedTypefaceGroup* COpenFontLinkedTypefaceSpecification::Group(TInt aGroupIndex) const
sl@0
   486
	{
sl@0
   487
	if ( (aGroupIndex >= 0) && (aGroupIndex < iGroups.Count()) )
sl@0
   488
		return iGroups[aGroupIndex];
sl@0
   489
	else
sl@0
   490
		return NULL;
sl@0
   491
	}
sl@0
   492
sl@0
   493
EXPORT_C TInt COpenFontLinkedTypefaceSpecification::GroupCount() const
sl@0
   494
	{
sl@0
   495
	return iGroups.Count();
sl@0
   496
	}
sl@0
   497
sl@0
   498
COpenFontLinkedTypefaceSpecificationBody::COpenFontLinkedTypefaceSpecificationBody()
sl@0
   499
	{
sl@0
   500
	}
sl@0
   501
sl@0
   502
// destructor
sl@0
   503
COpenFontLinkedTypefaceSpecificationBody::~COpenFontLinkedTypefaceSpecificationBody()
sl@0
   504
	{
sl@0
   505
	delete iLinkedTypefaceName;
sl@0
   506
	iTypefaces.Reset();
sl@0
   507
	}
sl@0
   508
sl@0
   509
EXPORT_C COpenFontLinkedTypefaceElementSpec* COpenFontLinkedTypefaceElementSpec::NewLC(const TDesC& aElementName, TInt aGroupId)
sl@0
   510
	{
sl@0
   511
	COpenFontLinkedTypefaceElementSpec* self = new(ELeave)COpenFontLinkedTypefaceElementSpec(aGroupId);
sl@0
   512
	CleanupStack::PushL(self);
sl@0
   513
	self->ConstructL(aElementName);
sl@0
   514
	return self;
sl@0
   515
	}
sl@0
   516
sl@0
   517
EXPORT_C COpenFontLinkedTypefaceElementSpec::~COpenFontLinkedTypefaceElementSpec()
sl@0
   518
	{
sl@0
   519
	delete iElementName;
sl@0
   520
	delete iFileName;
sl@0
   521
	}
sl@0
   522
sl@0
   523
EXPORT_C TPtrC COpenFontLinkedTypefaceElementSpec::ElementName() const
sl@0
   524
	{
sl@0
   525
	return *iElementName;
sl@0
   526
	}
sl@0
   527
sl@0
   528
EXPORT_C void COpenFontLinkedTypefaceElementSpec::SetCanonical(TBool aIsCanonical)
sl@0
   529
	{
sl@0
   530
	iIsCanonical = aIsCanonical;
sl@0
   531
	}
sl@0
   532
sl@0
   533
EXPORT_C TBool COpenFontLinkedTypefaceElementSpec::Canonical() const
sl@0
   534
	{
sl@0
   535
	return iIsCanonical;
sl@0
   536
	}
sl@0
   537
sl@0
   538
EXPORT_C TInt COpenFontLinkedTypefaceElementSpec::GroupId() const
sl@0
   539
	{
sl@0
   540
	return iGroupId;
sl@0
   541
	}
sl@0
   542
sl@0
   543
EXPORT_C TPtrC COpenFontLinkedTypefaceElementSpec::FileName() const
sl@0
   544
	{
sl@0
   545
	return *iFileName;
sl@0
   546
	}
sl@0
   547
sl@0
   548
EXPORT_C void COpenFontLinkedTypefaceElementSpec::SetFileNameL(const TDesC& aFileName)
sl@0
   549
	{
sl@0
   550
	iFileName = aFileName.AllocL();
sl@0
   551
	}
sl@0
   552
sl@0
   553
COpenFontLinkedTypefaceElementSpec::COpenFontLinkedTypefaceElementSpec(TInt aGroupId)
sl@0
   554
	{
sl@0
   555
	iGroupId = aGroupId;
sl@0
   556
	}
sl@0
   557
sl@0
   558
void COpenFontLinkedTypefaceElementSpec::ConstructL(const TDesC& aName)
sl@0
   559
	{
sl@0
   560
	TInt length = aName.Length();
sl@0
   561
	if ((length == 0) || (length > KMaxTypefaceNameLength))
sl@0
   562
		User::Leave(KErrArgument);
sl@0
   563
	iElementName = aName.AllocL();
sl@0
   564
	}
sl@0
   565
sl@0
   566
void CLinkedTypefaceElementSpec::ConstructL(const TDesC& aName)
sl@0
   567
	{
sl@0
   568
	TInt length = aName.Length();
sl@0
   569
	if ((length == 0) || (length > KMaxTypefaceNameLength))
sl@0
   570
		User::Leave(KErrArgument);
sl@0
   571
	iElementName = aName.AllocL();
sl@0
   572
	}
sl@0
   573
sl@0
   574
EXPORT_C CLinkedTypefaceGroup* CLinkedTypefaceGroup::NewLC(TInt aGroupId)
sl@0
   575
	{
sl@0
   576
	CLinkedTypefaceGroup* self = new (ELeave) CLinkedTypefaceGroup(aGroupId);
sl@0
   577
	CleanupStack::PushL(self);
sl@0
   578
	return self;
sl@0
   579
	}
sl@0
   580
sl@0
   581
CLinkedTypefaceGroup::CLinkedTypefaceGroup(TInt aGroupId)
sl@0
   582
	{
sl@0
   583
	iGroupId = aGroupId;
sl@0
   584
	iScalingOption = EScalingNone;
sl@0
   585
	iBaselineShift = ENoBaselineShift;
sl@0
   586
	iBoldnessPercentage = -1;
sl@0
   587
	iItalicAngle = -1;
sl@0
   588
	}
sl@0
   589
sl@0
   590
CLinkedTypefaceGroup::~CLinkedTypefaceGroup()
sl@0
   591
	{
sl@0
   592
	}
sl@0
   593
sl@0
   594
EXPORT_C void CLinkedTypefaceGroup::SetScalingOption(CLinkedTypefaceGroup::TScalingOption aOption)
sl@0
   595
	{
sl@0
   596
	iScalingOption = aOption;
sl@0
   597
	}
sl@0
   598
sl@0
   599
EXPORT_C CLinkedTypefaceGroup::TScalingOption CLinkedTypefaceGroup::ScalingOption() const
sl@0
   600
	{
sl@0
   601
	return iScalingOption;
sl@0
   602
	}
sl@0
   603
sl@0
   604
EXPORT_C void CLinkedTypefaceGroup::SetBaselineShift(CLinkedTypefaceGroup::TBaselineShift aShift)
sl@0
   605
	{
sl@0
   606
	iBaselineShift = aShift;
sl@0
   607
	}
sl@0
   608
sl@0
   609
EXPORT_C CLinkedTypefaceGroup::TBaselineShift CLinkedTypefaceGroup::BaselineShift() const
sl@0
   610
	{
sl@0
   611
	return iBaselineShift;
sl@0
   612
	}
sl@0
   613
sl@0
   614
EXPORT_C void CLinkedTypefaceGroup::SetBoldnessPercentage(TInt aPercentage)
sl@0
   615
	{
sl@0
   616
	iBoldnessPercentage = aPercentage;
sl@0
   617
	}
sl@0
   618
sl@0
   619
EXPORT_C TInt CLinkedTypefaceGroup::BoldnessPercentage() const
sl@0
   620
	{
sl@0
   621
	return iBoldnessPercentage;
sl@0
   622
	}
sl@0
   623
sl@0
   624
EXPORT_C TInt CLinkedTypefaceGroup::GroupId() const
sl@0
   625
	{
sl@0
   626
	return iGroupId;
sl@0
   627
	}
sl@0
   628
sl@0
   629
EXPORT_C TInt CLinkedTypefaceGroup::ItalicAngle() const
sl@0
   630
	{
sl@0
   631
	return iItalicAngle;
sl@0
   632
	}
sl@0
   633
sl@0
   634
EXPORT_C void CLinkedTypefaceGroup::SetItalicAngle(TInt aAngle)
sl@0
   635
	{
sl@0
   636
	iItalicAngle = aAngle;
sl@0
   637
	}
sl@0
   638
sl@0
   639
EXPORT_C void TLinkedTypefaceSpecificationArgs::operator =(const CLinkedTypefaceSpecification& aRhs)
sl@0
   640
	{
sl@0
   641
	iSize = aRhs.TypefaceCount();
sl@0
   642
	iGroupSize = aRhs.GroupCount();
sl@0
   643
	iName = aRhs.Name();
sl@0
   644
	
sl@0
   645
	TInt i;
sl@0
   646
	for (i = 0 ; i != iSize ; i++)
sl@0
   647
		iTypefaces[i] = aRhs.Typeface(i);
sl@0
   648
	
sl@0
   649
	for (i = 0 ; i != iGroupSize ; i++)
sl@0
   650
		iGroups[i] = aRhs.Group(i);
sl@0
   651
	}
sl@0
   652
sl@0
   653
EXPORT_C void TLinkedTypefaceSpecificationArgs::operator =(const COpenFontLinkedTypefaceSpecification &aRhs)
sl@0
   654
	{
sl@0
   655
	iSize = aRhs.TypefaceCount();
sl@0
   656
	iGroupSize = aRhs.GroupCount();
sl@0
   657
	iName = aRhs.Name();
sl@0
   658
	
sl@0
   659
	TInt i;
sl@0
   660
	for (i = 0 ; i != iSize ; i++)
sl@0
   661
		iTypefaces[i] = aRhs.Typeface(i);
sl@0
   662
	
sl@0
   663
	for (i = 0 ; i != iGroupSize ; i++)
sl@0
   664
		iGroups[i] = aRhs.Group(i);
sl@0
   665
	}
sl@0
   666
sl@0
   667
void TLinkedTypefaceElementSpecArgs::operator = (const CLinkedTypefaceElementSpec* aRhs)
sl@0
   668
	{
sl@0
   669
	iIsCanonical = aRhs->Canonical();
sl@0
   670
	iGroupId = aRhs->GroupId();
sl@0
   671
	iName = aRhs->ElementName();
sl@0
   672
	}
sl@0
   673
sl@0
   674
void TLinkedTypefaceElementSpecArgs::operator = (const COpenFontLinkedTypefaceElementSpec* aRhs)
sl@0
   675
	{
sl@0
   676
	iIsCanonical = aRhs->Canonical();
sl@0
   677
	iGroupId = aRhs->GroupId();
sl@0
   678
	iName = aRhs->ElementName();
sl@0
   679
	}
sl@0
   680
sl@0
   681
void TLinkedTypefaceGroupArgs::operator =(const CLinkedTypefaceGroup* aRhs)
sl@0
   682
	{
sl@0
   683
	iGroupId = aRhs->GroupId();
sl@0
   684
	iScalingOption = aRhs->ScalingOption();
sl@0
   685
	iBaselineShift = aRhs->BaselineShift();
sl@0
   686
	iBoldnessPercentage = aRhs->BoldnessPercentage();
sl@0
   687
	iItalicAngle = aRhs->ItalicAngle();
sl@0
   688
	}