From da927214f345490b4fc571bb0cf23383583f188b Mon Sep 17 00:00:00 2001 From: Seoyeon Kim Date: Mon, 5 Nov 2018 17:19:26 +0900 Subject: [PATCH] Revert "[Tizen] Check supported by font and find fallback font for common script." This reverts commit 517f682b687f203edc00c698806f898c150323f5. --- .../utc-Dali-Text-MultiLanguage.cpp | 100 +------------ .../internal/text/multi-language-support-impl.cpp | 166 ++++++++++++--------- 2 files changed, 99 insertions(+), 167 deletions(-) mode change 100755 => 100644 automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp mode change 100755 => 100644 dali-toolkit/internal/text/multi-language-support-impl.cpp diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp old mode 100755 new mode 100644 index 559e34e..94bb485 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp @@ -1649,94 +1649,6 @@ int UtcDaliTextMultiLanguageValidateFonts01(void) Vector fontDescriptions11; fontDescriptions11.PushBack( fontDescription1101 ); - FontRun fontRun1201 = - { - { - 0u, - 6u - }, - 8u - }; - FontRun fontRun1202 = - { - { - 6u, - 1u - }, - 9u - }; - FontRun fontRun1203 = - { - { - 7u, - 5u - }, - 8u - }; - Vector fontRuns12; - fontRuns12.PushBack( fontRun1201 ); - fontRuns12.PushBack( fontRun1202 ); - fontRuns12.PushBack( fontRun1203 ); - - FontDescriptionRun fontDescription1201 = - { - { - 0u, - 6u - }, - const_cast( "TizenSans" ), - 9u, - TextAbstraction::FontWeight::NORMAL, - TextAbstraction::FontWidth::NORMAL, - TextAbstraction::FontSlant::NORMAL, - 0u, - true, - false, - false, - false, - false - }; - FontDescriptionRun fontDescription1202 = - { - { - 6u, - 1u - }, - const_cast( "TizenSans" ), - 9u, - TextAbstraction::FontWeight::NORMAL, - TextAbstraction::FontWidth::NORMAL, - TextAbstraction::FontSlant::NORMAL, - 0u, - true, - false, - false, - false, - false - }; - FontDescriptionRun fontDescription1203 = - { - { - 7u, - 5u - }, - const_cast( "TizenSans" ), - 9u, - TextAbstraction::FontWeight::NORMAL, - TextAbstraction::FontWidth::NORMAL, - TextAbstraction::FontSlant::NORMAL, - 0u, - true, - false, - false, - false, - false - }; - Vector fontDescriptions12; - fontDescriptions12.PushBack( fontDescription1201 ); - fontDescriptions12.PushBack( fontDescription1202 ); - fontDescriptions12.PushBack( fontDescription1203 ); - const ValidateFontsData data[] = { { @@ -1849,18 +1761,8 @@ int UtcDaliTextMultiLanguageValidateFonts01(void) fontDescriptions11, fontRuns11 }, - { - "Common script.", - "Hello \tworld", - "/tizen/TizenSansRegular.ttf", - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - 0u, - 12u, - fontDescriptions12, - fontRuns12 - }, }; - const unsigned int numberOfTests = 12u; + const unsigned int numberOfTests = 11u; for( unsigned int index = 0u; index < numberOfTests; ++index ) { diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp old mode 100755 new mode 100644 index 4b6eee2..6ca96ad --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -436,6 +436,8 @@ 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. @@ -463,6 +465,7 @@ 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, @@ -550,107 +553,133 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // supports the 'white space'. However, that font may not support the DEVANAGARI script. isCommonScript = TextAbstraction::IsCommonScript( character ); - // Check in the valid fonts cache. - ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script ); - - if( NULL != validateFontsPerScript ) + if( isCommonScript ) { - // 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 ) + if( isValidCachedDefaultFont && + ( isDefaultFont || ( currentFontId == previousFontId ) ) && + !isEmojiScript ) { - // Checks if the current character is supported by the font is needed. - isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); + // 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; } } - - if( !isValidFont ) // (2) + else { - // 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 ); + // Check in the valid fonts cache. + ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script ); - // Emojis are present in many monochrome fonts; prefer color by default. - if( isValidFont && - isEmojiScript ) + if( NULL != validateFontsPerScript ) { - const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); + // This cache stores valid fonts set by the user. + isValidFont = validateFontsPerScript->IsValidFont( fontId ); - // For color emojis, the font is valid if the glyph is a color glyph (the bitmap is RGBA). - isValidFont = fontClient.IsColorGlyph( fontId, glyphIndex ); - } - - // If there is a valid font, cache it. - if( isValidFont && !isCommonScript ) - { - if( NULL == validateFontsPerScript ) + // 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 ) { - validateFontsPerScript = new ValidateFontsPerScript(); - - *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript; + // Checks if the current character is supported by the font is needed. + isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); } - - validateFontsPerScript->mValidFonts.PushBack( fontId ); } - if( !isValidFont && ( fontId != cachedDefaultFontId ) && ( !TextAbstraction::IsNewParagraph( character ) )) // (3) + if( !isValidFont ) // (2) { - // The selected font by the user or the platform's default font has failed to validate the character. + // The selected font is not stored in any cache. - // Checks if the previously discarted cached default font supports the character. - bool isValidCachedFont = false; - if( isValidCachedDefaultFont ) - { - isValidCachedFont = fontClient.IsCharacterSupportedByFont( cachedDefaultFontId, character ); - } + // Checks if the current character is supported by the selected font. + isValidFont = fontClient.IsCharacterSupportedByFont( fontId, character ); - if( isValidCachedFont ) + // Emojis are present in many monochrome fonts; prefer color by default. + if( isValidFont && + isEmojiScript ) { - // Use the cached default font for the script if there is one. - fontId = cachedDefaultFontId; + 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 ); } - else + + // If there is a valid font, cache it. + if( isValidFont ) { - // There is no valid cached default font for the script. + if( NULL == validateFontsPerScript ) + { + validateFontsPerScript = new ValidateFontsPerScript(); - DefaultFonts* defaultFontsPerScript = NULL; + *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript; + } - // Emojis are present in many monochrome fonts; prefer color by default. - const bool preferColor = ( TextAbstraction::EMOJI == script ); + validateFontsPerScript->mValidFonts.PushBack( fontId ); + } - // Find a fallback-font. - fontId = fontClient.FindFallbackFont( character, - currentFontDescription, - currentFontPointSize, - preferColor ); + if( !isValidFont && ( fontId != cachedDefaultFontId ) ) // (3) + { + // The selected font by the user or the platform's default font has failed to validate the character. - if( 0u == fontId ) + // Checks if the previously discarted cached default font supports the character. + bool isValidCachedFont = false; + if( isValidCachedDefaultFont ) { - fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize ); + isValidCachedFont = fontClient.IsCharacterSupportedByFont( cachedDefaultFontId, character ); } - if ( !isCommonScript && (script != TextAbstraction::UNKNOWN) ) + if( isValidCachedFont ) + { + // Use the cached default font for the script if there is one. + fontId = cachedDefaultFontId; + } + else { - // Cache the font if it is not an unknown script - if( NULL == defaultFontsPerScript ) + // 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 ) { - defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script ); + // 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 ) + { + fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize ); + } + if ( script != TextAbstraction::UNKNOWN ) + { + // Cache the font if it is not an unknown script if( NULL == defaultFontsPerScript ) { - defaultFontsPerScript = new DefaultFonts(); - *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; + defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script ); + + if( NULL == defaultFontsPerScript ) + { + defaultFontsPerScript = new DefaultFonts(); + *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; + } } + defaultFontsPerScript->Cache( currentFontDescription, fontId ); } - defaultFontsPerScript->Cache( currentFontDescription, fontId ); } - } - } // !isValidFont (3) - } // !isValidFont (2) + } // !isValidFont (3) + } // !isValidFont (2) + } // !isCommonScript } // !isValidFont (1) #ifdef DEBUG_ENABLED @@ -705,6 +734,7 @@ 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. -- 2.7.4