X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-run-container.h;h=780c3a7dfeb24db7afe5cbff6648c5e2512f4c22;hp=67d03738ad6db0b51074f71b0bb0deb89381451d;hb=750fadba87bb959c9af32e89e3f1bc7af6cb6dd2;hpb=cdefdbdee1cb3fd4051e220bb185d97b6000a037 diff --git a/dali-toolkit/internal/text/text-run-container.h b/dali-toolkit/internal/text/text-run-container.h index 67d0373..780c3a7 100644 --- a/dali-toolkit/internal/text/text-run-container.h +++ b/dali-toolkit/internal/text/text-run-container.h @@ -1,8 +1,8 @@ -#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. @@ -23,13 +23,10 @@ namespace Dali { - namespace Toolkit { - namespace Text { - /** * @brief Clears the runs starting from the given character index. * @@ -39,22 +36,22 @@ namespace Text * @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& runs, - uint32_t& startRemoveIndex, - uint32_t& endRemoveIndex ) +template +void ClearCharacterRuns(CharacterIndex startIndex, + CharacterIndex endIndex, + Vector& 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. @@ -62,37 +59,36 @@ void ClearCharacterRuns( CharacterIndex startIndex, 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; } } @@ -103,22 +99,22 @@ void ClearCharacterRuns( CharacterIndex startIndex, * @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& runs ) +template +void ClearCharacterRuns(CharacterIndex startIndex, + CharacterIndex endIndex, + Vector& 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); } /** @@ -134,19 +130,19 @@ void ClearCharacterRuns( CharacterIndex startIndex, * @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& runs, - Vector& removedRuns ) +template +void UpdateCharacterRuns(CharacterIndex index, + int numberOfCharacters, + Length totalNumberOfCharacters, + Vector& runs, + Vector& 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; @@ -162,8 +158,8 @@ void UpdateCharacterRuns( CharacterIndex index, // Temporary vector used to remove runs. Vector 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; @@ -172,44 +168,47 @@ void UpdateCharacterRuns( CharacterIndex index, const CharacterIndex lastIndex = index + numberOfRemovedCharacters - 1u; // Update the style runs - for( typename Vector::Iterator it = runs.Begin(), - endIt = runs.End(); - it != endIt; - ++it ) + for(typename Vector::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 { @@ -219,12 +218,12 @@ void UpdateCharacterRuns( CharacterIndex index, } } - tempRuns.PushBack( run ); + tempRuns.PushBack(run); } } // Copy the temporary vector if there are runs removed. - if( runsRemoved ) + if(runsRemoved) { runs = tempRuns; } @@ -234,24 +233,27 @@ void UpdateCharacterRuns( CharacterIndex index, // Add characters. // Update the style runs - for( typename Vector::Iterator it = runs.Begin(), - endIt = runs.End(); - it != endIt; - ++it ) + for(typename Vector::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; } @@ -259,10 +261,98 @@ void UpdateCharacterRuns( CharacterIndex index, } } +/** + * @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 +void ClearGlyphRuns(GlyphIndex startIndex, + GlyphIndex endIndex, + Vector& 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 +void ClearGlyphRuns(GlyphIndex startIndex, + GlyphIndex endIndex, + Vector& 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