Fix markup underline, strikethrough in overlay style 87/277487/3
authorBowon Ryu <bowon.ryu@samsung.com>
Thu, 7 Jul 2022 11:15:53 +0000 (20:15 +0900)
committerEunki Hong <eunkiki.hong@samsung.com>
Mon, 11 Jul 2022 04:20:20 +0000 (04:20 +0000)
Change-Id: Ib5352c423f558ca4ffc6be2c37d644eb02249151
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
dali-toolkit/internal/text/rendering/text-typesetter.cpp
dali-toolkit/internal/text/rendering/text-typesetter.h
dali-toolkit/internal/text/rendering/view-model.cpp
dali-toolkit/internal/text/rendering/view-model.h
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/text-view-interface.h
dali-toolkit/internal/text/text-view.cpp
dali-toolkit/internal/text/text-view.h
dali-toolkit/internal/visuals/text/text-visual.cpp

index 14f3da70227d72f92ceebfe91ca18fc313607121..5543d79f24eaf98be407b2c621bae19a12c10044 100644 (file)
@@ -983,7 +983,7 @@ PixelData Typesetter::Render(const Vector2& size, Toolkit::DevelText::TextDirect
       CombineImageBuffer(imageBuffer, outlineImageBuffer, bufferWidth, bufferHeight, true);
     }
 
-    // @todo. Support shadow and underline for partial text later on.
+    // @todo. Support shadow for partial text later on.
 
     // Generate the shadow if enabled
     const Vector2& shadowOffset = mModel->GetShadowOffset();
@@ -1004,17 +1004,6 @@ PixelData Typesetter::Render(const Vector2& size, Toolkit::DevelText::TextDirect
       CombineImageBuffer(imageBuffer, shadowImageBuffer, bufferWidth, bufferHeight, true);
     }
 
-    // Generate the underline if enabled
-    const bool underlineEnabled = mModel->IsUnderlineEnabled();
-    if(underlineEnabled && RENDER_OVERLAY_STYLE == behaviour)
-    {
-      // Create the image buffer for underline
-      Devel::PixelBuffer underlineImageBuffer = CreateImageBuffer(bufferWidth, bufferHeight, Typesetter::STYLE_UNDERLINE, ignoreHorizontalAlignment, pixelFormat, penX, penY, startIndexOfGlyphs, endIndexOfGlyphs);
-
-      // Combine the two buffers
-      CombineImageBuffer(imageBuffer, underlineImageBuffer, bufferWidth, bufferHeight, true);
-    }
-
     // Generate the background if enabled
     const bool backgroundEnabled   = mModel->IsBackgroundEnabled();
     const bool backgroundMarkupSet = mModel->IsMarkupBackgroundColorSet();
@@ -1040,20 +1029,40 @@ PixelData Typesetter::Render(const Vector2& size, Toolkit::DevelText::TextDirect
       CombineImageBuffer(imageBuffer, backgroundImageBuffer, bufferWidth, bufferHeight, true);
     }
 
-    // Generate the strikethrough if enabled
-    const bool strikethroughEnabled = mModel->IsStrikethroughEnabled();
-    if(strikethroughEnabled && RENDER_OVERLAY_STYLE == behaviour)
+    if(RENDER_OVERLAY_STYLE == behaviour)
     {
-      // Create the image buffer for strikethrough
-      Devel::PixelBuffer strikethroughImageBuffer = CreateImageBuffer(bufferWidth, bufferHeight, Typesetter::STYLE_STRIKETHROUGH, ignoreHorizontalAlignment, pixelFormat, penX, penY, 0u, endIndexOfGlyphs);
+      if(mModel->IsUnderlineEnabled())
+      {
+        // Create the image buffer for underline
+        Devel::PixelBuffer underlineImageBuffer = CreateImageBuffer(bufferWidth, bufferHeight, Typesetter::STYLE_UNDERLINE, ignoreHorizontalAlignment, pixelFormat, penX, penY, startIndexOfGlyphs, endIndexOfGlyphs);
 
-      // Combine the two buffers
-      CombineImageBuffer(imageBuffer, strikethroughImageBuffer, bufferWidth, bufferHeight, true);
-    }
+        // Combine the two buffers
+        CombineImageBuffer(imageBuffer, underlineImageBuffer, bufferWidth, bufferHeight, true);
+      }
+
+      if(mModel->IsStrikethroughEnabled())
+      {
+        // Create the image buffer for strikethrough
+        Devel::PixelBuffer strikethroughImageBuffer = CreateImageBuffer(bufferWidth, bufferHeight, Typesetter::STYLE_STRIKETHROUGH, ignoreHorizontalAlignment, pixelFormat, penX, penY, 0u, endIndexOfGlyphs);
 
-    // Markup-Processor
+        // Combine the two buffers
+        CombineImageBuffer(imageBuffer, strikethroughImageBuffer, bufferWidth, bufferHeight, true);
+      }
+
+      // Markup-Processor for overlay styles
+      if(mModel->IsMarkupProcessorEnabled())
+      {
+        if(mModel->IsMarkupUnderlineSet())
+        {
+          imageBuffer = ApplyUnderlineMarkupImageBuffer(imageBuffer, bufferWidth, bufferHeight, ignoreHorizontalAlignment, pixelFormat, penX, penY);
+        }
 
-    imageBuffer = ApplyMarkupProcessorOnPixelBuffer(imageBuffer, bufferWidth, bufferHeight, ignoreHorizontalAlignment, pixelFormat, penX, penY);
+        if(mModel->IsMarkupStrikethroughSet())
+        {
+          imageBuffer = ApplyStrikethroughMarkupImageBuffer(imageBuffer, bufferWidth, bufferHeight, ignoreHorizontalAlignment, pixelFormat, penX, penY);
+        }
+      }
+    }
   }
 
   // Create the final PixelData for the combined image buffer
@@ -1490,20 +1499,6 @@ Devel::PixelBuffer Typesetter::ApplyStrikethroughMarkupImageBuffer(Devel::PixelB
   return topPixelBuffer;
 }
 
-Devel::PixelBuffer Typesetter::ApplyMarkupProcessorOnPixelBuffer(Devel::PixelBuffer topPixelBuffer, const uint32_t bufferWidth, const uint32_t bufferHeight, const bool ignoreHorizontalAlignment, const Pixel::Format pixelFormat, const int32_t horizontalOffset, const int32_t verticalOffset)
-{
-  // Apply the markup-Processor if enabled
-  const bool markupProcessorEnabled = mModel->IsMarkupProcessorEnabled();
-  if(markupProcessorEnabled)
-  {
-    topPixelBuffer = ApplyUnderlineMarkupImageBuffer(topPixelBuffer, bufferWidth, bufferHeight, ignoreHorizontalAlignment, pixelFormat, horizontalOffset, verticalOffset);
-
-    topPixelBuffer = ApplyStrikethroughMarkupImageBuffer(topPixelBuffer, bufferWidth, bufferHeight, ignoreHorizontalAlignment, pixelFormat, horizontalOffset, verticalOffset);
-  }
-
-  return topPixelBuffer;
-}
-
 Typesetter::Typesetter(const ModelInterface* const model)
 : mModel(new ViewModel(model))
 {
index 3a71c31435c6520bb8b27e9a45d785c1b91b392a..296126e1ef450b70d29ad7bcae9fa012a2a2f038 100644 (file)
@@ -146,21 +146,6 @@ private:
    */
   Devel::PixelBuffer CreateImageBuffer(const uint32_t bufferWidth, const uint32_t bufferHeight, const Typesetter::Style style, const bool ignoreHorizontalAlignment, const Pixel::Format pixelFormat, const int32_t horizontalOffset, const int32_t verticalOffset, const TextAbstraction::GlyphIndex fromGlyphIndex, const TextAbstraction::GlyphIndex toGlyphIndex);
 
-  /**
-   * @brief Apply behaviour of tags if the markup-processor is enabled.
-   *
-   * @param[in] topPixelBuffer The top layer buffer.
-   * @param[in] bufferWidth The width of the image buffer.
-   * @param[in] bufferHeight The height of the image buffer.
-   * @param[in] ignoreHorizontalAlignment Whether to ignore the horizontal alignment, not ignored by default.
-   * @param[in] pixelFormat The format of the pixel in the image that the text is rendered as (i.e. either Pixel::BGRA8888 or Pixel::L8).
-   * @param[in] horizontalOffset The horizontal offset to be added to the glyph's position.
-   * @param[in] verticalOffset The vertical offset to be added to the glyph's position.
-   *
-   * @return The image buffer with the markup.
-   */
-  Devel::PixelBuffer ApplyMarkupProcessorOnPixelBuffer(Devel::PixelBuffer topPixelBuffer, const uint32_t bufferWidth, const uint32_t bufferHeight, const bool ignoreHorizontalAlignment, const Pixel::Format pixelFormat, const int32_t horizontalOffset, const int32_t verticalOffset);
-
   /**
    * @brief Apply markup underline tags.
    *
index 9cfba93153baf73944fd538b551a2737a93d0c0a..0c4aeb3e00c4fcf38e7b6cf9e9e7b7de263c25ca 100644 (file)
@@ -245,6 +245,11 @@ bool ViewModel::IsUnderlineEnabled() const
   return mModel->IsUnderlineEnabled();
 }
 
+bool const ViewModel::IsMarkupUnderlineSet() const
+{
+  return mModel->IsMarkupUnderlineSet();
+}
+
 float ViewModel::GetUnderlineHeight() const
 {
   return mModel->GetUnderlineHeight();
@@ -699,6 +704,11 @@ bool ViewModel::IsStrikethroughEnabled() const
   return mModel->IsStrikethroughEnabled();
 }
 
+bool const ViewModel::IsMarkupStrikethroughSet() const
+{
+  return mModel->IsMarkupStrikethroughSet();
+}
+
 Length ViewModel::GetNumberOfStrikethroughRuns() const
 {
   return mModel->GetNumberOfStrikethroughRuns();
index c7b0b183df3ebf97bc441db2bee9e80643ab8d88..c127ebbad528adbb5411a22d07da9823b9f60139 100644 (file)
@@ -206,6 +206,11 @@ public:
    */
   bool IsUnderlineEnabled() const override;
 
+  /**
+   * @copydoc ModelInterface::IsMarkupUnderlineSet()
+   */
+  bool const IsMarkupUnderlineSet() const override;
+
   /**
    * @copydoc ModelInterface::GetUnderlineHeight()
    */
@@ -303,12 +308,26 @@ public:
    */
   void ElideGlyphs();
 
+  /**
+   * @copydoc ModelInterface::GetStrikethroughHeight()
+   */
   float GetStrikethroughHeight() const override;
 
+  /**
+   * @copydoc ModelInterface::GetStrikethroughColor()
+   */
   const Vector4& GetStrikethroughColor() const override;
 
+  /**
+   * @copydoc ModelInterface::IsStrikethroughEnabled()
+   */
   bool IsStrikethroughEnabled() const override;
 
+  /**
+   * @copydoc ModelInterface::IsMarkupStrikethroughSet()
+   */
+  bool const IsMarkupStrikethroughSet() const override;
+
   /**
    * @copydoc ModelInterface::GetNumberOfStrikethroughRuns()
    */
index 0f2bd7bb00276a9af87a5a63920651f3f8008cbf..0ccbb45cfeb8c1c2c056298d2878bab2400d9b4d 100644 (file)
@@ -261,6 +261,13 @@ public:
    */
   virtual bool IsUnderlineEnabled() const = 0;
 
+  /**
+   * @brief checks if there is underline set using markup.
+   *
+   * @return boolean if there is underline set using markup.
+   */
+  virtual bool const IsMarkupUnderlineSet() const = 0;
+
   /**
    * @brief Retrieves the underline height override
    *
@@ -375,6 +382,13 @@ public:
    */
   virtual bool IsStrikethroughEnabled() const = 0;
 
+  /**
+   * @brief checks if there is strikethrough set using markup.
+   *
+   * @return boolean if there is strikethrough set using markup.
+   */
+  virtual bool const IsMarkupStrikethroughSet() const = 0;
+
   /**
    * @brief Retrieves the strikethrough height override
    *
index 0ac67ca1e1e305078bc77ba8a7b0b948ba35b5ae..ba6dbcfc55a1de2f3aa96195e893b77ae91feecd 100644 (file)
@@ -187,6 +187,11 @@ bool Model::IsUnderlineEnabled() const
   return mVisualModel->IsUnderlineEnabled();
 }
 
+bool const Model::IsMarkupUnderlineSet() const
+{
+  return (mVisualModel->mUnderlineRuns.Count() > 0u);
+}
+
 float Model::GetUnderlineHeight() const
 {
   return mVisualModel->GetUnderlineHeight();
@@ -266,6 +271,11 @@ bool Model::IsStrikethroughEnabled() const
   return mVisualModel->IsStrikethroughEnabled();
 }
 
+bool const Model::IsMarkupStrikethroughSet() const
+{
+  return (mVisualModel->mStrikethroughRuns.Count() > 0u);
+}
+
 float Model::GetStrikethroughHeight() const
 {
   return mVisualModel->GetStrikethroughHeight();
index 416df17c32b17812846df6a6dad4586e8c09be62..a3a42a2993613f74dae140ee404f95c997be5da8 100644 (file)
@@ -204,6 +204,11 @@ public:
    */
   bool IsUnderlineEnabled() const override;
 
+  /**
+   * @copydoc ModelInterface::IsMarkupUnderlineSet()
+   */
+  bool const IsMarkupUnderlineSet() const override;
+
   /**
    * @copydoc ModelInterface::GetUnderlineHeight()
    */
@@ -274,11 +279,26 @@ public:
   */
   Length GetHyphensCount() const override;
 
+  /**
+   * @copydoc ModelInterface::GetStrikethroughHeight()
+   */
   float GetStrikethroughHeight() const override;
 
+  /**
+   * @copydoc ModelInterface::GetStrikethroughColor()
+   */
   const Vector4& GetStrikethroughColor() const override;
 
+  /**
+   * @copydoc ModelInterface::IsStrikethroughEnabled()
+   */
   bool IsStrikethroughEnabled() const override;
+
+  /**
+   * @copydoc ModelInterface::IsMarkupStrikethroughSet()
+   */
+  bool const IsMarkupStrikethroughSet() const override;
+
   /**
    * @copydoc ModelInterface::GetCharacterSpacing()
    */
index 98b420d100dd35d70361da9d3ac47ae872b06c73..2fcf5489e748459410c429796b6cca6769460f23 100644 (file)
@@ -174,6 +174,13 @@ public:
    */
   virtual bool IsUnderlineEnabled() const = 0;
 
+  /**
+   * @brief checks if there is underline set using markup.
+   *
+   * @return boolean if there is underline set using markup.
+   */
+  virtual bool const IsMarkupUnderlineSet() const = 0;
+
   /**
    * @brief Returns the hyphens glyph info.
    *
@@ -310,6 +317,13 @@ public:
    */
   virtual bool IsStrikethroughEnabled() const = 0;
 
+  /**
+   * @brief checks if there is strikethrough set using markup.
+   *
+   * @return boolean if there is strikethrough set using markup.
+   */
+  virtual bool const IsMarkupStrikethroughSet() const = 0;
+
   /**
    * @brief Retrieves the strikethrough height override
    *
index 0be5ac608fc99f301b0e07fe08e345cbd9320b97..0b81484863380edd823a3434296d2603fd104557 100644 (file)
@@ -670,6 +670,11 @@ bool View::IsUnderlineEnabled() const
   return false;
 }
 
+bool const View::IsMarkupUnderlineSet() const
+{
+  return (GetNumberOfUnderlineRuns() > 0u);
+}
+
 const GlyphInfo* View::GetHyphens() const
 {
   if(mImpl->mVisualModel)
@@ -865,6 +870,11 @@ bool View::IsStrikethroughEnabled() const
   return (mImpl->mVisualModel) ? mImpl->mVisualModel->IsStrikethroughEnabled() : false;
 }
 
+bool const View::IsMarkupStrikethroughSet() const
+{
+  return (GetNumberOfStrikethroughRuns() > 0u);
+}
+
 float View::GetStrikethroughHeight() const
 {
   return (mImpl->mVisualModel) ? mImpl->mVisualModel->GetStrikethroughHeight() : 0.0f;
index 93542cc1c63b9fefa48347450adaea43129d6823..7cccf19d47fee2c197709324fc9be5a71086dd6d 100644 (file)
@@ -134,6 +134,11 @@ public:
    */
   bool IsUnderlineEnabled() const override;
 
+  /**
+   * @copydoc Dali::Toolkit::Text::ViewInterface::IsMarkupUnderlineSet()
+   */
+  bool const IsMarkupUnderlineSet() const;
+
   /**
   * @copydoc Dali::Toolkit::Text::ViewInterface::GetHyphens()
   */
@@ -231,6 +236,11 @@ public:
    */
   bool IsStrikethroughEnabled() const override;
 
+  /**
+   * @copydoc Dali::Toolkit::Text::ViewInterface::IsMarkupStrikethroughSet()
+   */
+  bool const IsMarkupStrikethroughSet() const;
+
   /**
    * @copydoc Dali::Toolkit::Text::ViewInterface::GetStrikethroughHeight()
    */
index 21067451402ec439f26046230e92c313c128447b..aa205cf3f19d38666a32934ce150f3972dde4508 100644 (file)
@@ -562,13 +562,14 @@ void TextVisual::UpdateRenderer()
         shadowEnabled = true;
       }
 
-      const bool underlineEnabled       = mController->GetTextModel()->IsUnderlineEnabled();
-      const bool outlineEnabled         = (mController->GetTextModel()->GetOutlineWidth() > Math::MACHINE_EPSILON_1);
-      const bool backgroundEnabled      = mController->GetTextModel()->IsBackgroundEnabled();
-      const bool markupProcessorEnabled = mController->IsMarkupProcessorEnabled();
-      const bool strikethroughEnabled   = mController->GetTextModel()->IsStrikethroughEnabled();
-
-      const bool styleEnabled   = (shadowEnabled || underlineEnabled || outlineEnabled || backgroundEnabled || markupProcessorEnabled || strikethroughEnabled);
+      const bool outlineEnabled             = (mController->GetTextModel()->GetOutlineWidth() > Math::MACHINE_EPSILON_1);
+      const bool backgroundEnabled          = mController->GetTextModel()->IsBackgroundEnabled();
+      const bool markupProcessorEnabled     = mController->IsMarkupProcessorEnabled();
+      const bool markupUnderlineEnabled     = markupProcessorEnabled && mController->GetTextModel()->IsMarkupUnderlineSet();
+      const bool markupStrikethroughEnabled = markupProcessorEnabled && mController->GetTextModel()->IsMarkupStrikethroughSet();
+      const bool underlineEnabled           = mController->GetTextModel()->IsUnderlineEnabled() || markupUnderlineEnabled;
+      const bool strikethroughEnabled       = mController->GetTextModel()->IsStrikethroughEnabled() || markupStrikethroughEnabled;
+      const bool styleEnabled   = (shadowEnabled || outlineEnabled || backgroundEnabled || markupProcessorEnabled);
       const bool isOverlayStyle = underlineEnabled || strikethroughEnabled;
 
       AddRenderer(control, relayoutSize, hasMultipleTextColors, containsColorGlyph, styleEnabled, isOverlayStyle);