From: Bowon Ryu Date: Mon, 7 Mar 2022 10:53:15 +0000 (+0000) Subject: Merge "Improve the underline markup" into devel/master X-Git-Tag: dali_2.1.13~8 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=22451f7abe0230b418d551d9eac0c685273e72f1;hp=c1b19f0b24c482e2af7f555c00250bbbb32112e6 Merge "Improve the underline markup" into devel/master --- diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp index 53474ae..c75f754 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextEditor-internal.cpp @@ -87,12 +87,12 @@ int UtcDaliTextEditorMarkupUnderline(void) application.SendNotification(); application.Render(); - uint32_t expectedNumberOfUnderlinedGlyphs = 5u; + uint32_t expectedNumberOfUnderlineRuns = 2u; Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor); const Text::Length numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -100,12 +100,11 @@ int UtcDaliTextEditorMarkupUnderline(void) //ABC are underlined DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.glyphIndex, 0u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 1u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[2u].glyphRun.glyphIndex, 2u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.numberOfGlyphs, 3u, TEST_LOCATION); //GH are underlined - DALI_TEST_EQUALS(underlineRuns[3u].glyphRun.glyphIndex, 5u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[4u].glyphRun.glyphIndex, 6u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 5u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.numberOfGlyphs, 2u, TEST_LOCATION); END_TEST; } @@ -128,9 +127,7 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) "ABC6then" "ABC7then" "ABC8then" - "ABC9end" - - ; + "ABC9end"; textEditor.SetProperty(TextEditor::Property::TEXT, testText); textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true); @@ -138,13 +135,12 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) application.SendNotification(); application.Render(); - const uint32_t NUMBER_OF_CASES = 9u; - uint32_t expectedNumberOfUnderlinedGlyphs = 36u; + const uint32_t expectedNumberOfUnderlineRuns = 9u; Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor); const Text::Length numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -153,20 +149,16 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) struct DataOfCase { std::string title; - uint32_t startIndex; - uint32_t endIndex; - GlyphIndex startGlyphIndex; - GlyphIndex endGlyphIndex; + GlyphIndex glyphIndex; + Length numberOfGlyphs; UnderlineStyleProperties properties; }; DataOfCase data[] = { //ABC1 {"ABC1", - 0u, - 3u, 5u, - 8u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -182,10 +174,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) //ABC2 {"ABC2", - 4u, - 7u, 13u, - 16u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -201,10 +191,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) //ABC3 {"ABC3", - 8u, - 11u, 21u, - 24u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -220,10 +208,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) //ABC4 {"ABC4", - 12u, - 15u, 29u, - 32u, + 4u, { Text::Underline::DOUBLE, Color::BLACK, @@ -239,10 +225,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) //ABC5 {"ABC5", - 16u, - 19u, 37u, - 40u, + 4u, { Text::Underline::SOLID, Color::GREEN, @@ -258,10 +242,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) //ABC6 {"ABC6", - 20u, - 23u, 45u, - 48u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -277,10 +259,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) //ABC7 {"ABC7", - 24u, - 27u, 53u, - 56u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -296,10 +276,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) //ABC8 {"ABC8", - 28u, - 31u, 61u, - 64u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -315,10 +293,8 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) // {"", - 32u, - 35u, 69u, - 72u, + 4u, { Text::Underline::DASHED, Color::BLUE, @@ -334,14 +310,12 @@ int UtcDaliTextEditorMarkupUnderlineAttributes(void) }; - for(uint32_t i = 0; i < NUMBER_OF_CASES; i++) + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) { tet_infoline(data[i].title.c_str()); - DALI_TEST_EQUALS(underlineRuns[data[i].startIndex].glyphRun.glyphIndex, data[i].startGlyphIndex, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[data[i].endIndex].glyphRun.glyphIndex, data[i].endGlyphIndex, TEST_LOCATION); - - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].startIndex].properties); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].endIndex].properties); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); } END_TEST; @@ -365,9 +339,7 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) "ABC6then" "ABC7then" "ABC8then" - "ABC9end" - - ; + "ABC9end"; textEditor.SetProperty(TextEditor::Property::TEXT, testText); textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true); @@ -375,13 +347,12 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) application.SendNotification(); application.Render(); - const uint32_t NUMBER_OF_CASES = 8u; - uint32_t expectedNumberOfUnderlinedGlyphs = 32u; + const uint32_t expectedNumberOfUnderlineRuns = 8u; Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor); const Text::Length numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -390,20 +361,16 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) struct DataOfCase { std::string title; - uint32_t startIndex; - uint32_t endIndex; - GlyphIndex startGlyphIndex; - GlyphIndex endGlyphIndex; + GlyphIndex glyphIndex; + Length numberOfGlyphs; UnderlineStyleProperties properties; }; DataOfCase data[] = { - + //ABC2 {"ABC2", - 0u, - 3u, 13u, - 16u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -417,11 +384,10 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) false, }}, + //ABC3 {"ABC3", - 4u, - 7u, 21u, - 24u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -435,11 +401,10 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) false, }}, + //ABC4 {"ABC4", - 8u, - 11u, 29u, - 32u, + 4u, { Text::Underline::DOUBLE, Color::BLACK, @@ -453,11 +418,10 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) false, }}, + //ABC5 {"ABC5", - 12u, - 15u, 37u, - 40u, + 4u, { Text::Underline::SOLID, Color::GREEN, @@ -471,11 +435,10 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) false, }}, + //ABC6 {"ABC6", - 16u, - 19u, 45u, - 48u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -489,11 +452,10 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) false, }}, + //ABC7 {"ABC7", - 20u, - 23u, 53u, - 56u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -507,11 +469,10 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) false, }}, + //ABC8 {"ABC8", - 24u, - 27u, 61u, - 64u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -525,11 +486,10 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) true, }}, + // {"ABC9", - 28u, - 31u, 69u, - 72u, + 4u, { Text::Underline::DASHED, Color::BLUE, @@ -545,14 +505,96 @@ int UtcDaliTextEditorMarkupSpanUnderline(void) }; - for(uint32_t i = 0; i < NUMBER_OF_CASES; i++) + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) { tet_infoline(data[i].title.c_str()); - DALI_TEST_EQUALS(underlineRuns[data[i].startIndex].glyphRun.glyphIndex, data[i].startGlyphIndex, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[data[i].endIndex].glyphRun.glyphIndex, data[i].endGlyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); + } + + END_TEST; +} + +int UtcDaliTextEditorMarkupNestedUnderlineTags(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextEditorMarkupNestedUnderlineTags "); + + TextEditor textEditor = TextEditor::New(); + + application.GetScene().Add(textEditor); + + std::string testText = "startABXYZCDEend"; + + textEditor.SetProperty(TextEditor::Property::TEXT, testText); + textEditor.SetProperty(TextEditor ::Property::ENABLE_MARKUP, true); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].startIndex].properties); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].endIndex].properties); + application.SendNotification(); + application.Render(); + + const uint32_t expectedNumberOfUnderlineRuns = 2u; + + Toolkit::Internal::TextEditor& textEditorImpl = GetImpl(textEditor); + const Text::Length numberOfUnderlineRuns = textEditorImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); + + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); + + Vector underlineRuns; + underlineRuns.Resize(numberOfUnderlineRuns); + textEditorImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns); + + struct DataOfCase + { + std::string title; + GlyphIndex glyphIndex; + Length numberOfGlyphs; + UnderlineStyleProperties properties; + }; + DataOfCase data[] = + { + //Outter + {"ABXYZCDE", + 5u, + 8u, + { + Text::Underline::SOLID, + Color::GREEN, + 5u, + 1u, + 2u, + false, + true, + true, + false, + false, + }}, + + //Inner + {"XYZ", + 7u, + 3u, + { + Text::Underline::SOLID, + Color::BLUE, + 5u, + 1u, + 2u, + false, + true, + true, + false, + false, + }}, + + }; + + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) + { + tet_infoline(data[i].title.c_str()); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); } END_TEST; diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp index 472b7e8..b73142a 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextField-internal.cpp @@ -169,12 +169,12 @@ int UtcDaliTextFieldMarkupUnderline(void) application.SendNotification(); application.Render(); - uint32_t expectedNumberOfUnderlinedGlyphs = 5u; + uint32_t expectedNumberOfUnderlineRuns = 2u; Toolkit::Internal::TextField& textFieldImpl = GetImpl(textField); const Text::Length numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -182,12 +182,11 @@ int UtcDaliTextFieldMarkupUnderline(void) //ABC are underlined DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.glyphIndex, 0u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 1u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[2u].glyphRun.glyphIndex, 2u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.numberOfGlyphs, 3u, TEST_LOCATION); //GH are underlined - DALI_TEST_EQUALS(underlineRuns[3u].glyphRun.glyphIndex, 5u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[4u].glyphRun.glyphIndex, 6u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 5u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.numberOfGlyphs, 2u, TEST_LOCATION); END_TEST; } @@ -220,13 +219,12 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) application.SendNotification(); application.Render(); - const uint32_t NUMBER_OF_CASES = 9u; - uint32_t expectedNumberOfUnderlinedGlyphs = 36u; + const uint32_t expectedNumberOfUnderlineRuns = 9u; Toolkit::Internal::TextField& textFieldImpl = GetImpl(textField); const Text::Length numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -235,20 +233,16 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) struct DataOfCase { std::string title; - uint32_t startIndex; - uint32_t endIndex; - GlyphIndex startGlyphIndex; - GlyphIndex endGlyphIndex; + GlyphIndex glyphIndex; + Length numberOfGlyphs; UnderlineStyleProperties properties; }; DataOfCase data[] = { //ABC1 {"ABC1", - 0u, - 3u, 5u, - 8u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -264,10 +258,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) //ABC2 {"ABC2", - 4u, - 7u, 13u, - 16u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -283,10 +275,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) //ABC3 {"ABC3", - 8u, - 11u, 21u, - 24u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -302,10 +292,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) //ABC4 {"ABC4", - 12u, - 15u, 29u, - 32u, + 4u, { Text::Underline::DOUBLE, Color::BLACK, @@ -321,10 +309,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) //ABC5 {"ABC5", - 16u, - 19u, 37u, - 40u, + 4u, { Text::Underline::SOLID, Color::GREEN, @@ -340,10 +326,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) //ABC6 {"ABC6", - 20u, - 23u, 45u, - 48u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -359,10 +343,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) //ABC7 {"ABC7", - 24u, - 27u, 53u, - 56u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -378,10 +360,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) //ABC8 {"ABC8", - 28u, - 31u, 61u, - 64u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -397,10 +377,8 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) // {"", - 32u, - 35u, 69u, - 72u, + 4u, { Text::Underline::DASHED, Color::BLUE, @@ -416,14 +394,12 @@ int UtcDaliTextFieldMarkupUnderlineAttributes(void) }; - for(uint32_t i = 0; i < NUMBER_OF_CASES; i++) + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) { tet_infoline(data[i].title.c_str()); - DALI_TEST_EQUALS(underlineRuns[data[i].startIndex].glyphRun.glyphIndex, data[i].startGlyphIndex, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[data[i].endIndex].glyphRun.glyphIndex, data[i].endGlyphIndex, TEST_LOCATION); - - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].startIndex].properties); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].endIndex].properties); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); } END_TEST; @@ -447,9 +423,7 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) "ABC6then" "ABC7then" "ABC8then" - "ABC9end" - - ; + "ABC9end"; textField.SetProperty(TextField::Property::TEXT, testText); textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true); @@ -457,13 +431,12 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) application.SendNotification(); application.Render(); - const uint32_t NUMBER_OF_CASES = 8u; - uint32_t expectedNumberOfUnderlinedGlyphs = 32u; + const uint32_t expectedNumberOfUnderlineRuns = 8u; Toolkit::Internal::TextField& textFieldImpl = GetImpl(textField); const Text::Length numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -472,20 +445,16 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) struct DataOfCase { std::string title; - uint32_t startIndex; - uint32_t endIndex; - GlyphIndex startGlyphIndex; - GlyphIndex endGlyphIndex; + GlyphIndex glyphIndex; + Length numberOfGlyphs; UnderlineStyleProperties properties; }; DataOfCase data[] = { - + //ABC2 {"ABC2", - 0u, - 3u, 13u, - 16u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -499,11 +468,10 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) false, }}, + //ABC3 {"ABC3", - 4u, - 7u, 21u, - 24u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -517,11 +485,10 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) false, }}, + //ABC4 {"ABC4", - 8u, - 11u, 29u, - 32u, + 4u, { Text::Underline::DOUBLE, Color::BLACK, @@ -535,11 +502,10 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) false, }}, + //ABC5 {"ABC5", - 12u, - 15u, 37u, - 40u, + 4u, { Text::Underline::SOLID, Color::GREEN, @@ -553,11 +519,10 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) false, }}, + //ABC6 {"ABC6", - 16u, - 19u, 45u, - 48u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -571,11 +536,10 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) false, }}, + //ABC7 {"ABC7", - 20u, - 23u, 53u, - 56u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -589,11 +553,10 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) false, }}, + //ABC8 {"ABC8", - 24u, - 27u, 61u, - 64u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -607,11 +570,10 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) true, }}, + // {"ABC9", - 28u, - 31u, 69u, - 72u, + 4u, { Text::Underline::DASHED, Color::BLUE, @@ -627,14 +589,96 @@ int UtcDaliTextFieldMarkupSpanUnderline(void) }; - for(uint32_t i = 0; i < NUMBER_OF_CASES; i++) + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) { tet_infoline(data[i].title.c_str()); - DALI_TEST_EQUALS(underlineRuns[data[i].startIndex].glyphRun.glyphIndex, data[i].startGlyphIndex, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[data[i].endIndex].glyphRun.glyphIndex, data[i].endGlyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); + } + + END_TEST; +} + +int UtcDaliTextFieldMarkupNestedUnderlineTags(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextFieldMarkupNestedUnderlineTags "); + + TextField textField = TextField::New(); + + application.GetScene().Add(textField); + + std::string testText = "startABXYZCDEend"; + + textField.SetProperty(TextField::Property::TEXT, testText); + textField.SetProperty(TextField ::Property::ENABLE_MARKUP, true); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].startIndex].properties); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].endIndex].properties); + application.SendNotification(); + application.Render(); + + const uint32_t expectedNumberOfUnderlineRuns = 2u; + + Toolkit::Internal::TextField& textFieldImpl = GetImpl(textField); + const Text::Length numberOfUnderlineRuns = textFieldImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); + + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); + + Vector underlineRuns; + underlineRuns.Resize(numberOfUnderlineRuns); + textFieldImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns); + + struct DataOfCase + { + std::string title; + GlyphIndex glyphIndex; + Length numberOfGlyphs; + UnderlineStyleProperties properties; + }; + DataOfCase data[] = + { + //Outter + {"ABXYZCDE", + 5u, + 8u, + { + Text::Underline::SOLID, + Color::GREEN, + 5u, + 1u, + 2u, + false, + true, + true, + false, + false, + }}, + + //Inner + {"XYZ", + 7u, + 3u, + { + Text::Underline::SOLID, + Color::BLUE, + 5u, + 1u, + 2u, + false, + true, + true, + false, + false, + }}, + + }; + + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) + { + tet_infoline(data[i].title.c_str()); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); } END_TEST; diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp index feed97c..dd460f2 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-TextLabel-internal.cpp @@ -46,12 +46,12 @@ int UtcDaliTextLabelMarkupUnderline(void) application.SendNotification(); application.Render(); - uint32_t expectedNumberOfUnderlinedGlyphs = 5u; + uint32_t expectedNumberOfUnderlineRuns = 2u; Toolkit::Internal::TextLabel& textLabelImpl = GetImpl(textLabel); const Text::Length numberOfUnderlineRuns = textLabelImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -59,12 +59,11 @@ int UtcDaliTextLabelMarkupUnderline(void) //ABC are underlined DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.glyphIndex, 0u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 1u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[2u].glyphRun.glyphIndex, 2u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[0u].glyphRun.numberOfGlyphs, 3u, TEST_LOCATION); //GH are underlined - DALI_TEST_EQUALS(underlineRuns[3u].glyphRun.glyphIndex, 5u, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[4u].glyphRun.glyphIndex, 6u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.glyphIndex, 5u, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[1u].glyphRun.numberOfGlyphs, 2u, TEST_LOCATION); END_TEST; } @@ -97,13 +96,12 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) application.SendNotification(); application.Render(); - const uint32_t NUMBER_OF_CASES = 9u; - uint32_t expectedNumberOfUnderlinedGlyphs = 36u; + const uint32_t expectedNumberOfUnderlineRuns = 9u; Toolkit::Internal::TextLabel& textLabelImpl = GetImpl(textLabel); const Text::Length numberOfUnderlineRuns = textLabelImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -112,20 +110,16 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) struct DataOfCase { std::string title; - uint32_t startIndex; - uint32_t endIndex; - GlyphIndex startGlyphIndex; - GlyphIndex endGlyphIndex; + GlyphIndex glyphIndex; + Length numberOfGlyphs; UnderlineStyleProperties properties; }; DataOfCase data[] = { //ABC1 {"ABC1", - 0u, - 3u, 5u, - 8u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -141,10 +135,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) //ABC2 {"ABC2", - 4u, - 7u, 13u, - 16u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -160,10 +152,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) //ABC3 {"ABC3", - 8u, - 11u, 21u, - 24u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -179,10 +169,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) //ABC4 {"ABC4", - 12u, - 15u, 29u, - 32u, + 4u, { Text::Underline::DOUBLE, Color::BLACK, @@ -198,10 +186,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) //ABC5 {"ABC5", - 16u, - 19u, 37u, - 40u, + 4u, { Text::Underline::SOLID, Color::GREEN, @@ -217,10 +203,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) //ABC6 {"ABC6", - 20u, - 23u, 45u, - 48u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -236,10 +220,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) //ABC7 {"ABC7", - 24u, - 27u, 53u, - 56u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -255,10 +237,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) //ABC8 {"ABC8", - 28u, - 31u, 61u, - 64u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -274,10 +254,8 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) // {"", - 32u, - 35u, 69u, - 72u, + 4u, { Text::Underline::DASHED, Color::BLUE, @@ -293,14 +271,12 @@ int UtcDaliTextLabelMarkupUnderlineAttributes(void) }; - for(uint32_t i = 0; i < NUMBER_OF_CASES; i++) + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) { tet_infoline(data[i].title.c_str()); - DALI_TEST_EQUALS(underlineRuns[data[i].startIndex].glyphRun.glyphIndex, data[i].startGlyphIndex, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[data[i].endIndex].glyphRun.glyphIndex, data[i].endGlyphIndex, TEST_LOCATION); - - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].startIndex].properties); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].endIndex].properties); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); } END_TEST; @@ -324,9 +300,7 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) "ABC6then" "ABC7then" "ABC8then" - "ABC9end" - - ; + "ABC9end"; textLabel.SetProperty(TextLabel::Property::TEXT, testText); textLabel.SetProperty(TextLabel ::Property::ENABLE_MARKUP, true); @@ -334,13 +308,12 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) application.SendNotification(); application.Render(); - const uint32_t NUMBER_OF_CASES = 8u; - uint32_t expectedNumberOfUnderlinedGlyphs = 32u; + const uint32_t expectedNumberOfUnderlineRuns = 8u; Toolkit::Internal::TextLabel& textLabelImpl = GetImpl(textLabel); const Text::Length numberOfUnderlineRuns = textLabelImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); - DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlinedGlyphs, TEST_LOCATION); + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); Vector underlineRuns; underlineRuns.Resize(numberOfUnderlineRuns); @@ -349,20 +322,16 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) struct DataOfCase { std::string title; - uint32_t startIndex; - uint32_t endIndex; - GlyphIndex startGlyphIndex; - GlyphIndex endGlyphIndex; + GlyphIndex glyphIndex; + Length numberOfGlyphs; UnderlineStyleProperties properties; }; DataOfCase data[] = { - + //ABC2 {"ABC2", - 0u, - 3u, 13u, - 16u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -376,11 +345,10 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) false, }}, + //ABC3 {"ABC3", - 4u, - 7u, 21u, - 24u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -394,11 +362,10 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) false, }}, + //ABC4 {"ABC4", - 8u, - 11u, 29u, - 32u, + 4u, { Text::Underline::DOUBLE, Color::BLACK, @@ -412,11 +379,10 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) false, }}, + //ABC5 {"ABC5", - 12u, - 15u, 37u, - 40u, + 4u, { Text::Underline::SOLID, Color::GREEN, @@ -430,11 +396,10 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) false, }}, + //ABC6 {"ABC6", - 16u, - 19u, 45u, - 48u, + 4u, { Text::Underline::SOLID, Color::BLACK, @@ -448,11 +413,10 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) false, }}, + //ABC7 {"ABC7", - 20u, - 23u, 53u, - 56u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -466,11 +430,10 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) false, }}, + //ABC8 {"ABC8", - 24u, - 27u, 61u, - 64u, + 4u, { Text::Underline::DASHED, Color::BLACK, @@ -484,11 +447,10 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) true, }}, + // {"ABC9", - 28u, - 31u, 69u, - 72u, + 4u, { Text::Underline::DASHED, Color::BLUE, @@ -504,14 +466,96 @@ int UtcDaliTextLabelMarkupSpanUnderline(void) }; - for(uint32_t i = 0; i < NUMBER_OF_CASES; i++) + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) { tet_infoline(data[i].title.c_str()); - DALI_TEST_EQUALS(underlineRuns[data[i].startIndex].glyphRun.glyphIndex, data[i].startGlyphIndex, TEST_LOCATION); - DALI_TEST_EQUALS(underlineRuns[data[i].endIndex].glyphRun.glyphIndex, data[i].endGlyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); + } + + END_TEST; +} + +int UtcDaliTextLabelMarkupNestedUnderlineTags(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextLabelMarkupNestedUnderlineTags "); + + TextLabel textLabel = TextLabel::New(); + + application.GetScene().Add(textLabel); + + std::string testText = "startABXYZCDEend"; + + textLabel.SetProperty(TextLabel::Property::TEXT, testText); + textLabel.SetProperty(TextLabel ::Property::ENABLE_MARKUP, true); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].startIndex].properties); - DALI_TEST_CHECK(data[i].properties == underlineRuns[data[i].endIndex].properties); + application.SendNotification(); + application.Render(); + + const uint32_t expectedNumberOfUnderlineRuns = 2u; + + Toolkit::Internal::TextLabel& textLabelImpl = GetImpl(textLabel); + const Text::Length numberOfUnderlineRuns = textLabelImpl.GetTextController()->GetTextModel()->GetNumberOfUnderlineRuns(); + + DALI_TEST_EQUALS(numberOfUnderlineRuns, expectedNumberOfUnderlineRuns, TEST_LOCATION); + + Vector underlineRuns; + underlineRuns.Resize(numberOfUnderlineRuns); + textLabelImpl.GetTextController()->GetTextModel()->GetUnderlineRuns(underlineRuns.Begin(), 0u, numberOfUnderlineRuns); + + struct DataOfCase + { + std::string title; + GlyphIndex glyphIndex; + Length numberOfGlyphs; + UnderlineStyleProperties properties; + }; + DataOfCase data[] = + { + //Outter + {"ABXYZCDE", + 5u, + 8u, + { + Text::Underline::SOLID, + Color::GREEN, + 5u, + 1u, + 2u, + false, + true, + true, + false, + false, + }}, + + //Inner + {"XYZ", + 7u, + 3u, + { + Text::Underline::SOLID, + Color::BLUE, + 5u, + 1u, + 2u, + false, + true, + true, + false, + false, + }}, + + }; + + for(uint32_t i = 0; i < expectedNumberOfUnderlineRuns; i++) + { + tet_infoline(data[i].title.c_str()); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.glyphIndex, data[i].glyphIndex, TEST_LOCATION); + DALI_TEST_EQUALS(underlineRuns[i].glyphRun.numberOfGlyphs, data[i].numberOfGlyphs, TEST_LOCATION); + DALI_TEST_CHECK(data[i].properties == underlineRuns[i].properties); } END_TEST; diff --git a/dali-toolkit/internal/text/markup-processor-underline.cpp b/dali-toolkit/internal/text/markup-processor-underline.cpp index 063f3fe..8f19b5a 100644 --- a/dali-toolkit/internal/text/markup-processor-underline.cpp +++ b/dali-toolkit/internal/text/markup-processor-underline.cpp @@ -108,6 +108,44 @@ void ProcessUnderlineTag(const Tag& tag, UnderlinedCharacterRun& underlinedChara } } +void OverrideNestedUnderlinedCharacterRuns(Vector& underlinedCharacterRuns) +{ + // Handle nested tags + // The inner tag inherit the attributes of the outer tag and override them when defined in the inner tag. + // Example: + // outer tag before inner tag outer tag after + // "outer tag before" and "outer tag after" have height = 5.0f and color = 'blue' + // "inner tag" has height = 5.0f and color = 'green' + + if(underlinedCharacterRuns.Count() > 0u) + { + Vector::ConstIterator preIt = underlinedCharacterRuns.Begin(); + + Vector::Iterator it = underlinedCharacterRuns.Begin() + 1; + Vector::ConstIterator endIt = underlinedCharacterRuns.End(); + + while(it != endIt) + { + const UnderlinedCharacterRun& run = *it; + const CharacterIndex& characterIndex = run.characterRun.characterIndex; + const Length& numberOfCharacters = run.characterRun.numberOfCharacters; + + const UnderlinedCharacterRun& preRun = *preIt; + const CharacterIndex& preCharacterIndex = preRun.characterRun.characterIndex; + const Length& preNumberOfCharacters = preRun.characterRun.numberOfCharacters; + + if((preCharacterIndex <= characterIndex) && + ((characterIndex + numberOfCharacters) <= (preCharacterIndex + preNumberOfCharacters))) + { + it->properties.CopyIfNotDefined(preIt->properties); + } + + it++; + preIt++; + } + } +} + } // namespace Text } // namespace Toolkit diff --git a/dali-toolkit/internal/text/markup-processor-underline.h b/dali-toolkit/internal/text/markup-processor-underline.h index f210718..cde347c 100644 --- a/dali-toolkit/internal/text/markup-processor-underline.h +++ b/dali-toolkit/internal/text/markup-processor-underline.h @@ -18,6 +18,12 @@ * */ +// EXTERNAL INCLUDES +#include + +// INTERNAL INCLUDES +#include + namespace Dali { namespace Toolkit @@ -26,7 +32,6 @@ namespace Text { struct Tag; struct Attribute; -struct UnderlinedCharacterRun; /** * @brief Fill the underlined character run with the type attribute value. @@ -76,6 +81,13 @@ void ProcessColorAttribute(const Attribute& attribute, UnderlinedCharacterRun& u */ void ProcessUnderlineTag(const Tag& tag, UnderlinedCharacterRun& underlinedCharacterRun); +/** + * @brief Override the run's attributes which contained in the previous run. This is to handle the nested tags. + * + * @param[in,out] underlinedCharacterRuns The list of underlined character run + */ +void OverrideNestedUnderlinedCharacterRuns(Vector& underlinedCharacterRuns); + } // namespace Text } // namespace Toolkit diff --git a/dali-toolkit/internal/text/markup-processor.cpp b/dali-toolkit/internal/text/markup-processor.cpp index b09b290..197dff1 100644 --- a/dali-toolkit/internal/text/markup-processor.cpp +++ b/dali-toolkit/internal/text/markup-processor.cpp @@ -1094,6 +1094,9 @@ void ProcessMarkupString(const std::string& markupString, MarkupProcessData& mar // Resize the model's vectors. ResizeModelVectors(markupProcessData, fontRunIndex, colorRunIndex, underlinedCharacterRunIndex, backgroundRunIndex, boundedParagraphRunIndex); + + // Handle the nested tags + OverrideNestedUnderlinedCharacterRuns(markupProcessData.underlinedCharacterRuns); } } // namespace Text diff --git a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp index 9eb2fd6..291c187 100644 --- a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp @@ -564,8 +564,8 @@ struct AtlasRenderer::Impl Vector::ConstIterator currentUnderlinedGlyphRunIt = underlineRuns.End(); const bool isGlyphUnderlined = underlineEnabled || IsGlyphUnderlined(i, underlineRuns, currentUnderlinedGlyphRunIt); - const UnderlineStyleProperties currentUnderlineProperties = GetCurrentUnderlineProperties(isGlyphUnderlined, underlineRuns, currentUnderlinedGlyphRunIt, viewUnderlineProperties); - float currentUnderlineHeight = GetCurrentUnderlineHeight(underlineRuns, currentUnderlinedGlyphRunIt, viewUnderlineProperties.height); + const UnderlineStyleProperties currentUnderlineProperties = GetCurrentUnderlineProperties(i, isGlyphUnderlined, underlineRuns, currentUnderlinedGlyphRunIt, viewUnderlineProperties); + float currentUnderlineHeight = currentUnderlineProperties.height; thereAreUnderlinedGlyphs = thereAreUnderlinedGlyphs || isGlyphUnderlined; currentStrikethroughColor = strikethroughColor; @@ -655,10 +655,10 @@ struct AtlasRenderer::Impl //The new underlined chunk. Add new id if they are not consecutive indices (this is for Markup case) // Examples: "Hello World Hello World", "World Hello World", " World Hello World" - if(isPreUnderlined && (!isGlyphUnderlined || (preUnderlineProperties != currentUnderlineProperties))) + if((!isPreUnderlined && isGlyphUnderlined) || (isGlyphUnderlined && (preUnderlineProperties != currentUnderlineProperties))) { - mapUnderlineChunkIdWithProperties.insert(std::pair(underlineChunkId, preUnderlineProperties)); underlineChunkId++; + mapUnderlineChunkIdWithProperties.insert(std::pair(underlineChunkId, currentUnderlineProperties)); } //Keep status of underlined for previous glyph to check consecutive indices diff --git a/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.cpp b/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.cpp index 6720b91..873ef86 100644 --- a/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.cpp +++ b/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.cpp @@ -45,27 +45,34 @@ bool IsGlyphUnderlined(GlyphIndex index, return false; } -float GetCurrentUnderlineHeight(const Vector& underlineRuns, - Vector::ConstIterator currentUnderlinedGlyphRunIt, - const float underlineHeight) +UnderlineStyleProperties GetCurrentUnderlineProperties(GlyphIndex index, + const bool& isGlyphUnderlined, + const Vector& underlineRuns, + Vector::ConstIterator& currentUnderlinedGlyphRunIt, + const UnderlineStyleProperties& commonUnderlineProperties) { - if(currentUnderlinedGlyphRunIt == underlineRuns.End()) + UnderlineStyleProperties currentUnderlineStyleProperties = commonUnderlineProperties; + + if(isGlyphUnderlined && (currentUnderlinedGlyphRunIt != underlineRuns.End())) { - return underlineHeight; - } + // Retrieve the latest run to handle the nested case. + for(Vector::ConstIterator it = currentUnderlinedGlyphRunIt + 1, + endIt = underlineRuns.End(); + it != endIt; + ++it) + { + const UnderlinedGlyphRun& run = *it; - const UnderlinedGlyphRun& underlinedGlyphRun = *currentUnderlinedGlyphRunIt; - return (underlinedGlyphRun.properties.heightDefined ? underlinedGlyphRun.properties.height : underlineHeight); -} + if((run.glyphRun.glyphIndex <= index) && (index < (run.glyphRun.glyphIndex + run.glyphRun.numberOfGlyphs))) + { + currentUnderlinedGlyphRunIt = it; + } + } -UnderlineStyleProperties GetCurrentUnderlineProperties(const bool& isGlyphUnderlined, - const Vector& underlineRuns, - Vector::ConstIterator currentUnderlinedGlyphRunIt, - const UnderlineStyleProperties& commonUnderlineProperties) -{ - return (isGlyphUnderlined && (currentUnderlinedGlyphRunIt != underlineRuns.End())) - ? currentUnderlinedGlyphRunIt->properties - : commonUnderlineProperties; + currentUnderlineStyleProperties.OverrideByDefinedProperties(currentUnderlinedGlyphRunIt->properties); + } + + return currentUnderlineStyleProperties; } float FetchUnderlinePositionFromFontMetrics(const FontMetrics& fontMetrics) diff --git a/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.h b/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.h index 825b05c..38471c8 100644 --- a/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.h +++ b/dali-toolkit/internal/text/rendering/styles/underline-helper-functions.h @@ -46,21 +46,9 @@ bool IsGlyphUnderlined(GlyphIndex index, Vector::ConstIterator& currentUnderlinedGlyphRunIt); /** - * @brief Check the current underlined glyph run iterator if not empty and its height is defined then return ts height. Otherwise return the common underline height. - * - * @param[in] underlineRuns the underline runs. - * @param[in] currentUnderlinedGlyphRunIt the iterator of current underlined glyph run. - * @param[in] underlineHeight the common underline height. - * - * @return the determined underline height - */ -float GetCurrentUnderlineHeight(const Vector& underlineRuns, - Vector::ConstIterator currentUnderlinedGlyphRunIt, - const float underlineHeight); - -/** * @brief Check the current underlined glyph run iterator if not empty and isGlyphUnderlined is true then return its UnderlineProperties. Otherwise return the common underline properties. * + * @param[in] index the index of glyph. * @param[in] isGlyphUnderlined whether the glyph is underlined. * @param[in] underlineRuns the underline runs. * @param[in] currentUnderlinedGlyphRunIt the iterator of current underlined glyph run. @@ -68,10 +56,11 @@ float GetCurrentUnderlineHeight(const Vector& underl * * @return the determined underline properties */ -UnderlineStyleProperties GetCurrentUnderlineProperties(const bool& isGlyphUnderlined, - const Vector& underlineRuns, - Vector::ConstIterator currentUnderlinedGlyphRunIt, - const UnderlineStyleProperties& commonUnderlineProperties); +UnderlineStyleProperties GetCurrentUnderlineProperties(GlyphIndex index, + const bool& isGlyphUnderlined, + const Vector& underlineRuns, + Vector::ConstIterator& currentUnderlinedGlyphRunIt, + const UnderlineStyleProperties& commonUnderlineProperties); /** * @brief Fetch and calculate underline Position using font-metrics diff --git a/dali-toolkit/internal/text/rendering/text-typesetter.cpp b/dali-toolkit/internal/text/rendering/text-typesetter.cpp index 790e247..4dc9775 100644 --- a/dali-toolkit/internal/text/rendering/text-typesetter.cpp +++ b/dali-toolkit/internal/text/rendering/text-typesetter.cpp @@ -1004,8 +1004,8 @@ Devel::PixelBuffer Typesetter::CreateImageBuffer(const unsigned int bufferWidth, Vector::ConstIterator currentUnderlinedGlyphRunIt = underlineRuns.End(); const bool underlineGlyph = underlineEnabled || IsGlyphUnderlined(glyphIndex, underlineRuns, currentUnderlinedGlyphRunIt); - currentUnderlineProperties = GetCurrentUnderlineProperties(underlineGlyph, underlineRuns, currentUnderlinedGlyphRunIt, modelUnderlineProperties); - currentUnderlineHeight = GetCurrentUnderlineHeight(underlineRuns, currentUnderlinedGlyphRunIt, modelUnderlineProperties.height); + currentUnderlineProperties = GetCurrentUnderlineProperties(glyphIndex, underlineGlyph, underlineRuns, currentUnderlinedGlyphRunIt, modelUnderlineProperties); + currentUnderlineHeight = currentUnderlineProperties.height; thereAreUnderlinedGlyphs = thereAreUnderlinedGlyphs || underlineGlyph; currentStrikethroughColor = strikethroughColor; @@ -1256,24 +1256,15 @@ Devel::PixelBuffer Typesetter::ApplyUnderlineMarkupImageBuffer(Devel::PixelBuffe //The outer loop to iterate on the separated chunks of underlined glyph runs while(itGlyphRun != endItGlyphRun) { - const UnderlineStyleProperties& firstUnderlineStyleProperties = itGlyphRun->properties; - startGlyphIndex = itGlyphRun->glyphRun.glyphIndex; - endGlyphIndex = startGlyphIndex; - //The inner loop to make a connected underline for the consecutive characters - do - { - endGlyphIndex += itGlyphRun->glyphRun.numberOfGlyphs; - itGlyphRun++; - } while(itGlyphRun != endItGlyphRun && itGlyphRun->glyphRun.glyphIndex == endGlyphIndex && - (firstUnderlineStyleProperties == itGlyphRun->properties)); - - endGlyphIndex--; + endGlyphIndex = startGlyphIndex + itGlyphRun->glyphRun.numberOfGlyphs - 1; // Create the image buffer for underline Devel::PixelBuffer underlineImageBuffer = CreateImageBuffer(bufferWidth, bufferHeight, Typesetter::STYLE_UNDERLINE, ignoreHorizontalAlignment, pixelFormat, horizontalOffset, verticalOffset, startGlyphIndex, endGlyphIndex); // Combine the two buffers - topPixelBuffer = CombineImageBuffer(topPixelBuffer, underlineImageBuffer, bufferWidth, bufferHeight); + topPixelBuffer = CombineImageBuffer(underlineImageBuffer, topPixelBuffer, bufferWidth, bufferHeight); + + itGlyphRun++; } return topPixelBuffer; diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 3850f12..cf49df5 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -1636,26 +1636,26 @@ void Controller::Impl::CopyUnderlinedFromLogicalToVisualModels(bool shouldClearP { CharacterIndex characterIndex = it->characterRun.characterIndex; Length numberOfCharacters = it->characterRun.numberOfCharacters; - for(Length index = 0u; index < numberOfCharacters; index++) + + if(numberOfCharacters == 0) { - UnderlinedGlyphRun underlineGlyphRun; - underlineGlyphRun.glyphRun.glyphIndex = charactersToGlyph[characterIndex + index]; - underlineGlyphRun.glyphRun.numberOfGlyphs = glyphsPerCharacter[characterIndex + index]; - - //Copy properties (attributes) - underlineGlyphRun.properties.type = it->properties.type; - underlineGlyphRun.properties.color = it->properties.color; - underlineGlyphRun.properties.height = it->properties.height; - underlineGlyphRun.properties.dashGap = it->properties.dashGap; - underlineGlyphRun.properties.dashWidth = it->properties.dashWidth; - underlineGlyphRun.properties.typeDefined = it->properties.typeDefined; - underlineGlyphRun.properties.colorDefined = it->properties.colorDefined; - underlineGlyphRun.properties.heightDefined = it->properties.heightDefined; - underlineGlyphRun.properties.dashGapDefined = it->properties.dashGapDefined; - underlineGlyphRun.properties.dashWidthDefined = it->properties.dashWidthDefined; - - mModel->mVisualModel->mUnderlineRuns.PushBack(underlineGlyphRun); + continue; } + + // Create one run for all glyphs of all run's characters that has same properties + // This enhance performance and reduce the needed memory to store glyphs-runs + UnderlinedGlyphRun underlineGlyphRun; + underlineGlyphRun.glyphRun.glyphIndex = charactersToGlyph[characterIndex]; + underlineGlyphRun.glyphRun.numberOfGlyphs = glyphsPerCharacter[characterIndex]; + //Copy properties (attributes) + underlineGlyphRun.properties = it->properties; + + for(Length index = 1u; index < numberOfCharacters; index++) + { + underlineGlyphRun.glyphRun.numberOfGlyphs += glyphsPerCharacter[characterIndex + index]; + } + + mModel->mVisualModel->mUnderlineRuns.PushBack(underlineGlyphRun); } } diff --git a/dali-toolkit/internal/text/underline-style-properties.h b/dali-toolkit/internal/text/underline-style-properties.h index 5d89f4b..d75f22b 100644 --- a/dali-toolkit/internal/text/underline-style-properties.h +++ b/dali-toolkit/internal/text/underline-style-properties.h @@ -100,6 +100,80 @@ struct UnderlineStyleProperties return ((!heightDefined && !other.heightDefined) || ((heightDefined && other.heightDefined) && (height == other.height))); } + UnderlineStyleProperties& CopyIfNotDefined(const UnderlineStyleProperties& other) + { + //Copy only the defined properties in other and not defined in this from other to this + if(!typeDefined && other.typeDefined) + { + type = other.type; + typeDefined = true; + } + + if(!heightDefined && other.heightDefined) + { + height = other.height; + heightDefined = true; + } + + if(!colorDefined && other.colorDefined) + { + color = other.color; + colorDefined = true; + } + + if(!dashGapDefined && other.dashGapDefined) + { + dashGap = other.dashGap; + dashGapDefined = true; + } + + if(!dashWidthDefined && other.dashWidthDefined) + { + dashWidth = other.dashWidth; + dashWidthDefined = true; + } + + // to chain this method + return *this; + } + + UnderlineStyleProperties& OverrideByDefinedProperties(const UnderlineStyleProperties& other) + { + //Copy only the defined properties in other from other to this + if(other.typeDefined) + { + type = other.type; + typeDefined = true; + } + + if(other.heightDefined) + { + height = other.height; + heightDefined = true; + } + + if(other.colorDefined) + { + color = other.color; + colorDefined = true; + } + + if(other.dashGapDefined) + { + dashGap = other.dashGap; + dashGapDefined = true; + } + + if(other.dashWidthDefined) + { + dashWidth = other.dashWidth; + dashWidthDefined = true; + } + + // to chain this method + return *this; + } + //Attributes Text::Underline::Type type; ///< The type of underline. Vector4 color; ///< The color of underline.