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-support-impl.cpp;h=99a969c298f5a370b23288a95a2c22e1e6d8bc05;hp=6ca96ad284b10a8ed37223829b2a95c2312762f4;hb=528aa3699cd51dab5115bca1aaebb65d4bc67c15;hpb=95faa4c96dcfcc76207eace1d6a00ba0aef714f0 diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp old mode 100644 new mode 100755 index 6ca96ad..99a969c --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2019 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. @@ -20,7 +20,7 @@ // EXTERNAL INCLUDES #include -#include +#include #include // INTERNAL INCLUDES @@ -204,6 +204,9 @@ void MultilanguageSupport::SetScripts( const Vector& text, // Pointers to the text buffer. const Character* const textBuffer = text.Begin(); + // Initialize whether is right to left direction + currentScriptRun.isRightToLeft = false; + // Traverse all characters and set the scripts. const Length lastCharacter = startIndex + numberOfCharacters; for( Length index = startIndex; index < lastCharacter; ++index ) @@ -226,6 +229,9 @@ void MultilanguageSupport::SetScripts( const Vector& text, while( !endOfText && ( TextAbstraction::COMMON == script ) ) { + // Check if whether is right to left markup and Keeps true if the previous value was true. + currentScriptRun.isRightToLeft = currentScriptRun.isRightToLeft || TextAbstraction::IsRightToLeftMark( character ); + if( TextAbstraction::EMOJI == currentScriptRun.script ) { // Emojis doesn't mix well with characters common to all scripts. Insert the emoji run. @@ -262,6 +268,8 @@ void MultilanguageSupport::SetScripts( const Vector& text, currentScriptRun.characterRun.numberOfCharacters = 0u; currentScriptRun.script = TextAbstraction::UNKNOWN; numberOfAllScriptCharacters = 0u; + // Initialize whether is right to left direction + currentScriptRun.isRightToLeft = false; } // Get the next character. @@ -288,7 +296,7 @@ void MultilanguageSupport::SetScripts( const Vector& text, ( TextAbstraction::EMOJI != script ) ) { // Sets the direction of the first valid script. - isParagraphRTL = TextAbstraction::IsRightToLeftScript( script ); + isParagraphRTL = currentScriptRun.isRightToLeft || TextAbstraction::IsRightToLeftScript( script ); isFirstScriptToBeSet = false; } @@ -332,6 +340,8 @@ void MultilanguageSupport::SetScripts( const Vector& text, currentScriptRun.characterRun.numberOfCharacters = numberOfAllScriptCharacters + 1u; // Adds the white spaces which are at the begining of the script. currentScriptRun.script = script; numberOfAllScriptCharacters = 0u; + // Check if whether is right to left script. + currentScriptRun.isRightToLeft = TextAbstraction::IsRightToLeftScript( currentScriptRun.script ); } else { @@ -425,6 +435,8 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, currentFontRun.characterRun.characterIndex = startIndex; currentFontRun.characterRun.numberOfCharacters = 0u; currentFontRun.fontId = 0u; + currentFontRun.isBoldRequired = false; + currentFontRun.isItalicRequired = false; // Get the font client. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); @@ -436,20 +448,15 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, Vector::ConstIterator scriptRunEndIt = scripts.End(); bool isNewParagraphCharacter = false; - FontId currentFontId = 0u; - FontId previousFontId = 0u; bool isPreviousEmojiScript = false; - // Description of fallback font which is selected at current iteration. - TextAbstraction::FontDescription selectedFontDescription; - CharacterIndex lastCharacter = startIndex + numberOfCharacters; for( Length index = startIndex; index < lastCharacter; ++index ) { // Get the current character. const Character character = *( textBuffer + index ); - bool needSoftwareBoldening = false; - bool needSoftwareItalic = false; + bool isItalicRequired = false; + bool isBoldRequired = false; // new description for current character TextAbstraction::FontDescription currentFontDescription; @@ -465,7 +472,6 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Get the font for the current character. FontId fontId = fontClient.GetFontId( currentFontDescription, currentFontPointSize ); - currentFontId = fontId; // Get the script for the current character. Script script = GetScript( index, @@ -529,6 +535,8 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, currentFontRun.characterRun.characterIndex = currentFontRun.characterRun.characterIndex + currentFontRun.characterRun.numberOfCharacters; currentFontRun.characterRun.numberOfCharacters = 0u; currentFontRun.fontId = fontId; + currentFontRun.isItalicRequired = false; + currentFontRun.isBoldRequired = false; } // If the given font is not valid, it means either: @@ -553,133 +561,94 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // supports the 'white space'. However, that font may not support the DEVANAGARI script. isCommonScript = TextAbstraction::IsCommonScript( character ); - if( isCommonScript ) + // Check in the valid fonts cache. + ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script ); + + if( NULL != validateFontsPerScript ) { - if( isValidCachedDefaultFont && - ( isDefaultFont || ( currentFontId == previousFontId ) ) && - !isEmojiScript ) + // This cache stores valid fonts set by the user. + isValidFont = validateFontsPerScript->IsValidFont( fontId ); + + // It may happen that a validated font for a script doesn't have all the glyphs for that script. + // i.e a font validated for the CJK script may contain glyphs for the chinese language but not for the Japanese. + if( isValidFont ) { - // At this point the character common for all scripts has no font assigned. - // If there is a valid previously cached default font for it, use that one. - fontId = cachedDefaultFontId; + // Checks if the current character is supported by the font is needed. + isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); } } - else + + if( !isValidFont ) // (2) { - // Check in the valid fonts cache. - ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script ); + // The selected font is not stored in any cache. - if( NULL != validateFontsPerScript ) - { - // This cache stores valid fonts set by the user. - isValidFont = validateFontsPerScript->IsValidFont( fontId ); + // Checks if the current character is supported by the selected font. + isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); - // It may happen that a validated font for a script doesn't have all the glyphs for that script. - // i.e a font validated for the CJK script may contain glyphs for the chinese language but not for the Japanese. - if( isValidFont ) + // If there is a valid font, cache it. + if( isValidFont && !isCommonScript ) + { + if( NULL == validateFontsPerScript ) { - // Checks if the current character is supported by the font is needed. - isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); + validateFontsPerScript = new ValidateFontsPerScript(); + + *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript; } + + validateFontsPerScript->mValidFonts.PushBack( fontId ); } - if( !isValidFont ) // (2) + if( !isValidFont && ( fontId != cachedDefaultFontId ) && ( !TextAbstraction::IsNewParagraph( character ) )) // (3) { - // The selected font is not stored in any cache. - - // Checks if the current character is supported by the selected font. - isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); + // The selected font by the user or the platform's default font has failed to validate the character. - // Emojis are present in many monochrome fonts; prefer color by default. - if( isValidFont && - isEmojiScript ) + // Checks if the previously discarted cached default font supports the character. + bool isValidCachedFont = false; + if( isValidCachedDefaultFont ) { - const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); - - // For color emojis, the font is valid if the glyph is a color glyph (the bitmap is RGBA). - isValidFont = fontClient.IsColorGlyph( fontId, glyphIndex ); + isValidCachedFont = fontClient.IsCharacterSupportedByFont( cachedDefaultFontId, character ); } - // If there is a valid font, cache it. - if( isValidFont ) + if( isValidCachedFont ) { - if( NULL == validateFontsPerScript ) - { - validateFontsPerScript = new ValidateFontsPerScript(); - - *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript; - } - - validateFontsPerScript->mValidFonts.PushBack( fontId ); + // Use the cached default font for the script if there is one. + fontId = cachedDefaultFontId; } - - if( !isValidFont && ( fontId != cachedDefaultFontId ) ) // (3) + else { - // The selected font by the user or the platform's default font has failed to validate the character. + // There is no valid cached default font for the script. - // Checks if the previously discarted cached default font supports the character. - bool isValidCachedFont = false; - if( isValidCachedDefaultFont ) - { - isValidCachedFont = fontClient.IsCharacterSupportedByFont( cachedDefaultFontId, character ); - } + DefaultFonts* defaultFontsPerScript = NULL; + + // Find a fallback-font. + fontId = fontClient.FindFallbackFont( character, + currentFontDescription, + currentFontPointSize, + false ); - if( isValidCachedFont ) + if( 0u == fontId ) { - // Use the cached default font for the script if there is one. - fontId = cachedDefaultFontId; + fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize ); } - else - { - // There is no valid cached default font for the script. - - DefaultFonts* defaultFontsPerScript = NULL; - - // Emojis are present in many monochrome fonts; prefer color by default. - const bool preferColor = ( TextAbstraction::EMOJI == script ); - - // Find a fallback-font. - fontId = fontClient.FindFallbackFont( character, - currentFontDescription, - currentFontPointSize, - preferColor ); - - if( 0u == fontId ) - { - // If the system does not support a suitable font, fallback to Latin - defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + TextAbstraction::LATIN ); - if( NULL != defaultFontsPerScript ) - { - fontId = defaultFontsPerScript->FindFont( fontClient, - currentFontDescription, - currentFontPointSize ); - } - } - if( 0u == fontId ) + if ( !isCommonScript && (script != TextAbstraction::UNKNOWN) ) + { + // Cache the font if it is not an unknown script + if( NULL == defaultFontsPerScript ) { - fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize ); - } + defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script ); - if ( script != TextAbstraction::UNKNOWN ) - { - // Cache the font if it is not an unknown script if( NULL == defaultFontsPerScript ) { - defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script ); - - if( NULL == defaultFontsPerScript ) - { - defaultFontsPerScript = new DefaultFonts(); - *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; - } + defaultFontsPerScript = new DefaultFonts(); + *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; } - defaultFontsPerScript->Cache( currentFontDescription, fontId ); } + defaultFontsPerScript->Cache( currentFontDescription, fontId ); } - } // !isValidFont (3) - } // !isValidFont (2) - } // !isCommonScript + } + } // !isValidFont (3) + } // !isValidFont (2) } // !isValidFont (1) #ifdef DEBUG_ENABLED @@ -695,22 +664,17 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, } #endif - if( fontId != currentFontRun.fontId ) - { - fontClient.GetDescription(fontId,selectedFontDescription); - } - - // Developer sets bold to character but selected font cannot support it - needSoftwareBoldening = ( currentFontDescription.weight >= TextAbstraction::FontWeight::BOLD ) && ( selectedFontDescription.weight < TextAbstraction::FontWeight::BOLD ); + // Whether bols style is required. + isBoldRequired = ( currentFontDescription.weight >= TextAbstraction::FontWeight::BOLD ); - // Developer sets italic to character but selected font cannot support it - needSoftwareItalic = ( currentFontDescription.slant == TextAbstraction::FontSlant::ITALIC ) && ( selectedFontDescription.slant < TextAbstraction::FontSlant::ITALIC ); + // Whether italic style is required. + isItalicRequired = ( currentFontDescription.slant >= TextAbstraction::FontSlant::ITALIC ); // The font is now validated. if( ( fontId != currentFontRun.fontId ) || isNewParagraphCharacter || // If font id is same as previous but style is diffrent, initialize new one - ( ( fontId == currentFontRun.fontId ) && ( ( needSoftwareBoldening != currentFontRun.softwareBold ) || ( needSoftwareItalic != currentFontRun.softwareItalic ) ) ) ) + ( ( fontId == currentFontRun.fontId ) && ( ( isBoldRequired != currentFontRun.isBoldRequired ) || ( isItalicRequired != currentFontRun.isItalicRequired ) ) ) ) { // Current run needs to be stored and a new one initialized. @@ -725,8 +689,8 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, currentFontRun.characterRun.characterIndex = currentFontRun.characterRun.characterIndex + currentFontRun.characterRun.numberOfCharacters; currentFontRun.characterRun.numberOfCharacters = 0u; currentFontRun.fontId = fontId; - currentFontRun.softwareItalic = needSoftwareItalic; - currentFontRun.softwareBold = needSoftwareBoldening; + currentFontRun.isBoldRequired = isBoldRequired; + currentFontRun.isItalicRequired = isItalicRequired; } // Add one more character to the run. @@ -734,7 +698,6 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Whether the current character is a new paragraph character. isNewParagraphCharacter = TextAbstraction::IsNewParagraph( character ); - previousFontId = currentFontId; isPreviousEmojiScript = isEmojiScript; } // end traverse characters.