X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Flogical-model-impl.cpp;h=d4a9d94da757622689ddcee533b21618de1c0ca0;hb=2ecd7e13e0dbe45f59b5150abbf7924bf780f720;hp=7dbe6284166900adcba7abc36952f2d3051eb45c;hpb=a3353d4f3763da656966e8e9a1c223c7e9585a13;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/logical-model-impl.cpp b/dali-toolkit/internal/text/logical-model-impl.cpp index 7dbe628..d4a9d94 100644 --- a/dali-toolkit/internal/text/logical-model-impl.cpp +++ b/dali-toolkit/internal/text/logical-model-impl.cpp @@ -18,8 +18,9 @@ // CLASS HEADER #include -// EXTERNAL INCLUDES -#include +// INTERNAL INCLUDES +#include +#include namespace Dali { @@ -30,6 +31,19 @@ namespace Toolkit namespace Text { +void FreeFontFamilyNames( Vector& fontDescriptionRuns ) +{ + for( Vector::Iterator it = fontDescriptionRuns.Begin(), + endIt = fontDescriptionRuns.End(); + it != endIt; + ++it ) + { + delete (*it).familyName; + } + + fontDescriptionRuns.Clear(); +} + LogicalModelPtr LogicalModel::New() { return LogicalModelPtr( new LogicalModel() ); @@ -244,8 +258,173 @@ CharacterIndex LogicalModel::GetLogicalCharacterIndex( CharacterIndex visualChar return *( mVisualToLogicalMap.Begin() + visualCharacterIndex ); } +void LogicalModel::UpdateTextStyleRuns( CharacterIndex index, int numberOfCharacters ) +{ + const Length totalNumberOfCharacters = mText.Count(); + + // Process the color runs. + Vector removedColorRuns; + UpdateCharacterRuns( index, + numberOfCharacters, + totalNumberOfCharacters, + mColorRuns, + removedColorRuns ); + + // Process the font description runs. + Vector removedFontDescriptionRuns; + UpdateCharacterRuns( index, + numberOfCharacters, + totalNumberOfCharacters, + mFontDescriptionRuns, + removedFontDescriptionRuns ); + + // Free memory allocated for the font family name. + FreeFontFamilyNames( removedFontDescriptionRuns ); +} + +void LogicalModel::RetrieveStyle( CharacterIndex index, InputStyle& style ) +{ + unsigned int runIndex = 0u; + + // Set the text color. + bool colorOverriden = false; + unsigned int colorIndex = 0u; + const ColorRun* const colorRunsBuffer = mColorRuns.Begin(); + for( Vector::ConstIterator it = colorRunsBuffer, + endIt = mColorRuns.End(); + it != endIt; + ++it, ++runIndex ) + { + const ColorRun& colorRun = *it; + + if( ( colorRun.characterRun.characterIndex <= index ) && + ( index < colorRun.characterRun.characterIndex + colorRun.characterRun.numberOfCharacters ) ) + { + colorIndex = runIndex; + colorOverriden = true; + } + } + + // Set the text's color if it's overriden. + if( colorOverriden ) + { + style.textColor = ( *( colorRunsBuffer + colorIndex ) ).color; + } + + // Reset the run index. + runIndex = 0u; + + // Set the font's parameters. + bool nameOverriden = false; + bool weightOverriden = false; + bool widthOverriden = false; + bool slantOverriden = false; + bool sizeOverriden = false; + unsigned int nameIndex = 0u; + unsigned int weightIndex = 0u; + unsigned int widthIndex = 0u; + unsigned int slantIndex = 0u; + unsigned int sizeIndex = 0u; + const FontDescriptionRun* const fontDescriptionRunsBuffer = mFontDescriptionRuns.Begin(); + for( Vector::ConstIterator it = fontDescriptionRunsBuffer, + endIt = mFontDescriptionRuns.End(); + it != endIt; + ++it, ++runIndex ) + { + const FontDescriptionRun& fontDescriptionRun = *it; + + if( ( fontDescriptionRun.characterRun.characterIndex <= index ) && + ( index < fontDescriptionRun.characterRun.characterIndex + fontDescriptionRun.characterRun.numberOfCharacters ) ) + { + if( fontDescriptionRun.familyDefined ) + { + nameIndex = runIndex; + nameOverriden = true; + } + + if( fontDescriptionRun.weightDefined ) + { + weightIndex = runIndex; + weightOverriden = true; + } + + if( fontDescriptionRun.widthDefined ) + { + widthIndex = runIndex; + widthOverriden = true; + } + + if( fontDescriptionRun.slantDefined ) + { + slantIndex = runIndex; + slantOverriden = true; + } + + if( fontDescriptionRun.sizeDefined ) + { + sizeIndex = runIndex; + sizeOverriden = true; + } + } + } + + // Set the font's family name if it's overriden. + if( nameOverriden ) + { + const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + nameIndex ); + + style.familyName = std::string( fontDescriptionRun.familyName, fontDescriptionRun.familyLength ); + style.familyDefined = true; + } + + // Set the font's weight if it's overriden. + if( weightOverriden ) + { + const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + weightIndex ); + + style.weight = fontDescriptionRun.weight; + style.weightDefined = true; + } + + // Set the font's width if it's overriden. + if( widthOverriden ) + { + const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + widthIndex ); + + style.width = fontDescriptionRun.width; + style.widthDefined = true; + } + + // Set the font's slant if it's overriden. + if( slantOverriden ) + { + const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + slantIndex ); + + style.slant = fontDescriptionRun.slant; + style.slantDefined = true; + } + + // Set the font's size if it's overriden. + if( sizeOverriden ) + { + const FontDescriptionRun& fontDescriptionRun = *( fontDescriptionRunsBuffer + sizeIndex ); + + style.size = static_cast( fontDescriptionRun.size ) / 64.f; + style.sizeDefined = true; + } + + // Reset the run index. + runIndex = 0u; +} + +void LogicalModel::ClearFontDescriptionRuns() +{ + FreeFontFamilyNames( mFontDescriptionRuns ); +} + LogicalModel::~LogicalModel() { + ClearFontDescriptionRuns(); } LogicalModel::LogicalModel()