fontservices/textbase/sgdi/BidiVisual.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 "BidiVisual.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    17
#include "BidiCopy.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    18
#include "BidiTextImp.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    19
#include "BidiCompact.h"
662fa7de7023 201024_05
hgs
parents:
diff changeset
    20
662fa7de7023 201024_05
hgs
parents:
diff changeset
    21
extern void BidiPanic(TInt aError);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    22
662fa7de7023 201024_05
hgs
parents:
diff changeset
    23
/** Construct the class with a full paragraph of text and the run array to be used 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    24
to hold all the runs. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    25
662fa7de7023 201024_05
hgs
parents:
diff changeset
    26
@param aText The text to be analyzed. This must not be de-allocated until 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    27
all operations on it through this class have been completed.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    28
@param aRightToLeft Paragraph directionality.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    29
@param aRunInfoArray The array to be used to hold the run information. This 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    30
must not be de-allocated until all operations on it through this class have 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    31
been completed. Ownership is not passed.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    32
@param aRunInfoLength The number of TRunInfo<\code> objects in aRunInfoArray. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    33
EXPORT_C TBidiLogicalToVisual::TBidiLogicalToVisual(
662fa7de7023 201024_05
hgs
parents:
diff changeset
    34
	const TDesC& aText,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    35
	TBool aRightToLeft,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    36
	TBidirectionalState::TRunInfo* aRunInfoArray,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    37
	TInt aRunInfoLength)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    38
	: iText(aText), iRightToLeft(aRightToLeft),
662fa7de7023 201024_05
hgs
parents:
diff changeset
    39
	iRunInfoArray(aRunInfoArray), iRunInfoArrayLength(aRunInfoLength), iRuns(aRunInfoLength)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    40
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    41
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    42
662fa7de7023 201024_05
hgs
parents:
diff changeset
    43
/** Construct the class with a full paragraph of text and the run array to be used 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    44
to hold all the runs. Directionality is taken as the implicit directionality 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    45
of the text passed. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    46
662fa7de7023 201024_05
hgs
parents:
diff changeset
    47
@param aText The text to be analyzed. This must not be de-allocated until 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    48
all operations on it through this class have been completed.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    49
@param aRunInfoArray The array to be used to hold the run information. This 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    50
must not be de-allocated until all operations on it through this class have 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    51
been completed. Ownership is not passed.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    52
@param aRunInfoLength The number of TRunInfo objects in aRunInfoArray. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    53
EXPORT_C TBidiLogicalToVisual::TBidiLogicalToVisual(
662fa7de7023 201024_05
hgs
parents:
diff changeset
    54
	const TDesC& aText,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    55
	TBidirectionalState::TRunInfo* aRunInfoArray,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    56
	TInt aRunInfoLength)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    57
	: iText(aText),
662fa7de7023 201024_05
hgs
parents:
diff changeset
    58
	iRunInfoArray(aRunInfoArray), iRunInfoArrayLength(aRunInfoLength), iRuns(aRunInfoLength)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    59
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    60
	iRightToLeft = BidiCopy::ImplicitDirectionalityIsRightToLeft(
662fa7de7023 201024_05
hgs
parents:
diff changeset
    61
		aText.Ptr(), aText.Length(), 0);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    62
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    63
662fa7de7023 201024_05
hgs
parents:
diff changeset
    64
/** Process the text. This must be called before any call to GetVisualLine. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    65
662fa7de7023 201024_05
hgs
parents:
diff changeset
    66
@return The number of runs that were or would be required to reorder the complete 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    67
line. If this is less than the value passed into the constructor as aRunInfoLength, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    68
the full text will not be able to be Reordered. */
662fa7de7023 201024_05
hgs
parents:
diff changeset
    69
EXPORT_C TInt TBidiLogicalToVisual::Reorder()
662fa7de7023 201024_05
hgs
parents:
diff changeset
    70
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    71
	TInt required = TBidirectionalState::GenerateBdRunArray(
662fa7de7023 201024_05
hgs
parents:
diff changeset
    72
		iText.Ptr(), iText.Length(), iRunInfoArray, iRunInfoArrayLength);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    73
	iRuns = Min(required, iRunInfoArrayLength);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    74
	TBidirectionalState state;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    75
	state.ReorderLine(iRunInfoArray, iRuns, ETrue, ETrue, iRightToLeft,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    76
		TChar::EOtherNeutral, TChar::EOtherNeutral);
662fa7de7023 201024_05
hgs
parents:
diff changeset
    77
	return required;
662fa7de7023 201024_05
hgs
parents:
diff changeset
    78
	}
662fa7de7023 201024_05
hgs
parents:
diff changeset
    79
662fa7de7023 201024_05
hgs
parents:
diff changeset
    80
/** Get a line of visually ordered text. 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    81
662fa7de7023 201024_05
hgs
parents:
diff changeset
    82
@param aLine Line of text in visual order. There must be aEnd - aStart + 4 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    83
characters available in the buffer. Only characters within the range aStart 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    84
to aEnd, plus perhaps a truncation character and up to two zero-width joiners 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    85
will be present in the string at the end.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    86
@param aStart The first character in the text that is to be on the line.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    87
@param aEnd One plus the last character in the test that is to be on the line.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    88
@param aTruncationChar The character to mark the end of the text, if appropriate, 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    89
or 0xFFFF if no truncation character is to be used. */ 
662fa7de7023 201024_05
hgs
parents:
diff changeset
    90
EXPORT_C void TBidiLogicalToVisual::GetVisualLine(TDes& aLine,
662fa7de7023 201024_05
hgs
parents:
diff changeset
    91
	TInt aStart, TInt aEnd, TChar aTruncationChar)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    92
	{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    93
	__ASSERT_ALWAYS(aEnd - aStart + KMinCharAvailable <= aLine.MaxLength(), BidiPanic(KErrArgument));
662fa7de7023 201024_05
hgs
parents:
diff changeset
    94
662fa7de7023 201024_05
hgs
parents:
diff changeset
    95
	if(iText.Length() == 0)
662fa7de7023 201024_05
hgs
parents:
diff changeset
    96
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
    97
		aLine.Zero();
662fa7de7023 201024_05
hgs
parents:
diff changeset
    98
		return;//We can't do anything with iText, if its length is 0.
662fa7de7023 201024_05
hgs
parents:
diff changeset
    99
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   100
662fa7de7023 201024_05
hgs
parents:
diff changeset
   101
	TRunInfoCompact::TReorderingContext context;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   102
662fa7de7023 201024_05
hgs
parents:
diff changeset
   103
	const TText* input = &iText[0];
662fa7de7023 201024_05
hgs
parents:
diff changeset
   104
	context.iStart = aStart;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   105
	context.iEnd = aEnd;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   106
	context.iTruncation = aTruncationChar;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   107
	context.iSource = input;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   108
	context.iJoinsAtStart = TRunInfoCompact::JoinBefore(input, aStart);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   109
	context.iJoinsAtEnd = aEnd < iText.Length() ? TRunInfoCompact::JoinBefore(input, aEnd) : EFalse;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   110
662fa7de7023 201024_05
hgs
parents:
diff changeset
   111
	aLine.FillZ(1);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   112
	TText* output = &aLine[0];
662fa7de7023 201024_05
hgs
parents:
diff changeset
   113
	TText* outputStart = output;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   114
	TBidirectionalState::TRunInfo* endInfo = iRunInfoArray + iRuns;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   115
	for (TBidirectionalState::TRunInfo* currentInfo = iRunInfoArray;
662fa7de7023 201024_05
hgs
parents:
diff changeset
   116
		currentInfo != endInfo; ++currentInfo)
662fa7de7023 201024_05
hgs
parents:
diff changeset
   117
		{
662fa7de7023 201024_05
hgs
parents:
diff changeset
   118
		TRunInfoCompact info(currentInfo->iStart,
662fa7de7023 201024_05
hgs
parents:
diff changeset
   119
			currentInfo->iLength, currentInfo->iDirection);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   120
		output = info.Reorder(output, context);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   121
		}
662fa7de7023 201024_05
hgs
parents:
diff changeset
   122
	aLine.SetLength(output - outputStart);
662fa7de7023 201024_05
hgs
parents:
diff changeset
   123
	}