From e9020e9455c149db6643a0567c5be360f608e81c Mon Sep 17 00:00:00 2001 From: Bowon Ryu Date: Thu, 2 May 2024 19:56:14 +0900 Subject: [PATCH] [Tizen] Add blur radius to text outline it uses the same Gaussian blur as the text shadow. Change-Id: I3b7d7534c68cfae5de55747158b4f74ffcaa2e88 Signed-off-by: Bowon Ryu --- .../src/dali-toolkit/utc-Dali-TextEditor.cpp | 1 + .../src/dali-toolkit/utc-Dali-TextField.cpp | 1 + .../src/dali-toolkit/utc-Dali-TextLabel.cpp | 5 ++- .../src/dali-toolkit/utc-Dali-Visual.cpp | 2 +- .../text-controls/text-style-properties-devel.h | 9 ++++- .../internal/text/controller/text-controller.cpp | 14 ++++++++ .../internal/text/controller/text-controller.h | 14 ++++++++ .../internal/text/rendering/text-typesetter.cpp | 7 ++++ .../internal/text/rendering/view-model.cpp | 5 +++ dali-toolkit/internal/text/rendering/view-model.h | 5 +++ dali-toolkit/internal/text/text-effects-style.cpp | 40 ++++++++++++++++++---- dali-toolkit/internal/text/text-model-interface.h | 7 ++++ dali-toolkit/internal/text/text-model.cpp | 5 +++ dali-toolkit/internal/text/text-model.h | 5 +++ dali-toolkit/internal/text/visual-model-impl.cpp | 11 ++++++ dali-toolkit/internal/text/visual-model-impl.h | 15 ++++++++ 16 files changed, 137 insertions(+), 9 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index c8db163..14a4c41 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -1038,6 +1038,7 @@ int UtcDaliTextEditorSetPropertyP(void) outlineMapSet["color"] = Color::RED; outlineMapSet["width"] = 2.0f; outlineMapSet["offset"] = Vector2(0.0f, 0.0f); + outlineMapSet["blurRadius"] = 0.0f; editor.SetProperty(TextEditor::Property::OUTLINE, outlineMapSet); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index 01cd89e..cae5939 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -1104,6 +1104,7 @@ int UtcDaliTextFieldSetPropertyP(void) outlineMapSet["color"] = Color::RED; outlineMapSet["width"] = 2.0f; outlineMapSet["offset"] = Vector2(0.0f, 0.0f); + outlineMapSet["blurRadius"] = 0.0f; field.SetProperty(TextField::Property::OUTLINE, outlineMapSet); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp index 1a4ce70..9ff7e75 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp @@ -948,6 +948,7 @@ int UtcDaliToolkitTextLabelSetPropertyP(void) outlineMapSet["color"] = Color::RED; outlineMapSet["width"] = 2.0f; outlineMapSet["offset"] = Vector2(2.0f, 2.0f); + outlineMapSet["blurRadius"] = 3.0f; label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet); outlineMapGet = label.GetProperty(TextLabel::Property::OUTLINE); @@ -958,12 +959,13 @@ int UtcDaliToolkitTextLabelSetPropertyP(void) outlineMapSet[Toolkit::DevelText::Outline::Property::COLOR] = Color::BLUE; outlineMapSet[Toolkit::DevelText::Outline::Property::WIDTH] = 3.0f; outlineMapSet[Toolkit::DevelText::Outline::Property::OFFSET] = Vector2(3.0f, 3.0f); + outlineMapSet[Toolkit::DevelText::Outline::Property::BLUR_RADIUS] = 4.0f; label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet); outlineMapGet = label.GetProperty(TextLabel::Property::OUTLINE); DALI_TEST_EQUALS(outlineMapGet.Count(), outlineMapSet.Count(), TEST_LOCATION); - std::vector outlineIndicesConversionTable = {"color", "width", "offset"}; + std::vector outlineIndicesConversionTable = {"color", "width", "offset", "blurRadius"}; DALI_TEST_EQUALS(DaliTestCheckMaps(outlineMapGet, outlineMapSet, outlineIndicesConversionTable), true, TEST_LOCATION); // Check the background property @@ -1804,6 +1806,7 @@ int UtcDaliToolkitTextlabelTextStyle01(void) outlineMapSet["color"] = Color::BLUE; outlineMapSet["width"] = 2.0f; outlineMapSet["offset"] = "2 2"; + outlineMapSet["blurRadius"] = "3"; label.SetProperty(TextLabel::Property::OUTLINE, outlineMapSet); application.SendNotification(); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp index bb955c3..70e46e2 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp @@ -1290,7 +1290,7 @@ int UtcDaliVisualGetPropertyMap10(void) propertyMap.Insert("underline", underlineMapSet.Add("enable", true).Add("color", Color::GREEN).Add("height", 1).Add("type", Text::Underline::Type::SOLID).Add("dashWidth", 2).Add("dashGap", 1)); Property::Map outlineMapSet; - propertyMap.Insert("outline", outlineMapSet.Add("color", Color::YELLOW).Add("width", 1).Add("offset", Vector2(2.0f, 2.0f))); + propertyMap.Insert("outline", outlineMapSet.Add("color", Color::YELLOW).Add("width", 1).Add("offset", Vector2(2.0f, 2.0f)).Add("blurRadius", 3.0f)); Property::Map backgroundMapSet; propertyMap.Insert("textBackground", backgroundMapSet.Add("enable", true).Add("color", Color::CYAN)); diff --git a/dali-toolkit/devel-api/controls/text-controls/text-style-properties-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-style-properties-devel.h index 2e2ed08..687897b 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-style-properties-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-style-properties-devel.h @@ -144,7 +144,14 @@ enum * @details Name "offset", type Property::STRING or Property::VECTOR2. i.e "3.0 3.0" or Vector2( 3.f, 3.f ) * @note Optional. If not provided then the outline is not enabled. */ - OFFSET + OFFSET, + + /** + * @brief The radius of the Gaussian blur for the outline. + * @details Name "blurRadius", type Property::STRING or Property::FLOAT. i.e "5.0" or 5.f + * @note Optional. If not provided then the outline is not enabled. + */ + BLUR_RADIUS }; } // namespace Property diff --git a/dali-toolkit/internal/text/controller/text-controller.cpp b/dali-toolkit/internal/text/controller/text-controller.cpp index 3e4c764..33fcaff 100644 --- a/dali-toolkit/internal/text/controller/text-controller.cpp +++ b/dali-toolkit/internal/text/controller/text-controller.cpp @@ -1007,6 +1007,20 @@ uint16_t Controller::GetOutlineWidth() const return mImpl->mModel->mVisualModel->GetOutlineWidth(); } +void Controller::SetOutlineBlurRadius(const float& outlineBlurRadius) +{ + if(fabsf(GetOutlineBlurRadius() - outlineBlurRadius) > Math::MACHINE_EPSILON_1) + { + mImpl->mModel->mVisualModel->SetOutlineBlurRadius(outlineBlurRadius); + mImpl->RequestRelayout(); + } +} + +const float& Controller::GetOutlineBlurRadius() const +{ + return mImpl->mModel->mVisualModel->GetOutlineBlurRadius(); +} + void Controller::SetBackgroundColor(const Vector4& color) { mImpl->mModel->mVisualModel->SetBackgroundColor(color); diff --git a/dali-toolkit/internal/text/controller/text-controller.h b/dali-toolkit/internal/text/controller/text-controller.h index c6b80f0..2343ad3 100644 --- a/dali-toolkit/internal/text/controller/text-controller.h +++ b/dali-toolkit/internal/text/controller/text-controller.h @@ -1316,6 +1316,20 @@ public: // Default style & Input style uint16_t GetOutlineWidth() const; /** + * @brief Set the outline blur radius. + * + * @param[in] outlineBlurRadius The outline blur radius, 0,0 indicates no blur. + */ + void SetOutlineBlurRadius(const float& outlineBlurRadius); + + /** + * @brief Retrieve the outline blur radius. + * + * @return The outline blur radius. + */ + const float& GetOutlineBlurRadius() const; + + /** * @brief Set the background color. * * @param[in] color color of background. diff --git a/dali-toolkit/internal/text/rendering/text-typesetter.cpp b/dali-toolkit/internal/text/rendering/text-typesetter.cpp index f83e7e2..7d095b4 100644 --- a/dali-toolkit/internal/text/rendering/text-typesetter.cpp +++ b/dali-toolkit/internal/text/rendering/text-typesetter.cpp @@ -996,6 +996,13 @@ PixelData Typesetter::Render(const Vector2& size, Toolkit::DevelText::TextDirect // Create the image buffer for outline Devel::PixelBuffer outlineImageBuffer = CreateImageBuffer(bufferWidth, bufferHeight, Typesetter::STYLE_OUTLINE, ignoreHorizontalAlignment, pixelFormat, penX, penY, startIndexOfGlyphs, endIndexOfGlyphs); + const float& blurRadius = mModel->GetOutlineBlurRadius(); + + if(blurRadius > Math::MACHINE_EPSILON_1) + { + outlineImageBuffer.ApplyGaussianBlur(blurRadius); + } + // Combine the two buffers CombineImageBuffer(imageBuffer, outlineImageBuffer, bufferWidth, bufferHeight, true); } diff --git a/dali-toolkit/internal/text/rendering/view-model.cpp b/dali-toolkit/internal/text/rendering/view-model.cpp index 28b4802..3404be2 100644 --- a/dali-toolkit/internal/text/rendering/view-model.cpp +++ b/dali-toolkit/internal/text/rendering/view-model.cpp @@ -300,6 +300,11 @@ uint16_t ViewModel::GetOutlineWidth() const return mModel->GetOutlineWidth(); } +const float& ViewModel::GetOutlineBlurRadius() const +{ + return mModel->GetOutlineBlurRadius(); +} + const Vector4& ViewModel::GetBackgroundColor() const { return mModel->GetBackgroundColor(); diff --git a/dali-toolkit/internal/text/rendering/view-model.h b/dali-toolkit/internal/text/rendering/view-model.h index e85dbbc..9adcb65 100644 --- a/dali-toolkit/internal/text/rendering/view-model.h +++ b/dali-toolkit/internal/text/rendering/view-model.h @@ -262,6 +262,11 @@ public: uint16_t GetOutlineWidth() const override; /** + * @copydoc ModelInterface::GetOutlineBlurRadius() + */ + const float& GetOutlineBlurRadius() const override; + + /** * @copydoc ModelInterface::GetBackgroundColor() */ const Vector4& GetBackgroundColor() const override; diff --git a/dali-toolkit/internal/text/text-effects-style.cpp b/dali-toolkit/internal/text/text-effects-style.cpp index 60f45d2..be4cbfa 100644 --- a/dali-toolkit/internal/text/text-effects-style.cpp +++ b/dali-toolkit/internal/text/text-effects-style.cpp @@ -231,7 +231,9 @@ bool ParseOutlineProperties(const Property::Map& underlinePropertiesMap, bool& widthDefined, uint16_t& width, bool& offsetDefined, - Vector2& offset) + Vector2& offset, + bool& blurRadiusDefined, + float& blurRadius) { const unsigned int numberOfItems = underlinePropertiesMap.Count(); @@ -267,6 +269,21 @@ bool ParseOutlineProperties(const Property::Map& underlinePropertiesMap, offset = valueGet.second.Get(); } } + else if((DevelText::Outline::Property::BLUR_RADIUS == valueGet.first.indexKey) || (BLUR_RADIUS_KEY == valueGet.first.stringKey)) + { + /// Blur radius key. + blurRadiusDefined = true; + + if(valueGet.second.GetType() == Dali::Property::STRING) + { + const std::string blurRadiusStr = valueGet.second.Get(); + blurRadius = StringToFloat(blurRadiusStr.c_str()); + } + else + { + blurRadius = valueGet.second.Get(); + } + } } return 0u == numberOfItems; @@ -775,6 +792,8 @@ bool SetOutlineProperties(ControllerPtr controller, const Property::Value& value uint16_t width = 0u; bool offsetDefined = false; Vector2 offset; + bool blurRadiusDefined = false; + float blurRadius; bool empty = true; @@ -797,7 +816,9 @@ bool SetOutlineProperties(ControllerPtr controller, const Property::Value& value widthDefined, width, offsetDefined, - offset); + offset, + blurRadiusDefined, + blurRadius); controller->OutlineSetByString(false); } @@ -822,6 +843,12 @@ bool SetOutlineProperties(ControllerPtr controller, const Property::Value& value controller->SetOutlineOffset(offset); update = true; } + + if(blurRadiusDefined && (!Dali::Equals(controller->GetOutlineBlurRadius(), blurRadius))) + { + controller->SetOutlineBlurRadius(blurRadius); + update = true; + } } else { @@ -862,15 +889,16 @@ void GetOutlineProperties(ControllerPtr controller, Property::Value& value, Effe } else { - const Vector4& color = controller->GetOutlineColor(); - const uint16_t width = controller->GetOutlineWidth(); - const Vector2& offset = controller->GetOutlineOffset(); - + const Vector4& color = controller->GetOutlineColor(); + const uint16_t width = controller->GetOutlineWidth(); + const Vector2& offset = controller->GetOutlineOffset(); + const float& blurRadius = controller->GetOutlineBlurRadius(); Property::Map map; map.Insert(COLOR_KEY, color); map.Insert(WIDTH_KEY, static_cast(width)); map.Insert(OFFSET_KEY, offset); + map.Insert(BLUR_RADIUS_KEY, blurRadius); value = map; diff --git a/dali-toolkit/internal/text/text-model-interface.h b/dali-toolkit/internal/text/text-model-interface.h index 8327534..212ec0d 100644 --- a/dali-toolkit/internal/text/text-model-interface.h +++ b/dali-toolkit/internal/text/text-model-interface.h @@ -343,6 +343,13 @@ public: virtual uint16_t GetOutlineWidth() const = 0; /** + * @brief Retrieve the outline blur radius. + * + * @return The outline blur radius. + */ + virtual const float& GetOutlineBlurRadius() const = 0; + + /** * @brief Retrieves the background color. * * @return The background color. diff --git a/dali-toolkit/internal/text/text-model.cpp b/dali-toolkit/internal/text/text-model.cpp index 008a4fc..c9f553d 100644 --- a/dali-toolkit/internal/text/text-model.cpp +++ b/dali-toolkit/internal/text/text-model.cpp @@ -242,6 +242,11 @@ uint16_t Model::GetOutlineWidth() const return mVisualModel->GetOutlineWidth(); } +const float& Model::GetOutlineBlurRadius() const +{ + return mVisualModel->mOutlineBlurRadius; +} + const Vector4& Model::GetBackgroundColor() const { return mVisualModel->GetBackgroundColor(); diff --git a/dali-toolkit/internal/text/text-model.h b/dali-toolkit/internal/text/text-model.h index 06b788f..c95b2be 100644 --- a/dali-toolkit/internal/text/text-model.h +++ b/dali-toolkit/internal/text/text-model.h @@ -260,6 +260,11 @@ public: uint16_t GetOutlineWidth() const override; /** + * @copydoc ModelInterface::GetOutlineBlurRadius() + */ + const float& GetOutlineBlurRadius() const override; + + /** * @copydoc ModelInterface::GetBackgroundColor() */ const Vector4& GetBackgroundColor() const override; diff --git a/dali-toolkit/internal/text/visual-model-impl.cpp b/dali-toolkit/internal/text/visual-model-impl.cpp index 1d10383..fd6b683 100644 --- a/dali-toolkit/internal/text/visual-model-impl.cpp +++ b/dali-toolkit/internal/text/visual-model-impl.cpp @@ -391,6 +391,11 @@ void VisualModel::SetOutlineColor(const Vector4& color) mOutlineColor = color; } +void VisualModel::SetOutlineBlurRadius(const float& outlineBlurRadius) +{ + mOutlineBlurRadius = outlineBlurRadius; +} + void VisualModel::SetUnderlineEnabled(bool enabled) { mUnderlineEnabled = enabled; @@ -521,6 +526,11 @@ const Vector4& VisualModel::GetOutlineColor() const return mOutlineColor; } +const float& VisualModel::GetOutlineBlurRadius() const +{ + return mOutlineBlurRadius; +} + bool VisualModel::IsUnderlineEnabled() const { return mUnderlineEnabled; @@ -682,6 +692,7 @@ VisualModel::VisualModel() mDashedUnderlineWidth(2.0f), mDashedUnderlineGap(1.0f), mShadowBlurRadius(0.0f), + mOutlineBlurRadius(0.0f), mOutlineWidth(0u), mNaturalSize(), mLayoutSize(), diff --git a/dali-toolkit/internal/text/visual-model-impl.h b/dali-toolkit/internal/text/visual-model-impl.h index b67172a..edebaf6 100644 --- a/dali-toolkit/internal/text/visual-model-impl.h +++ b/dali-toolkit/internal/text/visual-model-impl.h @@ -426,6 +426,20 @@ public: uint16_t GetOutlineWidth() const; /** + * @brief Set the outline blur radius. + * + * @param[in] outlineBlurRadius The outline blur radius, 0,0 indicates no blur. + */ + void SetOutlineBlurRadius(const float& outlineBlurRadius); + + /** + * @brief Retrieve the outline blur radius. + * + * @return The outline blur radius. + */ + const float& GetOutlineBlurRadius() const; + + /** * @brief Sets the text's background color. * * @param[in] color The text's background color. @@ -694,6 +708,7 @@ public: float mDashedUnderlineWidth; ///< The width of the dashes of the dashed underline. float mDashedUnderlineGap; ///< The gap between the dashes of the dashed underline. float mShadowBlurRadius; ///< Blur radius of shadow, 0 indicates no blur. + float mOutlineBlurRadius; ///< Blur radius of outline, 0 indicates no blur. uint16_t mOutlineWidth; ///< Width of outline. Vector mStrikethroughRuns; ///< Runs of glyphs that have strikethrough. Vector mCharacterSpacingRuns; ///< Runs of glyphs that have character-spacing. -- 2.7.4