Add blur radius to text outline 99/310599/1
authorBowon Ryu <bowon.ryu@samsung.com>
Thu, 2 May 2024 10:56:14 +0000 (19:56 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Thu, 2 May 2024 10:56:14 +0000 (19:56 +0900)
it uses the same Gaussian blur as the text shadow.

Change-Id: I3b7d7534c68cfae5de55747158b4f74ffcaa2e88
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
16 files changed:
automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp
automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp
automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp
automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp
dali-toolkit/devel-api/controls/text-controls/text-style-properties-devel.h
dali-toolkit/internal/text/controller/text-controller.cpp
dali-toolkit/internal/text/controller/text-controller.h
dali-toolkit/internal/text/rendering/text-typesetter.cpp
dali-toolkit/internal/text/rendering/view-model.cpp
dali-toolkit/internal/text/rendering/view-model.h
dali-toolkit/internal/text/text-effects-style.cpp
dali-toolkit/internal/text/text-model-interface.h
dali-toolkit/internal/text/text-model.cpp
dali-toolkit/internal/text/text-model.h
dali-toolkit/internal/text/visual-model-impl.cpp
dali-toolkit/internal/text/visual-model-impl.h

index 928967426b02c87279ca876f4da0787079c0238b..6a5745cc2a82298899a59f36e800407c772b9e8e 100644 (file)
@@ -1043,6 +1043,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);
 
index 422b1f06abfa9b1e528ef2ab05c1da075d1d6755..d098f99eee0a1e552c9c1fba0ffc277a1d783430 100644 (file)
@@ -1109,6 +1109,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);
 
index 47c7369fd026378a73844adae8d42fe1978403d2..576bd0fb35a69220b1b10806dbb766ea7db6b4be 100644 (file)
@@ -953,6 +953,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<Property::Map>(TextLabel::Property::OUTLINE);
@@ -963,12 +964,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<Property::Map>(TextLabel::Property::OUTLINE);
   DALI_TEST_EQUALS(outlineMapGet.Count(), outlineMapSet.Count(), TEST_LOCATION);
-  std::vector<std::string> outlineIndicesConversionTable = {"color", "width", "offset"};
+  std::vector<std::string> outlineIndicesConversionTable = {"color", "width", "offset", "blurRadius"};
   DALI_TEST_EQUALS(DaliTestCheckMaps(outlineMapGet, outlineMapSet, outlineIndicesConversionTable), true, TEST_LOCATION);
 
   // Check the background property
@@ -1821,6 +1823,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();
index bb955c35495c9f672e6e7bce3456289ac7f24c6d..70e46e2980e4e1c8f54b4f2caa58453e5ab5b8cd 100644 (file)
@@ -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));
index 2e2ed08b16a1bedcb3f43b7c008d123d5da366cc..687897b90d3bd448c2719f7cd299351764d2c550 100644 (file)
@@ -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
index 20731c4564e4fcc4d371a31402ad41865680b8c9..cb126dc207be9901e6ab20a10da13f6a3163ee79 100644 (file)
@@ -1028,6 +1028,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);
index 53601469bcdc632b9d4526a0f5e033eb6fd8044e..9acab81068883fb28b9f0e97d8d6b94c1c060166 100644 (file)
@@ -1321,6 +1321,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.
    *
index f83e7e2441563732bfca9f59a915b8e68493c082..7d095b48e76777ded92a29c966c10576a15c2597 100644 (file)
@@ -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);
     }
index 28b4802463eda2c56f928f7a16b976329ecc9737..3404be236f080af780c56b9dedcdfbad170b77ad 100644 (file)
@@ -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();
index e85dbbcfbe66f32588cf800a89033c224bb7d686..9adcb65f8c66eb1e52c6e917a73adf4a6f4a9cfb 100644 (file)
@@ -261,6 +261,11 @@ public:
    */
   uint16_t GetOutlineWidth() const override;
 
+  /**
+   * @copydoc ModelInterface::GetOutlineBlurRadius()
+   */
+  const float& GetOutlineBlurRadius() const override;
+
   /**
    * @copydoc ModelInterface::GetBackgroundColor()
    */
index 60f45d2483c1cbdbc153ed48d80542f199e0b0b1..be4cbfa241be56229dc75f98f0f12f06eebaada7 100644 (file)
@@ -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<Vector2>();
       }
     }
+    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<std::string>();
+        blurRadius                      = StringToFloat(blurRadiusStr.c_str());
+      }
+      else
+      {
+        blurRadius = valueGet.second.Get<float>();
+      }
+    }
   }
 
   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<int>(width));
           map.Insert(OFFSET_KEY, offset);
+          map.Insert(BLUR_RADIUS_KEY, blurRadius);
 
           value = map;
 
index 832753494a81bb7b648fd4c81ec95d6ba1eddf5e..212ec0dc3cf3a7b3aa673d56b60e0294562745a4 100644 (file)
@@ -342,6 +342,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.
    *
index 0af5d39581597aa6d89c120b6922047b7ff3414a..01c6f606939a0f197063f12f17ab8218dfc044db 100644 (file)
@@ -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();
index faa38b12cdedac3b2768f2f20c8a1815eddd5d58..eb0d8a60d2f3242064c967fdc21034c31031366f 100644 (file)
@@ -259,6 +259,11 @@ public:
    */
   uint16_t GetOutlineWidth() const override;
 
+  /**
+   * @copydoc ModelInterface::GetOutlineBlurRadius()
+   */
+  const float& GetOutlineBlurRadius() const override;
+
   /**
    * @copydoc ModelInterface::GetBackgroundColor()
    */
index 1d1038369a3d54833841d6e01168307b80695b97..fd6b683737cdec2665038e049d575fc5f46e872e 100644 (file)
@@ -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(),
index b67172a3f41019df0dd5412f30551a1231c5c4c1..edebaf6294dff2386c93ebb31680cdace75cb072 100644 (file)
@@ -425,6 +425,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.
    *
@@ -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<StrikethroughGlyphRun>    mStrikethroughRuns;      ///< Runs of glyphs that have strikethrough.
   Vector<CharacterSpacingGlyphRun> mCharacterSpacingRuns;   ///< Runs of glyphs that have character-spacing.