X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-helper-functions.cpp;h=f53bfef1b34752c08d9f63ea50720c2e98bb5f17;hb=d74d70d51ed70b00e29a2b6feac5419124fffc49;hp=a5feaefdd692299b080e212f44c887ce98e727bd;hpb=b899c4999231a14190e804e13b941527c3c437a1;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/multi-language-helper-functions.cpp b/dali-toolkit/internal/text/multi-language-helper-functions.cpp index a5feaef..f53bfef 100644 --- a/dali-toolkit/internal/text/multi-language-helper-functions.cpp +++ b/dali-toolkit/internal/text/multi-language-helper-functions.cpp @@ -23,100 +23,140 @@ namespace Dali { - namespace Toolkit { - namespace Text { - -void MergeFontDescriptions( const Vector& fontDescriptions, - Vector& fontIds, - const TextAbstraction::FontDescription& defaultFontDescription, - TextAbstraction::PointSize26Dot6 defaultPointSize, - CharacterIndex startIndex, - Length numberOfCharacters ) +void MergeFontDescriptions(const Vector& fontDescriptions, + const TextAbstraction::FontDescription& defaultFontDescription, + TextAbstraction::PointSize26Dot6 defaultPointSize, + CharacterIndex characterIndex, + TextAbstraction::FontDescription& fontDescription, + TextAbstraction::PointSize26Dot6& fontPointSize, + bool& isDefaultFont) { - // Get the handle to the font client. - TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - - // Pointer to the font id buffer. - FontId* fontIdsBuffer = fontIds.Begin(); - - // Traverse all the characters. - for( CharacterIndex index = startIndex; index < numberOfCharacters; ++index ) + // Initialize with the default font's point size. + fontPointSize = defaultPointSize; + + // Initialize with the style parameters of the default font's style. + fontDescription = defaultFontDescription; + + // Initialize as a default font. + isDefaultFont = true; + + Length runIndex = 0u; + + Length familyIndex = 0u; + Length weightIndex = 0u; + Length widthIndex = 0u; + Length slantIndex = 0u; + Length sizeIndex = 0u; + + bool familyOverriden = false; + bool weightOverriden = false; + bool widthOverriden = false; + bool slantOverriden = false; + bool sizeOverriden = false; + + // Traverse all the font descriptions. + const FontDescriptionRun* const fontDescriptionsBuffer = fontDescriptions.Begin(); + for(Vector::ConstIterator it = fontDescriptionsBuffer, + endIt = fontDescriptions.End(); + it != endIt; + ++it, ++runIndex) { - // The default font description and font point size. - TextAbstraction::FontDescription fontDescription = defaultFontDescription; - TextAbstraction::PointSize26Dot6 fontSize = defaultPointSize; - bool defaultFont = true; - - // Traverse all the font descriptions. - for( Vector::ConstIterator it = fontDescriptions.Begin(), - endIt = fontDescriptions.End(); - it != endIt; - ++it ) + // Check whether the character's font is modified by the current font description. + const FontDescriptionRun& fontRun = *it; + if((characterIndex >= fontRun.characterRun.characterIndex) && + (characterIndex < fontRun.characterRun.characterIndex + fontRun.characterRun.numberOfCharacters)) { - // Check whether the character's font is modified by the current font description. - const FontDescriptionRun& fontRun = *it; - if( ( index >= fontRun.characterRun.characterIndex ) && - ( index < fontRun.characterRun.characterIndex + fontRun.characterRun.numberOfCharacters ) ) + if(fontRun.familyDefined) + { + isDefaultFont = false; + familyOverriden = true; + familyIndex = runIndex; + } + if(fontRun.weightDefined) { - if( fontRun.familyDefined ) - { - fontDescription.family = std::string( fontRun.familyName, fontRun.familyLength ); - defaultFont = false; - } - if( fontRun.weightDefined ) - { - fontDescription.weight = fontRun.weight; - defaultFont = false; - } - if( fontRun.widthDefined ) - { - fontDescription.width = fontRun.width; - defaultFont = false; - } - if( fontRun.slantDefined ) - { - fontDescription.slant = fontRun.slant; - defaultFont = false; - } - if( fontRun.sizeDefined ) - { - fontSize = fontRun.size; - defaultFont = false; - } + isDefaultFont = false; + weightOverriden = true; + weightIndex = runIndex; } + if(fontRun.widthDefined) + { + isDefaultFont = false; + widthOverriden = true; + widthIndex = runIndex; + } + if(fontRun.slantDefined) + { + isDefaultFont = false; + slantOverriden = true; + slantIndex = runIndex; + } + if(fontRun.sizeDefined) + { + isDefaultFont = false; + sizeOverriden = true; + sizeIndex = runIndex; + } + } + } + + // Get the font's description if is not the default font. + if(!isDefaultFont) + { + if(familyOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + familyIndex); + fontDescription.family = std::string(fontRun.familyName, fontRun.familyLength); + } + + if(weightOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + weightIndex); + fontDescription.weight = fontRun.weight; + } + + if(widthOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + widthIndex); + fontDescription.width = fontRun.width; + } + + if(slantOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + slantIndex); + fontDescription.slant = fontRun.slant; } - // Get the font id if is not the default font. - if( !defaultFont ) + if(sizeOverriden) { - *( fontIdsBuffer + index - startIndex ) = fontClient.GetFontId( fontDescription, fontSize ); + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + sizeIndex); + fontPointSize = fontRun.size; } } } -Script GetScript( Length index, - Vector::ConstIterator& scriptRunIt, - const Vector::ConstIterator& scriptRunEndIt ) +Script GetScript(Length index, + Vector::ConstIterator& scriptRunIt, + const Vector::ConstIterator& scriptRunEndIt) { Script script = TextAbstraction::UNKNOWN; - while( scriptRunIt != scriptRunEndIt ) + while(scriptRunIt != scriptRunEndIt) { const ScriptRun& scriptRun = *scriptRunIt; - if( index >= scriptRun.characterRun.characterIndex + scriptRun.characterRun.numberOfCharacters ) + if(index >= scriptRun.characterRun.characterIndex + scriptRun.characterRun.numberOfCharacters) { ++scriptRunIt; } - else if( index >= scriptRun.characterRun.characterIndex ) + else if(index >= scriptRun.characterRun.characterIndex) { script = scriptRun.script; - if( index + 1u == scriptRun.characterRun.characterIndex + scriptRun.characterRun.numberOfCharacters ) + if(index + 1u == scriptRun.characterRun.characterIndex + scriptRun.characterRun.numberOfCharacters) { // All the characters of the current run have been traversed. Get the next one for the next iteration. ++scriptRunIt;