/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
{
// If this operation is too slow, consider a binary search.
+ const ScriptRun* const scriptRunBuffer = mScriptRuns.Begin();
for( Length index = 0u, length = mScriptRuns.Count(); index < length; ++index )
{
- const ScriptRun* const scriptRun = mScriptRuns.Begin() + index;
+ const ScriptRun* const scriptRun = scriptRunBuffer + index;
if( ( scriptRun->characterRun.characterIndex <= characterIndex ) &&
( characterIndex < scriptRun->characterRun.characterIndex + scriptRun->characterRun.numberOfCharacters ) )
CharacterIndex LogicalModel::GetLogicalCursorIndex( CharacterIndex visualCursorIndex )
{
- // The total number of characters.
- const Length numberOfCharacters = mText.Count();
-
- const bool fetch = FetchBidirectionalLineInfo( visualCursorIndex );
- if( !fetch )
- {
- // The character is not inside a bidi line.
- return visualCursorIndex;
- }
-
// The character's directions buffer.
const CharacterDirection* const modelCharacterDirections = mCharacterDirections.Begin();
// Whether the paragraph starts with a right to left character.
const bool isRightToLeftParagraph = bidirectionalLineInfo->direction;
+ // The total number of characters of the line.
+ const Length lastCharacterIndex = bidirectionalLineInfo->characterRun.characterIndex + bidirectionalLineInfo->characterRun.numberOfCharacters;
+
CharacterIndex logicalCursorIndex = 0u;
- if( 0u == visualCursorIndex )
+ if( bidirectionalLineInfo->characterRun.characterIndex == visualCursorIndex )
{
if( isRightToLeftParagraph )
{
- logicalCursorIndex = numberOfCharacters;
+ logicalCursorIndex = lastCharacterIndex;
}
- else // else logical position is zero.
+ else // else logical position is the first of the line.
{
- logicalCursorIndex = 0u;
+ logicalCursorIndex = bidirectionalLineInfo->characterRun.characterIndex;
}
}
- else if( numberOfCharacters == visualCursorIndex )
+ else if( lastCharacterIndex == visualCursorIndex )
{
if( isRightToLeftParagraph )
{
- logicalCursorIndex = 0u;
+ logicalCursorIndex = bidirectionalLineInfo->characterRun.characterIndex;
}
else // else logical position is the number of characters.
{
- logicalCursorIndex = numberOfCharacters;
+ logicalCursorIndex = lastCharacterIndex;
}
}
else
CharacterIndex LogicalModel::GetLogicalCharacterIndex( CharacterIndex visualCharacterIndex )
{
- const bool fetch = FetchBidirectionalLineInfo( visualCharacterIndex );
- if( !fetch )
- {
- // The character is not inside a bidi line.
- return visualCharacterIndex;
- }
-
// The bidirectional line info.
const BidirectionalLineInfoRun* const bidirectionalLineInfo = mBidirectionalLineInfo.Begin() + mBidirectionalLineIndex;
{
const BidirectionalLineInfoRun& bidiLineRun = *( bidirectionalLineInfoBuffer + mBidirectionalLineIndex );
- // Whether the character index is just after the last one. i.e The cursor position after the last character.
- const bool isLastIndex = characterIndex == mText.Count();
-
const CharacterIndex lastCharacterOfRunPlusOne = bidiLineRun.characterRun.characterIndex + bidiLineRun.characterRun.numberOfCharacters;
if( ( bidiLineRun.characterRun.characterIndex <= characterIndex ) &&
- ( ( characterIndex < lastCharacterOfRunPlusOne ) || ( isLastIndex && ( characterIndex == lastCharacterOfRunPlusOne ) ) ) )
+ ( characterIndex < lastCharacterOfRunPlusOne ) )
{
// The character is in the previously fetched bidi line.
return true;
else
{
// The character is not in the previously fetched line.
-
- if( isLastIndex )
- {
- // The given index is one after the last character, so it's not in a bidi line.
- // Check if it's just after the last bidi line.
- const BidirectionalLineRunIndex lastBidiLineIndex = numberOfBidirectionalLines - 1u;
- const BidirectionalLineInfoRun& bidiLineRun = *( bidirectionalLineInfoBuffer + lastBidiLineIndex );
-
- if( characterIndex == bidiLineRun.characterRun.characterIndex + bidiLineRun.characterRun.numberOfCharacters )
- {
- // The character is in the last bidi line.
- mBidirectionalLineIndex = lastBidiLineIndex;
- return true;
- }
- }
-
// Set the bidi line index from where to start the fetch.
if( characterIndex < bidiLineRun.characterRun.characterIndex )
{
const BidirectionalLineInfoRun& bidiLineRun = *it;
- if( ( lastCharacterOfRightToLeftRun < characterIndex ) && ( characterIndex < bidiLineRun.characterRun.characterIndex ) )
+ if( ( lastCharacterOfRightToLeftRun < characterIndex ) &&
+ ( characterIndex < bidiLineRun.characterRun.characterIndex ) )
{
// The character is not inside a bidi line.
return false;
const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + nameIndex );
style.familyName = std::string( fontDescriptionRun.familyName, fontDescriptionRun.familyLength );
- style.familyDefined = true;
+ style.isFamilyDefined = true;
}
// Set the font's weight if it's overriden.
const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + weightIndex );
style.weight = fontDescriptionRun.weight;
- style.weightDefined = true;
+ style.isWeightDefined = true;
}
// Set the font's width if it's overriden.
const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + widthIndex );
style.width = fontDescriptionRun.width;
- style.widthDefined = true;
+ style.isWidthDefined = true;
}
// Set the font's slant if it's overriden.
const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + slantIndex );
style.slant = fontDescriptionRun.slant;
- style.slantDefined = true;
+ style.isSlantDefined = true;
}
// Set the font's size if it's overriden.
const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + sizeIndex );
style.size = static_cast<float>( fontDescriptionRun.size ) / 64.f;
- style.sizeDefined = true;
+ style.isSizeDefined = true;
}
}