X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-helper-functions.cpp;h=f53bfef1b34752c08d9f63ea50720c2e98bb5f17;hp=731b89d6643c0b3b46b53a6921d9c64cde696063;hb=HEAD;hpb=3e30971f9884dc48e80ef82de4ef85fc9dba1229 diff --git a/dali-toolkit/internal/text/multi-language-helper-functions.cpp b/dali-toolkit/internal/text/multi-language-helper-functions.cpp index 731b89d..930cb8b 100644 --- a/dali-toolkit/internal/text/multi-language-helper-functions.cpp +++ b/dali-toolkit/internal/text/multi-language-helper-functions.cpp @@ -23,176 +23,141 @@ namespace Dali { - namespace Toolkit { - namespace Text { - -void MergeFontDescriptions( const Vector& fontDescriptions, - Vector& fontIds, - Vector& isDefaultFont, - const TextAbstraction::FontDescription& defaultFontDescription, - TextAbstraction::PointSize26Dot6 defaultPointSize, - CharacterIndex startIndex, - Length numberOfCharacters ) +void MergeFontDescriptions(const Vector& fontDescriptions, + const TextAbstraction::FontDescription& defaultFontDescription, + TextAbstraction::PointSize26Dot6 defaultPointSize, + float fontSizeScale, + CharacterIndex characterIndex, + TextAbstraction::FontDescription& fontDescription, + TextAbstraction::PointSize26Dot6& fontPointSize, + bool& isDefaultFont) { - // Get the handle to the font client. - TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + // Initialize with the default font's point size. + fontPointSize = defaultPointSize; - // Pointer to the font id buffer. - FontId* fontIdsBuffer = fontIds.Begin(); + // Initialize with the style parameters of the default font's style. + fontDescription = defaultFontDescription; - // Pointer to the 'is default' font buffer. - bool* isDefaultFontBuffer = isDefaultFont.Begin(); + // Initialize as a default font. + isDefaultFont = true; - // Used to temporarily store the style per character. - TextAbstraction::FontDescription fontDescription; - TextAbstraction::PointSize26Dot6 fontSize; + Length runIndex = 0u; Length familyIndex = 0u; Length weightIndex = 0u; - Length widthIndex = 0u; - Length slantIndex = 0u; - Length sizeIndex = 0u; - - // Traverse all the characters. - const CharacterIndex lastCharacterPlusOne = startIndex + numberOfCharacters; - for( CharacterIndex index = startIndex; index < lastCharacterPlusOne; ++index ) + 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) { - bool& defaultFont = *(isDefaultFontBuffer + index - startIndex ); - - Length runIndex = 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 ) + // 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) { - if( fontRun.familyDefined ) - { - defaultFont = false; - familyOverriden = true; - familyIndex = runIndex; - } - if( fontRun.weightDefined ) - { - defaultFont = false; - weightOverriden = true; - weightIndex = runIndex; - } - if( fontRun.widthDefined ) - { - defaultFont = false; - widthOverriden = true; - widthIndex = runIndex; - } - if( fontRun.slantDefined ) - { - defaultFont = false; - slantOverriden = true; - slantIndex = runIndex; - } - if( fontRun.sizeDefined ) - { - defaultFont = false; - sizeOverriden = true; - sizeIndex = runIndex; - } + isDefaultFont = false; + familyOverriden = true; + familyIndex = runIndex; } - } - - // Get the font id if is not the default font. - if( !defaultFont ) - { - if( familyOverriden ) + if(fontRun.weightDefined) { - const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + familyIndex ); - fontDescription.family = std::string( fontRun.familyName, fontRun.familyLength ); // TODO Could use move constructor when switch to c++11. + isDefaultFont = false; + weightOverriden = true; + weightIndex = runIndex; } - else + if(fontRun.widthDefined) { - fontDescription.family = defaultFontDescription.family; + isDefaultFont = false; + widthOverriden = true; + widthIndex = runIndex; } - - if( weightOverriden ) + if(fontRun.slantDefined) { - const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + weightIndex ); - fontDescription.weight = fontRun.weight; + isDefaultFont = false; + slantOverriden = true; + slantIndex = runIndex; } - else + if(fontRun.sizeDefined) { - fontDescription.weight = defaultFontDescription.weight; + isDefaultFont = false; + sizeOverriden = true; + sizeIndex = runIndex; } + } + } - if( widthOverriden ) - { - const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + widthIndex ); - fontDescription.width = fontRun.width; - } - else - { - fontDescription.width = defaultFontDescription.width; - } + // 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( slantOverriden ) - { - const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + slantIndex ); - fontDescription.slant = fontRun.slant; - } - else - { - fontDescription.slant = defaultFontDescription.slant; - } + if(weightOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + weightIndex); + fontDescription.weight = fontRun.weight; + } - if( sizeOverriden ) - { - const FontDescriptionRun& fontRun = *( fontDescriptionsBuffer + sizeIndex ); - fontSize = fontRun.size; - } - else - { - fontSize = defaultPointSize; - } + if(widthOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + widthIndex); + fontDescription.width = fontRun.width; + } - *( fontIdsBuffer + index - startIndex ) = fontClient.GetFontId( fontDescription, fontSize ); + if(slantOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + slantIndex); + fontDescription.slant = fontRun.slant; + } + + if(sizeOverriden) + { + const FontDescriptionRun& fontRun = *(fontDescriptionsBuffer + sizeIndex); + fontPointSize = static_cast(fontRun.size * fontSizeScale); } } } -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;