[Tizen] Add blur radius to text outline 23/310623/1
authorBowon Ryu <bowon.ryu@samsung.com>
Thu, 2 May 2024 10:56:14 +0000 (19:56 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Fri, 3 May 2024 01:27:45 +0000 (10:27 +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 c8db163..14a4c41 100644 (file)
@@ -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);
 
index 01cd89e..cae5939 100644 (file)
@@ -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);
 
index 1a4ce70..9ff7e75 100644 (file)
@@ -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<Property::Map>(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<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
@@ -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();
index bb955c3..70e46e2 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 2e2ed08..687897b 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 3e4c764..33fcaff 100644 (file)
@@ -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);
index c6b80f0..2343ad3 100644 (file)
@@ -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.
index f83e7e2..7d095b4 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 28b4802..3404be2 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 e85dbbc..9adcb65 100644 (file)
@@ -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;
index 60f45d2..be4cbfa 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 8327534..212ec0d 100644 (file)
@@ -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.
index 008a4fc..c9f553d 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 06b788f..c95b2be 100644 (file)
@@ -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;
index 1d10383..fd6b683 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 b67172a..edebaf6 100644 (file)
@@ -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<StrikethroughGlyphRun>    mStrikethroughRuns;      ///< Runs of glyphs that have strikethrough.
   Vector<CharacterSpacingGlyphRun> mCharacterSpacingRuns;   ///< Runs of glyphs that have character-spacing.