diff -r 000000000000 -r 5d03bc08d59c graphicsdeviceinterface/gdi/sgdi/BidiVisual.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicsdeviceinterface/gdi/sgdi/BidiVisual.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,123 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +#include "BidiVisual.h" +#include "BidiCopy.h" +#include "BidiTextImp.h" +#include "BidiCompact.h" + +extern void BidiPanic(TInt aError); + +/** Construct the class with a full paragraph of text and the run array to be used +to hold all the runs. + +@param aText The text to be analyzed. This must not be de-allocated until +all operations on it through this class have been completed. +@param aRightToLeft Paragraph directionality. +@param aRunInfoArray The array to be used to hold the run information. This +must not be de-allocated until all operations on it through this class have +been completed. Ownership is not passed. +@param aRunInfoLength The number of TRunInfo<\code> objects in aRunInfoArray. */ +EXPORT_C TBidiLogicalToVisual::TBidiLogicalToVisual( + const TDesC& aText, + TBool aRightToLeft, + TBidirectionalState::TRunInfo* aRunInfoArray, + TInt aRunInfoLength) + : iText(aText), iRightToLeft(aRightToLeft), + iRunInfoArray(aRunInfoArray), iRunInfoArrayLength(aRunInfoLength), iRuns(aRunInfoLength) + { + } + +/** Construct the class with a full paragraph of text and the run array to be used +to hold all the runs. Directionality is taken as the implicit directionality +of the text passed. + +@param aText The text to be analyzed. This must not be de-allocated until +all operations on it through this class have been completed. +@param aRunInfoArray The array to be used to hold the run information. This +must not be de-allocated until all operations on it through this class have +been completed. Ownership is not passed. +@param aRunInfoLength The number of TRunInfo objects in aRunInfoArray. */ +EXPORT_C TBidiLogicalToVisual::TBidiLogicalToVisual( + const TDesC& aText, + TBidirectionalState::TRunInfo* aRunInfoArray, + TInt aRunInfoLength) + : iText(aText), + iRunInfoArray(aRunInfoArray), iRunInfoArrayLength(aRunInfoLength), iRuns(aRunInfoLength) + { + iRightToLeft = BidiCopy::ImplicitDirectionalityIsRightToLeft( + aText.Ptr(), aText.Length(), 0); + } + +/** Process the text. This must be called before any call to GetVisualLine. + +@return The number of runs that were or would be required to reorder the complete +line. If this is less than the value passed into the constructor as aRunInfoLength, +the full text will not be able to be Reordered. */ +EXPORT_C TInt TBidiLogicalToVisual::Reorder() + { + TInt required = TBidirectionalState::GenerateBdRunArray( + iText.Ptr(), iText.Length(), iRunInfoArray, iRunInfoArrayLength); + iRuns = Min(required, iRunInfoArrayLength); + TBidirectionalState state; + state.ReorderLine(iRunInfoArray, iRuns, ETrue, ETrue, iRightToLeft, + TChar::EOtherNeutral, TChar::EOtherNeutral); + return required; + } + +/** Get a line of visually ordered text. + +@param aLine Line of text in visual order. There must be aEnd - aStart + 4 +characters available in the buffer. Only characters within the range aStart +to aEnd, plus perhaps a truncation character and up to two zero-width joiners +will be present in the string at the end. +@param aStart The first character in the text that is to be on the line. +@param aEnd One plus the last character in the test that is to be on the line. +@param aTruncationChar The character to mark the end of the text, if appropriate, +or 0xFFFF if no truncation character is to be used. */ +EXPORT_C void TBidiLogicalToVisual::GetVisualLine(TDes& aLine, + TInt aStart, TInt aEnd, TChar aTruncationChar) + { + __ASSERT_ALWAYS(aEnd - aStart + KMinCharAvailable <= aLine.MaxLength(), BidiPanic(KErrArgument)); + + if(iText.Length() == 0) + { + aLine.Zero(); + return;//We can't do anything with iText, if its length is 0. + } + + TRunInfoCompact::TReorderingContext context; + + const TText* input = &iText[0]; + context.iStart = aStart; + context.iEnd = aEnd; + context.iTruncation = aTruncationChar; + context.iSource = input; + context.iJoinsAtStart = TRunInfoCompact::JoinBefore(input, aStart); + context.iJoinsAtEnd = aEnd < iText.Length() ? TRunInfoCompact::JoinBefore(input, aEnd) : EFalse; + + aLine.FillZ(1); + TText* output = &aLine[0]; + TText* outputStart = output; + TBidirectionalState::TRunInfo* endInfo = iRunInfoArray + iRuns; + for (TBidirectionalState::TRunInfo* currentInfo = iRunInfoArray; + currentInfo != endInfo; ++currentInfo) + { + TRunInfoCompact info(currentInfo->iStart, + currentInfo->iLength, currentInfo->iDirection); + output = info.Reorder(output, context); + } + aLine.SetLength(output - outputStart); + }