From: Seoyeon Kim Date: Fri, 7 Feb 2020 05:03:46 +0000 (+0900) Subject: [Tizen] Update UTF8 text array for 5 and 6 bytes X-Git-Tag: accepted/tizen/5.5/unified/20200303.170632^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=42de8cac720885107938c854516a7af3d7c8c371 [Tizen] Update UTF8 text array for 5 and 6 bytes - Update start and end offsets encoded in UTF8 - Add U5 and U6 cases to UTF8 array Change-Id: I6e84df7bb0673f62e09c8f55c6ae08f2c839b13e Signed-off-by: Seoyeon Kim --- diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSetConversion.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSetConversion.cpp index 3175baf..f3725d2 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSetConversion.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSetConversion.cpp @@ -134,6 +134,8 @@ int UtcDaliTextCharacterSetConversionGetUtf8Length(void) const static uint8_t U2 = 2u; const static uint8_t U3 = 3u; const static uint8_t U4 = 4u; + const static uint8_t U5 = 5u; + const static uint8_t U6 = 6u; const static uint8_t U0 = 0u; const static uint8_t UTF8_LENGTH[256] = { U1, U1, U1, U1, U1, U1, U1, U1, U1, U1, // @@ -167,8 +169,11 @@ int UtcDaliTextCharacterSetConversionGetUtf8Length(void) U4, U4, U4, U4, U4, U4, U4, U4, // lead byte = 1111 0xxx (U+10000 - U+1FFFFF) - U0, U0, U0, U0, // Non valid. - U0, U0, U0, U0, // Non valid. + U5, U5, U5, U5, // lead byte = 1111 10xx (U+200000 - U+3FFFFFF) + + U6, U6, // lead byte = 1111 110x (U+4000000 - U+7FFFFFFF) + + U0, U0, // Non valid. }; for( unsigned int index = 0; index < 256u; ++index ) @@ -211,8 +216,18 @@ int UtcDaliTextCharacterSetConversionGetNumberOfUtf8Characters(void) "\xF0\x9F\x98\x81 \xF0\x9F\x98\x82 \xF0\x9F\x98\x83 \xF0\x9F\x98\x84", 7u, }, + { + "5 bytes test", + "\xF8\xA0\x80\x80\x80", + 1u, + }, + { + "6 bytes test", + "\xFC\x84\x80\x80\x80\x80", + 1u, + }, }; - const unsigned int numberOfTests = 4u; + const unsigned int numberOfTests = 6u; for( unsigned int index = 0u; index < numberOfTests; ++index ) { @@ -235,6 +250,8 @@ int UtcDaliTextCharacterSetConversionGetNumberOfUtf8Bytes(void) unsigned int utf32_02[] = { 0x645, 0x631, 0x62D, 0x628, 0x627, 0x20, 0x628, 0x627, 0x644, 0x639, 0x627, 0x644, 0x645 }; // مرحبا بالعالم unsigned int utf32_03[] = { 0x939, 0x948, 0x932, 0x94B, 0x20, 0x935, 0x930, 0x94D, 0x932, 0x94D, 0x921 }; // हैलो वर्ल्ड unsigned int utf32_04[] = { 0x1F601, 0x20, 0x1F602, 0x20, 0x1F603, 0x20, 0x1F604 }; // Emojis + unsigned int utf32_05[] = { 0x800000 }; + unsigned int utf32_06[] = { 0x4000000 }; const GetNumberOfUtf8BytesData data[] = { @@ -262,8 +279,20 @@ int UtcDaliTextCharacterSetConversionGetNumberOfUtf8Bytes(void) 7u, 19u, }, + { + "5 bytes test", + utf32_05, + 1u, + 5u, + }, + { + "6 bytes test", + utf32_06, + 1u, + 6u + }, }; - const unsigned int numberOfTests = 4u; + const unsigned int numberOfTests = 6u; for( unsigned int index = 0u; index < numberOfTests; ++index ) { @@ -282,14 +311,16 @@ int UtcDaliTextCharacterSetConversionUtf8ToUtf32(void) ToolkitTestApplication application; tet_infoline(" UtcDaliTextCharacterSetConversionGetNumberOfUtf8Bytes"); - char utf8_06[] = { -8, -7, -6, -5, -4, -3, -2, -1 }; // Invalid string + char utf8_06[] = { -2, -1 }; // Invalid string unsigned int utf32_01[] = { 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64 }; // Hello World unsigned int utf32_02[] = { 0xA, 0x20, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0xA, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64 }; // Hello World + CR and CR+LF unsigned int utf32_03[] = { 0x645, 0x631, 0x62D, 0x628, 0x627, 0x20, 0x628, 0x627, 0x644, 0x639, 0x627, 0x644, 0x645 }; // مرحبا بالعالم unsigned int utf32_04[] = { 0x939, 0x948, 0x932, 0x94B, 0x20, 0x935, 0x930, 0x94D, 0x932, 0x94D, 0x921 }; // हैलो वर्ल्ड unsigned int utf32_05[] = { 0x1F601, 0x20, 0x1F602, 0x20, 0x1F603, 0x20, 0x1F604 }; // Emojis - unsigned int utf32_06[] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; // Invalid string + unsigned int utf32_06[] = { 0x800000 }; + unsigned int utf32_07[] = { 0x4000000 }; + unsigned int utf32_08[] = { 0x20, 0x20 }; // Invalid string const Utf8ToUtf32Data data[] = { @@ -319,12 +350,22 @@ int UtcDaliTextCharacterSetConversionUtf8ToUtf32(void) utf32_05, }, { + "5 bytes test", + "\xF8\xA0\x80\x80\x80", + utf32_06, + }, + { + "6 bytes test", + "\xFC\x84\x80\x80\x80\x80", + utf32_07, + }, + { "Invalid text", utf8_06, - utf32_06, + utf32_08, }, }; - const unsigned int numberOfTests = 6u; + const unsigned int numberOfTests = 8u; for( unsigned int index = 0u; index < numberOfTests; ++index ) { @@ -347,6 +388,8 @@ int UtcDaliTextCharacterSetConversionUtf32ToUtf8(void) unsigned int utf32_02[] = { 0x645, 0x631, 0x62D, 0x628, 0x627, 0x20, 0x628, 0x627, 0x644, 0x639, 0x627, 0x644, 0x645 }; // مرحبا بالعالم unsigned int utf32_03[] = { 0x939, 0x948, 0x932, 0x94B, 0x20, 0x935, 0x930, 0x94D, 0x932, 0x94D, 0x921 }; // हैलो वर्ल्ड unsigned int utf32_04[] = { 0x1F601, 0x20, 0x1F602, 0x20, 0x1F603, 0x20, 0x1F604 }; // Emojis + unsigned int utf32_05[] = { 0x800000 }; + unsigned int utf32_06[] = { 0x4000000 }; struct Utf32ToUtf8Data data[] = { @@ -374,9 +417,21 @@ int UtcDaliTextCharacterSetConversionUtf32ToUtf8(void) 7u, "\xF0\x9F\x98\x81 \xF0\x9F\x98\x82 \xF0\x9F\x98\x83 \xF0\x9F\x98\x84", }, + { + "5 bytes test", + utf32_05, + 1u, + "\xF8\xA0\x80\x80\x80", + }, + { + "6 bytes test", + utf32_06, + 1u, + "\xFC\x84\x80\x80\x80\x80", + }, }; - const unsigned int numberOfTests = 4u; + const unsigned int numberOfTests = 6u; for( unsigned int index = 0u; index < numberOfTests; ++index ) { diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp index ec172d0..064f663 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Controller.cpp @@ -349,8 +349,8 @@ int UtcDaliTextControllerImfPreeditStyle(void) imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 ); controller->OnInputMethodContextEvent( inputMethodContext, imfEvent ); - // Set the preedit style as HIGHLIGHT_SUB4 - inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::HIGHLIGHT_SUB4 ); + // Set the preedit style as CUSTOM_PLATFORM_STYLE_1 + inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_1 ); controller->GetNaturalSize(); controller->GetText( text ); @@ -359,8 +359,8 @@ int UtcDaliTextControllerImfPreeditStyle(void) imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 ); controller->OnInputMethodContextEvent( inputMethodContext, imfEvent ); - // Set the preedit style as HIGHLIGHT_SUB5 - inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::HIGHLIGHT_SUB5 ); + // Set the preedit style as CUSTOM_PLATFORM_STYLE_2 + inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_2 ); controller->GetNaturalSize(); controller->GetText( text ); @@ -369,8 +369,8 @@ int UtcDaliTextControllerImfPreeditStyle(void) imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 ); controller->OnInputMethodContextEvent( inputMethodContext, imfEvent ); - // Set the preedit style as HIGHLIGHT_SUB6 - inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::HIGHLIGHT_SUB6 ); + // Set the preedit style as CUSTOM_PLATFORM_STYLE_3 + inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_3 ); controller->GetNaturalSize(); controller->GetText( text ); @@ -379,8 +379,8 @@ int UtcDaliTextControllerImfPreeditStyle(void) imfEvent = InputMethodContext::EventData( InputMethodContext::PRE_EDIT, "w", 6, 1 ); controller->OnInputMethodContextEvent( inputMethodContext, imfEvent ); - // Set the preedit style as HIGHLIGHT_SUB7 - inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::HIGHLIGHT_SUB7 ); + // Set the preedit style as CUSTOM_PLATFORM_STYLE_4 + inputMethodContext.SetPreeditStyle( InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_4 ); controller->GetNaturalSize(); controller->GetText( text ); diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.cpp index 86c8bdb..0f74724 100755 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.cpp @@ -60,7 +60,7 @@ public: void ApplyOptions( const InputMethodOptions& options ); bool FilterEventKey( const Dali::KeyEvent& keyEvent ); void SetPreeditStyle( Dali::InputMethodContext::PreeditStyle type ); - void GetPreeditStyle( Vector< Dali::InputMethodContext::PreeditAttrData >& attrs ) const; + void GetPreeditStyle( Dali::InputMethodContext::PreEditAttributeDataContainer& attrs ) const; public: // Signals ActivatedSignalType& ActivatedSignal() { return mActivatedSignal; } @@ -87,7 +87,7 @@ private: bool mRestoreAfterFocusLost:1; ///< Whether the keyboard needs to be restored (activated ) after focus regained. bool mIdleCallbackConnected:1; ///< Whether the idle callback is already connected. InputMethodOptions mOptions; - Vector< Dali::InputMethodContext::PreeditAttrData > mPreeditAttrs; ///< Stores preedit attr data + Dali::InputMethodContext::PreEditAttributeDataContainer mPreeditAttrs; ///< Stores preedit attribute data ActivatedSignalType mActivatedSignal; KeyboardEventSignalType mEventSignal; @@ -218,12 +218,12 @@ bool InputMethodContext::FilterEventKey( const Dali::KeyEvent& keyEvent ) void InputMethodContext::SetPreeditStyle( Dali::InputMethodContext::PreeditStyle type ) { - Dali::InputMethodContext::PreeditAttrData data; + Dali::InputMethodContext::PreeditAttributeData data; data.preeditType = type; mPreeditAttrs.PushBack( data ); } -void InputMethodContext::GetPreeditStyle( Vector< Dali::InputMethodContext::PreeditAttrData >& attrs ) const +void InputMethodContext::GetPreeditStyle( Dali::InputMethodContext::PreEditAttributeDataContainer& attrs ) const { attrs = mPreeditAttrs; } @@ -328,7 +328,7 @@ void InputMethodContext::SetPreeditStyle( Dali::InputMethodContext::PreeditStyle Internal::Adaptor::InputMethodContext::GetImplementation(*this).SetPreeditStyle( type ); } -void InputMethodContext::GetPreeditStyle( Vector< Dali::InputMethodContext::PreeditAttrData >& attrs ) const +void InputMethodContext::GetPreeditStyle( Dali::InputMethodContext::PreEditAttributeDataContainer& attrs ) const { Internal::Adaptor::InputMethodContext::GetImplementation(*this).GetPreeditStyle( attrs ); } diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.h index 8c34440..d53e02a 100755 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.h +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-input-method-context.h @@ -102,24 +102,31 @@ public: */ enum class PreeditStyle { - NONE, ///< None style - UNDERLINE, ///< Underline substring style - REVERSE, ///< Reverse substring style - HIGHLIGHT, ///< Highlight substring style - HIGHLIGHT_SUB4, ///< SUB4 substring style - HIGHLIGHT_SUB5, ///< SUB5 substring style - HIGHLIGHT_SUB6, ///< SUB6 substring style - HIGHLIGHT_SUB7 ///< SUB7 substring style + NONE, ///< None style + UNDERLINE, ///< Underline substring style + REVERSE, ///< Reverse substring style + HIGHLIGHT, ///< Highlight substring style + CUSTOM_PLATFORM_STYLE_1, ///< Custom style for platform + CUSTOM_PLATFORM_STYLE_2, ///< Custom style for platform + CUSTOM_PLATFORM_STYLE_3, ///< Custom style for platform + CUSTOM_PLATFORM_STYLE_4 ///< Custom style for platform }; /** * @brief This structure is for the preedit style types and indices. */ - struct PreeditAttrData + struct PreeditAttributeData { - PreeditStyle preeditType; /// The preedit style type - unsigned int startIndex; /// The start index of preedit - unsigned int endIndex; /// The end index of preedit + PreeditAttributeData() + : preeditType( PreeditStyle::NONE ), + startIndex( 0 ), + endIndex( 0 ) + { + } + + PreeditStyle preeditType; /// The preedit style type + unsigned int startIndex; /// The start index of preedit + unsigned int endIndex; /// The end index of preedit }; /** @@ -203,6 +210,8 @@ public: typedef Signal< void () > VoidSignalType; typedef Signal< void (bool) > StatusSignalType; + using PreEditAttributeDataContainer = Vector< Dali::InputMethodContext::PreeditAttributeData >; + public: /** @@ -323,11 +332,11 @@ public: void SetPreeditStyle( PreeditStyle type ); /** - * @brief Gets the preedit attrs data. + * @brief Gets the preedit attributes data. * - * @param[out] attrs The preedit attrs data. + * @param[out] attrs The preedit attributes data. */ - void GetPreeditStyle( Vector& attrs ) const; + void GetPreeditStyle( Dali::InputMethodContext::PreEditAttributeDataContainer& attrs ) const; public: diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 1f77534..7e050ff 100755 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -932,16 +932,8 @@ int UtcDaliTextFieldSetPropertyP(void) DALI_TEST_CHECK( !field.GetProperty( DevelTextField::Property::ENABLE_GRAB_HANDLE_POPUP ) ); // Check the background property - Property::Map backgroundMapSet; - Property::Map backgroundMapGet; - - backgroundMapSet["enable"] = true; - backgroundMapSet["color"] = Color::RED; - field.SetProperty( DevelTextField::Property::BACKGROUND, backgroundMapSet ); - - backgroundMapGet = field.GetProperty( DevelTextField::Property::BACKGROUND ); - DALI_TEST_EQUALS( backgroundMapGet.Count(), backgroundMapSet.Count(), TEST_LOCATION ); - DALI_TEST_EQUALS( DaliTestCheckMaps( backgroundMapGet, backgroundMapSet ), true, TEST_LOCATION ); + field.SetProperty( DevelTextField::Property::BACKGROUND, Color::RED ); + DALI_TEST_EQUALS( field.GetProperty( DevelTextField::Property::BACKGROUND ), Color::RED, TEST_LOCATION ); application.SendNotification(); application.Render(); diff --git a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h index fb940ba..3a4864c 100755 --- a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h @@ -118,23 +118,9 @@ namespace Property /** * @brief The default text background parameters. - * @details Name "textBackground", type Property::MAP. - * @note Use "textBackground" as property name to avoid conflict with Control's "background" property - * - * The background map contains the following keys: - * - * | %Property Name | Type | Required | Description | - * |----------------------|----------|----------|--------------------------------------------------------------------------------------------------------------------| - * | enable | BOOLEAN | No | True to enable the background or false to disable (the default value is false) | - * | color | VECTOR4 | No | The color of the background (the default value is Color::CYAN) | - * - * Example Usage: - * @code - * Property::Map propertyMap; - * propertyMap["enable"] = true; - * propertyMap["color"] = Color::RED; - * field.SetProperty( DevelTextField::Property::BACKGROUND, propertyMap ); - * @endcode + * @details Name "textBackground", type Property::VECTOR4. + * @note Use "textBackground" as property name to avoid conflict with Control's "background" property. + * @note The default value is Color::TRANSPARENT. */ BACKGROUND = ELLIPSIS + 5 diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 91aa5a6..1c2e0c3 100755 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -136,7 +136,7 @@ DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "enableShiftSelection", DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "enableGrabHandle", BOOLEAN, ENABLE_GRAB_HANDLE ) DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "matchSystemLanguageDirection", BOOLEAN, MATCH_SYSTEM_LANGUAGE_DIRECTION ) DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "enableGrabHandlePopup", BOOLEAN, ENABLE_GRAB_HANDLE_POPUP ) -DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "textBackground", MAP, BACKGROUND ) +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "textBackground", VECTOR4, BACKGROUND ) DALI_SIGNAL_REGISTRATION( Toolkit, TextField, "textChanged", SIGNAL_TEXT_CHANGED ) DALI_SIGNAL_REGISTRATION( Toolkit, TextField, "maxLengthReached", SIGNAL_MAX_LENGTH_REACHED ) @@ -781,10 +781,13 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } case Toolkit::DevelTextField::Property::BACKGROUND: { - const bool update = SetBackgroundProperties( impl.mController, value, Text::EffectStyle::DEFAULT ); - if( update ) + if( impl.mController ) { - impl.mRenderer.Reset(); + const Vector4 backgroundColor = value.Get< Vector4 >(); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p BACKGROUND %f,%f,%f,%f\n", impl.mController.Get(), backgroundColor.r, backgroundColor.g, backgroundColor.b, backgroundColor.a ); + + impl.mController->SetBackgroundEnabled( true ); + impl.mController->SetBackgroundColor( backgroundColor ); } break; } @@ -1197,7 +1200,7 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } case Toolkit::DevelTextField::Property::ENABLE_GRAB_HANDLE_POPUP: { - if (impl.mController) + if( impl.mController ) { value = impl.mController->IsGrabHandlePopupEnabled(); } @@ -1205,7 +1208,10 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } case Toolkit::DevelTextField::Property::BACKGROUND: { - GetBackgroundProperties( impl.mController, value, Text::EffectStyle::DEFAULT ); + if( impl.mController ) + { + value = impl.mController->GetBackgroundColor(); + } break; } } //switch diff --git a/dali-toolkit/internal/text/character-set-conversion.cpp b/dali-toolkit/internal/text/character-set-conversion.cpp index d79fbc3..7402292 100644 --- a/dali-toolkit/internal/text/character-set-conversion.cpp +++ b/dali-toolkit/internal/text/character-set-conversion.cpp @@ -33,6 +33,8 @@ namespace const static uint8_t U2 = 2u; const static uint8_t U3 = 3u; const static uint8_t U4 = 4u; + const static uint8_t U5 = 5u; + const static uint8_t U6 = 6u; const static uint8_t U0 = 0u; const static uint8_t UTF8_LENGTH[256] = { U1, U1, U1, U1, U1, U1, U1, U1, U1, U1, // @@ -66,8 +68,11 @@ namespace U4, U4, U4, U4, U4, U4, U4, U4, // lead byte = 1111 0xxx (U+10000 - U+1FFFFF) - U0, U0, U0, U0, // Non valid. - U0, U0, U0, U0, // Non valid. + U5, U5, U5, U5, // lead byte = 1111 10xx (U+200000 - U+3FFFFFF) + + U6, U6, // lead byte = 1111 110x (U+4000000 - U+7FFFFFFF) + + U0, U0, // Non valid. }; const uint8_t CR = 0xd; @@ -118,6 +123,14 @@ uint32_t GetNumberOfUtf8Bytes( const uint32_t* const utf32, uint32_t numberOfCha { numberOfBytes += U4; } + else if( code < 0x4000000u ) + { + numberOfBytes += U5; + } + else if( code < 0x80000000u ) + { + numberOfBytes += U6; + } } return numberOfBytes; @@ -197,6 +210,40 @@ uint32_t Utf8ToUtf32( const uint8_t* const utf8, uint32_t length, uint32_t* utf3 break; } + case U5: + { + uint32_t& code = *utf32++; + code = leadByte & 0x03u; + begin++; + code <<= 6u; + code |= *begin++ & 0x3fu; + code <<= 6u; + code |= *begin++ & 0x3fu; + code <<= 6u; + code |= *begin++ & 0x3fu; + code <<= 6u; + code |= *begin++ & 0x3fu; + break; + } + + case U6: + { + uint32_t& code = *utf32++; + code = leadByte & 0x01u; + begin++; + code <<= 6u; + code |= *begin++ & 0x3fu; + code <<= 6u; + code |= *begin++ & 0x3fu; + code <<= 6u; + code |= *begin++ & 0x3fu; + code <<= 6u; + code |= *begin++ & 0x3fu; + code <<= 6u; + code |= *begin++ & 0x3fu; + break; + } + case U0: // Invalid case { begin++; @@ -231,13 +278,30 @@ uint32_t Utf32ToUtf8( const uint32_t* const utf32, uint32_t numberOfCharacters, } else if( code < 0x10000u ) { - *utf8++ = static_cast( code >> 12u ) | 0xe0u; // lead byte for 2 byte sequence + *utf8++ = static_cast( code >> 12u ) | 0xe0u; // lead byte for 3 byte sequence *utf8++ = static_cast( ( code >> 6u ) & 0x3f ) | 0x80u; // continuation byte *utf8++ = static_cast( code & 0x3f ) | 0x80u; // continuation byte } else if( code < 0x200000u ) { - *utf8++ = static_cast( code >> 18u ) | 0xf0u; // lead byte for 2 byte sequence + *utf8++ = static_cast( code >> 18u ) | 0xf0u; // lead byte for 4 byte sequence + *utf8++ = static_cast( ( code >> 12u ) & 0x3f ) | 0x80u; // continuation byte + *utf8++ = static_cast( ( code >> 6u ) & 0x3f ) | 0x80u; // continuation byte + *utf8++ = static_cast( code & 0x3f ) | 0x80u; // continuation byte + } + else if( code < 0x4000000u ) + { + *utf8++ = static_cast( code >> 24u ) | 0xf8u; // lead byte for 5 byte sequence + *utf8++ = static_cast( ( code >> 18u ) & 0x3f ) | 0x80u; // continuation byte + *utf8++ = static_cast( ( code >> 12u ) & 0x3f ) | 0x80u; // continuation byte + *utf8++ = static_cast( ( code >> 6u ) & 0x3f ) | 0x80u; // continuation byte + *utf8++ = static_cast( code & 0x3f ) | 0x80u; // continuation byte + } + else if( code < 0x80000000u ) + { + *utf8++ = static_cast( code >> 30u ) | 0xfcu; // lead byte for 6 byte sequence + *utf8++ = static_cast( ( code >> 24u ) & 0x3f ) | 0x80u; // continuation byte + *utf8++ = static_cast( ( code >> 18u ) & 0x3f ) | 0x80u; // continuation byte *utf8++ = static_cast( ( code >> 12u ) & 0x3f ) | 0x80u; // continuation byte *utf8++ = static_cast( ( code >> 6u ) & 0x3f ) | 0x80u; // continuation byte *utf8++ = static_cast( code & 0x3f ) | 0x80u; // continuation byte diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 10d52a2..8f4de65 100755 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -1086,16 +1086,16 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) mEventData->mPreEditFlag && ( 0u != mModel->mVisualModel->mCharactersToGlyph.Count() ) ) { - Vector< Dali::InputMethodContext::PreeditAttrData > attrs; + Dali::InputMethodContext::PreEditAttributeDataContainer attrs; mEventData->mInputMethodContext.GetPreeditStyle( attrs ); Dali::InputMethodContext::PreeditStyle type = Dali::InputMethodContext::PreeditStyle::NONE; // Check the type of preedit and run it. - for( Vector::Iterator it = attrs.Begin(), endIt = attrs.End(); it != endIt; it++ ) + for( Dali::InputMethodContext::PreEditAttributeDataContainer::Iterator it = attrs.Begin(), endIt = attrs.End(); it != endIt; it++ ) { - Dali::InputMethodContext::PreeditAttrData attrData = *it; + Dali::InputMethodContext::PreeditAttributeData attrData = *it; DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::UpdateModel PreeditStyle type : %d start %d end %d \n", attrData.preeditType, attrData.startIndex, attrData.endIndex ); - type = attrData.preeditType; + type = attrData.preeditType; // Check the number of commit characters for the start position. unsigned int numberOfCommit = mEventData->mPrimaryCursorPosition - mEventData->mPreEditLength; @@ -1108,7 +1108,7 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) // Add the underline for the pre-edit text. GlyphRun underlineRun; underlineRun.glyphIndex = attrData.startIndex + numberOfCommit; - underlineRun.numberOfGlyphs = attrData.endIndex - attrData.startIndex; + underlineRun.numberOfGlyphs = numberOfIndices; mModel->mVisualModel->mUnderlineRuns.PushBack( underlineRun ); break; } @@ -1141,9 +1141,9 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) mModel->mLogicalModel->mBackgroundColorRuns.PushBack( backgroundColorRun ); break; } - case Dali::InputMethodContext::PreeditStyle::HIGHLIGHT_SUB4: + case Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_1: { - // HIGHLIGHT_SUB4 should be drawn with background and underline together. + // CUSTOM_PLATFORM_STYLE_1 should be drawn with background and underline together. ColorRun backgroundColorRun; backgroundColorRun.characterRun.characterIndex = attrData.startIndex + numberOfCommit; backgroundColorRun.characterRun.numberOfCharacters = numberOfIndices; @@ -1152,13 +1152,13 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) GlyphRun underlineRun; underlineRun.glyphIndex = attrData.startIndex + numberOfCommit; - underlineRun.numberOfGlyphs = attrData.endIndex - attrData.startIndex; + underlineRun.numberOfGlyphs = numberOfIndices; mModel->mVisualModel->mUnderlineRuns.PushBack( underlineRun ); break; } - case Dali::InputMethodContext::PreeditStyle::HIGHLIGHT_SUB5: + case Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_2: { - // HIGHLIGHT_SUB5 should be drawn with background and underline together. + // CUSTOM_PLATFORM_STYLE_2 should be drawn with background and underline together. ColorRun backgroundColorRun; backgroundColorRun.characterRun.characterIndex = attrData.startIndex + numberOfCommit; backgroundColorRun.characterRun.numberOfCharacters = numberOfIndices; @@ -1167,13 +1167,13 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) GlyphRun underlineRun; underlineRun.glyphIndex = attrData.startIndex + numberOfCommit; - underlineRun.numberOfGlyphs = attrData.endIndex - attrData.startIndex; + underlineRun.numberOfGlyphs = numberOfIndices; mModel->mVisualModel->mUnderlineRuns.PushBack( underlineRun ); break; } - case Dali::InputMethodContext::PreeditStyle::HIGHLIGHT_SUB6: + case Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_3: { - // HIGHLIGHT_SUB6 should be drawn with background and underline together. + // CUSTOM_PLATFORM_STYLE_3 should be drawn with background and underline together. ColorRun backgroundColorRun; backgroundColorRun.characterRun.characterIndex = attrData.startIndex + numberOfCommit; backgroundColorRun.characterRun.numberOfCharacters = numberOfIndices; @@ -1182,13 +1182,13 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) GlyphRun underlineRun; underlineRun.glyphIndex = attrData.startIndex + numberOfCommit; - underlineRun.numberOfGlyphs = attrData.endIndex - attrData.startIndex; + underlineRun.numberOfGlyphs = numberOfIndices; mModel->mVisualModel->mUnderlineRuns.PushBack( underlineRun ); break; } - case Dali::InputMethodContext::PreeditStyle::HIGHLIGHT_SUB7: + case Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_4: { - // HIGHLIGHT_SUB7 should be drawn with background and underline together. + // CUSTOM_PLATFORM_STYLE_4 should be drawn with background and underline together. ColorRun backgroundColorRun; backgroundColorRun.characterRun.characterIndex = attrData.startIndex + numberOfCommit; backgroundColorRun.characterRun.numberOfCharacters = numberOfIndices; @@ -1197,7 +1197,7 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) GlyphRun underlineRun; underlineRun.glyphIndex = attrData.startIndex + numberOfCommit; - underlineRun.numberOfGlyphs = attrData.endIndex - attrData.startIndex; + underlineRun.numberOfGlyphs = numberOfIndices; mModel->mVisualModel->mUnderlineRuns.PushBack( underlineRun ); break; }