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=3fad598e279ab8225c7cc2a3fb36ce7c11120018;hp=a5feaefdd692299b080e212f44c887ce98e727bd;hb=a827febe27e8131e681c24c255472bbbf097905f;hpb=cdefdbdee1cb3fd4051e220bb185d97b6000a037 diff --git a/dali-toolkit/internal/text/multi-language-helper-functions.cpp b/dali-toolkit/internal/text/multi-language-helper-functions.cpp index a5feaef..3fad598 100644 --- a/dali-toolkit/internal/text/multi-language-helper-functions.cpp +++ b/dali-toolkit/internal/text/multi-language-helper-functions.cpp @@ -31,69 +31,112 @@ namespace Text { void MergeFontDescriptions( const Vector& fontDescriptions, - Vector& fontIds, const TextAbstraction::FontDescription& defaultFontDescription, TextAbstraction::PointSize26Dot6 defaultPointSize, - CharacterIndex startIndex, - Length numberOfCharacters ) + 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 ) + { + isDefaultFont = false; + weightOverriden = true; + weightIndex = runIndex; + } + if( fontRun.widthDefined ) { - 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; + 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; } } }