fontservices/textbase/sgdi/BidiCompact.cpp
author hgs
Mon, 12 Jul 2010 14:38:26 +0800
changeset 45 662fa7de7023
permissions -rw-r--r--
201024_05
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
662fa7de7023 201024_05
hgs
parents:
diff changeset
     1
// Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies).
662fa7de7023 201024_05
hgs
parents:
diff changeset
     2
// All rights reserved.
662fa7de7023 201024_05
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
662fa7de7023 201024_05
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
662fa7de7023 201024_05
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
662fa7de7023 201024_05
hgs
parents:
diff changeset
     7
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
     8
// Initial Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    10
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    11
// Contributors:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    12
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    13
// Description:
662fa7de7023 201024_05
hgs
parents:
diff changeset
    14
//
662fa7de7023 201024_05
hgs
parents:
diff changeset
    15
662fa7de7023 201024_05
hgs
parents:
diff changeset
    16
#include "BidiCompact.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    17
#include "BidiCopy.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    18
#include <textbase.h>
662fa7de7023 201024_05
hgs
parents:
diff changeset
    19
662fa7de7023 201024_05
hgs
parents:
diff changeset
    20
static const TInt KZeroWidthJoiner = 0x200D;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    21
// This gets round the compiler warning about converting
662fa7de7023 201024_05
hgs
parents:
diff changeset
    22
// EFRightToLeft to unsigned long.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    23
inline TUint FRightToLeft() { return static_cast<TUint>(TRunInfoCompact::EFRightToLeft); }
662fa7de7023 201024_05
hgs
parents:
diff changeset
    24
662fa7de7023 201024_05
hgs
parents:
diff changeset
    25
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
    26
Constructs a run description without considering optimisations based
662fa7de7023 201024_05
hgs
parents:
diff changeset
    27
on the text itself.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    28
@param aStart Index of the start of the run.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    29
@param aLength Length of the run.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    30
@param aReverse ETrue if the run is right-to-left.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    31
@internalTechnology
662fa7de7023 201024_05
hgs
parents:
diff changeset
    32
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    33
TRunInfoCompact::TRunInfoCompact(TInt aStart, TInt aLength,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    34
	TBool aReverse)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    35
	: iStart(aStart), iLengthAndType(aLength)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    36
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    37
	if (aReverse)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    38
		iLengthAndType |= FRightToLeft();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    39
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    40
662fa7de7023 201024_05
hgs
parents:
diff changeset
    41
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
    42
Constructs a run description.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    43
662fa7de7023 201024_05
hgs
parents:
diff changeset
    44
@param aStart Index of the start of the run.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    45
@param aLength Length of the run.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    46
@param aReverse ETrue if the run is right-to-left.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    47
@param aText The text that this run refers to (starting at index 0, not
662fa7de7023 201024_05
hgs
parents:
diff changeset
    48
the start of the run). This is required only to determine if optimisations 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    49
to the re-ordering are possible.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    50
@internalTechnology
662fa7de7023 201024_05
hgs
parents:
diff changeset
    51
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    52
TRunInfoCompact::TRunInfoCompact(TInt aStart, TInt aLength,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    53
	TBool aReverse, const TText* aText)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    54
	: iStart(aStart), iLengthAndType(aLength)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    55
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    56
	ASSERT(0 <= aLength);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    57
	ASSERT(aLength < 0x10000000);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    58
	ASSERT(0 <= aStart);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    59
	if (!aReverse)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    60
		return;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    61
	iLengthAndType |= FRightToLeft();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    62
	TUint32 flags = EFNoPairsNoCombiners | EFNoMirroredCharacters;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    63
	aText += aStart;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    64
662fa7de7023 201024_05
hgs
parents:
diff changeset
    65
	for (const TText* end = aText + aLength; aText < end && flags; ++aText)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    66
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    67
		TInt code = *aText;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    68
		if ((code & 0xF800) == 0xD800)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    69
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    70
			flags &= ~EFNoPairsNoCombiners;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    71
			if ((code & 0xFC00) == 0xDC00
662fa7de7023 201024_05
hgs
parents:
diff changeset
    72
				&& aText + 1 < end
662fa7de7023 201024_05
hgs
parents:
diff changeset
    73
				&& (aText[1] & 0xFC00) == 0xD800)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    74
				{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    75
				code = (aText[1] << 10) + (code & 0x3FF)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    76
					+ (0x10000 - 0xD800*0x400);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    77
				++aText;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    78
				}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    79
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    80
		TChar c = code;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    81
		if (c.GetCombiningClass() != 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    82
			flags &= ~EFNoPairsNoCombiners;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    83
		if (BidiCopy::Mirror(code) != code)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    84
			flags &= ~EFNoMirroredCharacters;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    85
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    86
	iLengthAndType |= flags;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    87
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    88
662fa7de7023 201024_05
hgs
parents:
diff changeset
    89
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
    90
Attempts to extend a run.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    91
662fa7de7023 201024_05
hgs
parents:
diff changeset
    92
@param aToBeAdded The run to be merged.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    93
@return ETrue if extension succeeded, EFalse if not.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    94
@internalTechnology
662fa7de7023 201024_05
hgs
parents:
diff changeset
    95
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
    96
TBool TRunInfoCompact::AddRun(const TRunInfoCompact& aToBeAdded)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    97
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    98
	TInt length = Length();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    99
	if (length == 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   100
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   101
		*this = aToBeAdded;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   102
		return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   103
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   104
662fa7de7023 201024_05
hgs
parents:
diff changeset
   105
	// Are both runs in the same direction?
662fa7de7023 201024_05
hgs
parents:
diff changeset
   106
	if ((iLengthAndType ^ aToBeAdded.iLengthAndType) & FRightToLeft())
662fa7de7023 201024_05
hgs
parents:
diff changeset
   107
		return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   108
662fa7de7023 201024_05
hgs
parents:
diff changeset
   109
	TBool rightToLeft = TypeFlags() & EFRightToLeft;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   110
	TInt end = rightToLeft?
662fa7de7023 201024_05
hgs
parents:
diff changeset
   111
		Start() - Length() : Start() + Length();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   112
662fa7de7023 201024_05
hgs
parents:
diff changeset
   113
	if (end != aToBeAdded.Start())
662fa7de7023 201024_05
hgs
parents:
diff changeset
   114
		return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   115
662fa7de7023 201024_05
hgs
parents:
diff changeset
   116
	length += aToBeAdded.Length();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   117
662fa7de7023 201024_05
hgs
parents:
diff changeset
   118
	iLengthAndType = length | (TypeFlags() & aToBeAdded.TypeFlags());
662fa7de7023 201024_05
hgs
parents:
diff changeset
   119
662fa7de7023 201024_05
hgs
parents:
diff changeset
   120
	if (rightToLeft)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   121
		iStart -= aToBeAdded.Length();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   122
662fa7de7023 201024_05
hgs
parents:
diff changeset
   123
	return ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   124
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   125
662fa7de7023 201024_05
hgs
parents:
diff changeset
   126
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
   127
Reorders text described by this run according to aContext. Allow 6 extra
662fa7de7023 201024_05
hgs
parents:
diff changeset
   128
bytes for a truncation.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   129
@param aDestination	Where to write this run of visually-ordered text to.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   130
@param aContext The source of the text to be ordered.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   131
@return	The first byte not written to: in other words, what aDestination
662fa7de7023 201024_05
hgs
parents:
diff changeset
   132
should be updated to.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   133
@internalTechnology
662fa7de7023 201024_05
hgs
parents:
diff changeset
   134
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
   135
TText* TRunInfoCompact::Reorder(TText* aDestination,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   136
	const TRunInfoCompact::TReorderingContext& aContext) const
662fa7de7023 201024_05
hgs
parents:
diff changeset
   137
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   138
	TInt start = Start();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   139
	if (aContext.iEnd < start)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   140
		// does not overlap
662fa7de7023 201024_05
hgs
parents:
diff changeset
   141
		return aDestination;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   142
	TInt end = Start() + Length();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   143
	if (end <= aContext.iStart)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   144
		// does not overlap
662fa7de7023 201024_05
hgs
parents:
diff changeset
   145
		return aDestination;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   146
	TBool startJoins = EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   147
	if (start <= aContext.iStart)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   148
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   149
		start = aContext.iStart;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   150
		startJoins = aContext.iJoinsAtStart;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   151
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   152
	TBool truncated = EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   153
	TBool endJoins = EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   154
	if (aContext.iEnd <= end)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   155
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   156
		if (aContext.iEnd < end
662fa7de7023 201024_05
hgs
parents:
diff changeset
   157
			&& aContext.iTruncation != 0xFFFF)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   158
			truncated = ETrue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   159
		end = aContext.iEnd;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   160
		endJoins = aContext.iJoinsAtEnd;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   161
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   162
	TInt length = end - start;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   163
	if (length == 0 && !truncated)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   164
		return aDestination;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   165
	ASSERT(0 <= length);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   166
	const TText* source = aContext.iSource + start;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   167
	if (TypeFlags() & FRightToLeft())
662fa7de7023 201024_05
hgs
parents:
diff changeset
   168
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   169
		// Right-to-left
662fa7de7023 201024_05
hgs
parents:
diff changeset
   170
		if (truncated)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   171
			aDestination = BidiCopy::OutputTChar(aDestination, aContext.iTruncation);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   172
		if (endJoins)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   173
			*(aDestination++) = KZeroWidthJoiner;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   174
		if (TypeFlags() & EFNoPairsNoCombiners)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   175
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   176
			// Simple
662fa7de7023 201024_05
hgs
parents:
diff changeset
   177
			aDestination = TypeFlags() & EFNoMirroredCharacters?
662fa7de7023 201024_05
hgs
parents:
diff changeset
   178
				BidiCopy::CopyBackwards(aDestination, source, length)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   179
				: BidiCopy::CopyBackwardsWithMirroring(aDestination, source, length);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   180
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   181
		else
662fa7de7023 201024_05
hgs
parents:
diff changeset
   182
			// Respect groups
662fa7de7023 201024_05
hgs
parents:
diff changeset
   183
			aDestination = BidiCopy::CopyGroupsBackwards(aDestination, source, length);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   184
		if (startJoins)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   185
			*aDestination++ = KZeroWidthJoiner;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   186
		return aDestination;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   187
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   188
	// Left-to-right
662fa7de7023 201024_05
hgs
parents:
diff changeset
   189
	if (startJoins)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   190
		*aDestination++ = KZeroWidthJoiner;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   191
	Mem::Copy(aDestination, source, length * sizeof(TText));
662fa7de7023 201024_05
hgs
parents:
diff changeset
   192
	aDestination += length;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   193
	if (endJoins)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   194
		*aDestination++ = KZeroWidthJoiner;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   195
	if (truncated)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   196
		aDestination = BidiCopy::OutputTChar(aDestination, aContext.iTruncation);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   197
	return aDestination;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   198
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   199
662fa7de7023 201024_05
hgs
parents:
diff changeset
   200
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
   201
Converts an array of aArraySize TBidirectionalState::TRunInfos into a
662fa7de7023 201024_05
hgs
parents:
diff changeset
   202
compact form.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   203
662fa7de7023 201024_05
hgs
parents:
diff changeset
   204
@param aBuffer Memory to output to, or null just to find out how large the output
662fa7de7023 201024_05
hgs
parents:
diff changeset
   205
array will need to be.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   206
@param aText The text that aRunArray refers to.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   207
@param aRunArray The array to be converted.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   208
@param aArraySize The length of aRunArray.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   209
@return The length of the output array.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   210
@internalTechnology
662fa7de7023 201024_05
hgs
parents:
diff changeset
   211
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
   212
TInt TRunInfoCompact::Convert(TRunInfoCompact* aBuffer, const TDesC& aText,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   213
	const TBidirectionalState::TRunInfo* aRunArray, TInt aArraySize)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   214
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   215
	const TText* text = aText.Ptr();
662fa7de7023 201024_05
hgs
parents:
diff changeset
   216
	TInt outputSize =  0;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   217
662fa7de7023 201024_05
hgs
parents:
diff changeset
   218
	TRunInfoCompact currentRun;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   219
	while (aArraySize)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   220
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   221
		TRunInfoCompact newRun(aRunArray->iStart, aRunArray->iLength,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   222
			aRunArray->iDirection, text);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   223
		--aArraySize;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   224
		if (!currentRun.AddRun(newRun))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   225
			{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   226
			if (aBuffer)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   227
				*aBuffer++ = currentRun;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   228
			++outputSize;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   229
			currentRun = newRun;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   230
			}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   231
		++aRunArray; //point to next run
662fa7de7023 201024_05
hgs
parents:
diff changeset
   232
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   233
	if (0 < currentRun.Length())
662fa7de7023 201024_05
hgs
parents:
diff changeset
   234
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   235
		if (aBuffer)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   236
			*aBuffer++ = currentRun;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   237
		++outputSize;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   238
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   239
662fa7de7023 201024_05
hgs
parents:
diff changeset
   240
	return outputSize;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   241
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   242
662fa7de7023 201024_05
hgs
parents:
diff changeset
   243
/**
662fa7de7023 201024_05
hgs
parents:
diff changeset
   244
Utility tells whether a character will form a join with the previous
662fa7de7023 201024_05
hgs
parents:
diff changeset
   245
base character.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   246
662fa7de7023 201024_05
hgs
parents:
diff changeset
   247
@param aText The text.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   248
@param aIndex The index into aText of the character to test.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   249
@return ETrue if there is a join before the character.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   250
*/
662fa7de7023 201024_05
hgs
parents:
diff changeset
   251
TBool TRunInfoCompact::JoinBefore(const TText* aText, TInt aIndex)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   252
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   253
	TInt charUnderTest = aText[aIndex];
662fa7de7023 201024_05
hgs
parents:
diff changeset
   254
	if (!CFont::CharactersJoin(charUnderTest, KZeroWidthJoiner))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   255
		// Character does not join with anything, so we
662fa7de7023 201024_05
hgs
parents:
diff changeset
   256
		// will not do any more work.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   257
		return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   258
	while (aIndex != 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   259
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   260
		--aIndex;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   261
		TInt c = aText[aIndex];
662fa7de7023 201024_05
hgs
parents:
diff changeset
   262
		// If it is an Arabic point, we will skip it.
662fa7de7023 201024_05
hgs
parents:
diff changeset
   263
		if (0x64B <= c && c < 0x671
662fa7de7023 201024_05
hgs
parents:
diff changeset
   264
			&& !(0x656 <= c && c < 0x670))
662fa7de7023 201024_05
hgs
parents:
diff changeset
   265
			continue;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   266
		return CFont::CharactersJoin(charUnderTest, c);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   267
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   268
	return EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   269
	}