-#ifndef __DALI_TOOLKIT_TEXT_STYLE_RUN_CONTAINER_H__
-#define __DALI_TOOLKIT_TEXT_STYLE_RUN_CONTAINER_H__
+#ifndef DALI_TOOLKIT_TEXT_RUN_CONTAINER_H
+#define DALI_TOOLKIT_TEXT_RUN_CONTAINER_H
/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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.
namespace Dali
{
-
namespace Toolkit
{
-
namespace Text
{
-
/**
* @brief Clears the runs starting from the given character index.
*
* @param[out] startRemoveIndex The index to the first run to be removed.
* @param[out] endRemoveIndex The index to the last run to be removed.
*/
-template< typename T >
-void ClearCharacterRuns( CharacterIndex startIndex,
- CharacterIndex endIndex,
- Vector<T>& runs,
- uint32_t& startRemoveIndex,
- uint32_t& endRemoveIndex )
+template<typename T>
+void ClearCharacterRuns(CharacterIndex startIndex,
+ CharacterIndex endIndex,
+ Vector<T>& runs,
+ uint32_t& startRemoveIndex,
+ uint32_t& endRemoveIndex)
{
T* runsBuffer = runs.Begin();
+ T* run = runsBuffer;
const Length length = runs.Count();
- for( Length index = 0u; index < length; ++index )
+ Length index = 0u;
+ for(index = 0u; index < length; ++index)
{
- T* run = ( runsBuffer + index );
-
- if( ( run->characterRun.characterIndex <= endIndex ) &&
- ( startIndex < run->characterRun.characterIndex + run->characterRun.numberOfCharacters ) )
+ if((run->characterRun.characterIndex <= endIndex) &&
+ (startIndex < run->characterRun.characterIndex + run->characterRun.numberOfCharacters))
{
// Run found.
startRemoveIndex = index;
break;
}
+
+ ++run;
}
- for( Length index = startRemoveIndex; index < length; ++index )
+ run = (runsBuffer + startRemoveIndex);
+ for(index = startRemoveIndex; index < length; ++index)
{
- T* run = ( runsBuffer + index );
-
- if( ( run->characterRun.characterIndex <= endIndex ) &&
- ( startIndex < run->characterRun.characterIndex + run->characterRun.numberOfCharacters ) )
- {
- // Update the index to the last run to be removed.
- endRemoveIndex = index + 1u;
- }
- else
+ if((run->characterRun.characterIndex > endIndex) ||
+ (startIndex >= run->characterRun.characterIndex + run->characterRun.numberOfCharacters))
{
// Run found. Nothing else to do.
break;
}
+ ++run;
}
+ endRemoveIndex = index;
// The number of characters to remove.
const Length numberOfCharactersRemoved = 1u + endIndex - startIndex;
// Update the character index of the next runs.
- for( Length index = 0u; index < length; ++index )
+ run = runsBuffer;
+ for(Length index = 0u; index < length; ++index)
{
- T* run = ( runsBuffer + index );
-
- if( run->characterRun.characterIndex > startIndex )
+ if(run->characterRun.characterIndex > startIndex)
{
run->characterRun.characterIndex -= numberOfCharactersRemoved;
}
+
+ ++run;
}
}
* @param[in] endIndex The ending character index used to remove runs.
* @param[in,out] runs The text's runs.
*/
-template< typename T >
-void ClearCharacterRuns( CharacterIndex startIndex,
- CharacterIndex endIndex,
- Vector<T>& runs )
+template<typename T>
+void ClearCharacterRuns(CharacterIndex startIndex,
+ CharacterIndex endIndex,
+ Vector<T>& runs)
{
uint32_t startRemoveIndex = runs.Count();
- uint32_t endRemoveIndex = startRemoveIndex;
- ClearCharacterRuns( startIndex,
- endIndex,
- runs,
- startRemoveIndex,
- endRemoveIndex );
+ uint32_t endRemoveIndex = startRemoveIndex;
+ ClearCharacterRuns(startIndex,
+ endIndex,
+ runs,
+ startRemoveIndex,
+ endRemoveIndex);
// Remove all remaining runs.
T* runBuffer = runs.Begin();
- runs.Erase( runBuffer + startRemoveIndex, runBuffer + endRemoveIndex );
+ runs.Erase(runBuffer + startRemoveIndex, runBuffer + endRemoveIndex);
}
/**
* @param[in,out] runs The text's style runs.
* @param[out] removedRuns The text's style removed runs.
*/
-template< typename T >
-void UpdateCharacterRuns( CharacterIndex index,
- int numberOfCharacters,
- Length totalNumberOfCharacters,
- Vector<T>& runs,
- Vector<T>& removedRuns )
+template<typename T>
+void UpdateCharacterRuns(CharacterIndex index,
+ int numberOfCharacters,
+ Length totalNumberOfCharacters,
+ Vector<T>& runs,
+ Vector<T>& removedRuns)
{
- if( 0 > numberOfCharacters )
+ if(0 > numberOfCharacters)
{
// Remove characters.
const Length numberOfRemovedCharacters = -numberOfCharacters;
- if( ( 0u == index ) && ( numberOfRemovedCharacters == totalNumberOfCharacters ) )
+ if((0u == index) && (numberOfRemovedCharacters == totalNumberOfCharacters))
{
// Set the removed runs.
removedRuns = runs;
// Temporary vector used to remove runs.
Vector<T> tempRuns;
// Reserve some space for the temporary vector.
- tempRuns.Reserve( size );
- removedRuns.Reserve( size );
+ tempRuns.Reserve(size);
+ removedRuns.Reserve(size);
// Whether any run has to be removed.
bool runsRemoved = false;
const CharacterIndex lastIndex = index + numberOfRemovedCharacters - 1u;
// Update the style runs
- for( typename Vector<T>::Iterator it = runs.Begin(),
- endIt = runs.End();
- it != endIt;
- ++it )
+ for(typename Vector<T>::Iterator it = runs.Begin(),
+ endIt = runs.End();
+ it != endIt;
+ ++it)
{
T& run = *it;
+ if(run.characterRun.numberOfCharacters == 0)
+ continue;
+
const CharacterIndex lastRunIndex = run.characterRun.characterIndex + run.characterRun.numberOfCharacters - 1u;
- if( lastRunIndex < index )
+ if(lastRunIndex < index)
{
// The style run is not affected by the removed text.
- tempRuns.PushBack( run );
+ tempRuns.PushBack(run);
continue;
}
- if( ( index <= run.characterRun.characterIndex ) &&
- ( lastIndex >= lastRunIndex ) )
+ if((index <= run.characterRun.characterIndex) &&
+ (lastIndex >= lastRunIndex))
{
// Add the removed run into the vector.
- removedRuns.PushBack( run );
+ removedRuns.PushBack(run);
// All the characters are removed.
runsRemoved = true;
}
else
{
- if( lastIndex < run.characterRun.characterIndex )
+ if(lastIndex < run.characterRun.characterIndex)
{
// Just move the character index.
run.characterRun.characterIndex -= numberOfRemovedCharacters;
}
else
{
- if( run.characterRun.characterIndex < index )
+ if(run.characterRun.characterIndex < index)
{
// Remove characters starting from a character within the run.
- run.characterRun.numberOfCharacters -= std::min( numberOfRemovedCharacters, 1u + lastRunIndex - index );
+ run.characterRun.numberOfCharacters -= std::min(numberOfRemovedCharacters, 1u + lastRunIndex - index);
}
else
{
}
}
- tempRuns.PushBack( run );
+ tempRuns.PushBack(run);
}
}
// Copy the temporary vector if there are runs removed.
- if( runsRemoved )
+ if(runsRemoved)
{
runs = tempRuns;
}
// Add characters.
// Update the style runs
- for( typename Vector<T>::Iterator it = runs.Begin(),
- endIt = runs.End();
- it != endIt;
- ++it )
+ for(typename Vector<T>::Iterator it = runs.Begin(),
+ endIt = runs.End();
+ it != endIt;
+ ++it)
{
T& run = *it;
+ if(run.characterRun.numberOfCharacters == 0)
+ continue;
+
// Update the number of characters of the style run.
- if( ( 0u == index ) && ( 0u == run.characterRun.characterIndex ) )
+ if((0u == index) && (0u == run.characterRun.characterIndex))
{
run.characterRun.numberOfCharacters += numberOfCharacters;
}
- else if( index <= run.characterRun.characterIndex )
+ else if(index <= run.characterRun.characterIndex)
{
run.characterRun.characterIndex += numberOfCharacters;
}
- else if( index <= run.characterRun.characterIndex + run.characterRun.numberOfCharacters )
+ else if(index <= run.characterRun.characterIndex + run.characterRun.numberOfCharacters)
{
run.characterRun.numberOfCharacters += numberOfCharacters;
}
}
}
+/**
+ * @brief Clears the runs starting from the given glyph index.
+ *
+ * @param[in] startIndex The starting glyph index used to remove runs.
+ * @param[in] endIndex The ending glyph index used to remove runs.
+ * @param[in,out] runs The text's runs.
+ * @param[out] startRemoveIndex The index to the first run to be removed.
+ * @param[out] endRemoveIndex The index to the last run to be removed.
+ */
+template<typename T>
+void ClearGlyphRuns(GlyphIndex startIndex,
+ GlyphIndex endIndex,
+ Vector<T>& runs,
+ uint32_t& startRemoveIndex,
+ uint32_t& endRemoveIndex)
+{
+ T* runsBuffer = runs.Begin();
+ T* run = runsBuffer;
+
+ const Length length = runs.Count();
+ Length index = 0u;
+ for(index = 0u; index < length; ++index)
+ {
+ if((run->glyphRun.glyphIndex <= endIndex) &&
+ (startIndex < run->glyphRun.glyphIndex + run->glyphRun.numberOfGlyphs))
+ {
+ // Run found.
+
+ // Set the index to the first run to be removed.
+ startRemoveIndex = index;
+ break;
+ }
+ ++run;
+ }
+
+ run = (runsBuffer + startRemoveIndex);
+ for(index = startRemoveIndex; index < length; ++index)
+ {
+ if((run->glyphRun.glyphIndex > endIndex) ||
+ (startIndex >= run->glyphRun.glyphIndex + run->glyphRun.numberOfGlyphs))
+ {
+ // Run found. Nothing else to do.
+ break;
+ }
+
+ ++run;
+ }
+ endRemoveIndex = index;
+
+ // The number of glyphs to remove.
+ const Length numberOfGlyphsRemoved = 1u + endIndex - startIndex;
+
+ // Update the glyph index of the next runs.
+ run = runsBuffer;
+ for(Length index = 0u; index < length; ++index)
+ {
+ if(run->glyphRun.glyphIndex > startIndex)
+ {
+ run->glyphRun.glyphIndex -= numberOfGlyphsRemoved;
+ }
+ }
+}
+
+/**
+ * @brief Clears the runs starting from the given glyph index.
+ *
+ * @param[in] startIndex The starting glyph index used to remove runs.
+ * @param[in] endIndex The ending glyph index used to remove runs.
+ * @param[in,out] runs The text's runs.
+ */
+template<typename T>
+void ClearGlyphRuns(GlyphIndex startIndex,
+ GlyphIndex endIndex,
+ Vector<T>& runs)
+{
+ uint32_t startRemoveIndex = runs.Count();
+ uint32_t endRemoveIndex = startRemoveIndex;
+ ClearGlyphRuns(startIndex,
+ endIndex,
+ runs,
+ startRemoveIndex,
+ endRemoveIndex);
+
+ // Remove all remaining runs.
+ T* runBuffer = runs.Begin();
+ runs.Erase(runBuffer + startRemoveIndex, runBuffer + endRemoveIndex);
+}
+
} // namespace Text
} // namespace Toolkit
} // namespace Dali
-#endif // __DALI_TOOLKIT_TEXT_STYLE_RUN_CONTAINER_H__
+#endif // DALI_TOOLKIT_TEXT_RUN_CONTAINER_H