X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Ftext%2Ftext-visual.cpp;h=b8d848d44eebeca37b7b0bf7d86ac0222e6f4f2d;hb=6c542cda6eb2ae887cb7a8a6c5d77e2f9659cbf7;hp=ee31d1f99fac57f23a1ab65039287a8aff9ebc07;hpb=2b6e7d59a00075e2f83eedee483e3544a7af7f3d;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/text/text-visual.cpp b/dali-toolkit/internal/visuals/text/text-visual.cpp index ee31d1f..b8d848d 100644 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -223,6 +223,9 @@ void TextVisual::DoCreatePropertyMap(Property::Map& map) const GetBackgroundProperties(mController, value, Text::EffectStyle::DEFAULT); map.Insert(Toolkit::DevelTextVisual::Property::BACKGROUND, value); + + GetStrikethroughProperties(mController, value, Text::EffectStyle::DEFAULT); + map.Insert(Toolkit::DevelTextVisual::Property::STRIKETHROUGH, value); } void TextVisual::DoCreateInstancePropertyMap(Property::Map& map) const @@ -239,6 +242,7 @@ TextVisual::TextVisual(VisualFactoryCache& factoryCache) mController(Text::Controller::New()), mTypesetter(Text::Typesetter::New(mController->GetTextModel())), mAnimatableTextColorPropertyIndex(Property::INVALID_INDEX), + mTextColorAnimatableIndex(Property::INVALID_INDEX), mRendererUpdateNeeded(false) { } @@ -290,29 +294,36 @@ void TextVisual::DoSetOnScene(Actor& actor) // Enable the pre-multiplied alpha to improve the text quality EnablePreMultipliedAlpha(true); - if(mAnimatableTextColorPropertyIndex != Property::INVALID_INDEX) + const Vector4& defaultColor = mController->GetTextModel()->GetDefaultColor(); + if(mTextColorAnimatableIndex == Property::INVALID_INDEX) + { + mTextColorAnimatableIndex = mImpl->mRenderer.RegisterProperty("uTextColorAnimatable", defaultColor); + } + else { - const Vector4& defaultColor = mController->GetTextModel()->GetDefaultColor(); - Dali::Property::Index shaderTextColorIndex = mImpl->mRenderer.RegisterProperty("uTextColorAnimatable", defaultColor); + mImpl->mRenderer.SetProperty(mTextColorAnimatableIndex, defaultColor); + } + if(mAnimatableTextColorPropertyIndex != Property::INVALID_INDEX) + { // Create constraint for the animatable text's color Property with uTextColorAnimatable in the renderer. - if(shaderTextColorIndex != Property::INVALID_INDEX) + if(mTextColorAnimatableIndex != Property::INVALID_INDEX) { if(!mColorConstraint) { - mColorConstraint = Constraint::New(mImpl->mRenderer, shaderTextColorIndex, TextColorConstraint); + mColorConstraint = Constraint::New(mImpl->mRenderer, mTextColorAnimatableIndex, TextColorConstraint); mColorConstraint.AddSource(Source(actor, mAnimatableTextColorPropertyIndex)); } mColorConstraint.Apply(); + } - // Make zero if the alpha value of text color is zero to skip rendering text - if(!mOpacityConstraint) - { - mOpacityConstraint = Constraint::New(mImpl->mRenderer, Dali::DevelRenderer::Property::OPACITY, OpacityConstraint); - mOpacityConstraint.AddSource(Source(actor, mAnimatableTextColorPropertyIndex)); - } - mOpacityConstraint.Apply(); + // Make zero if the alpha value of text color is zero to skip rendering text + if(!mOpacityConstraint) + { + mOpacityConstraint = Constraint::New(mImpl->mRenderer, Dali::DevelRenderer::Property::OPACITY, OpacityConstraint); + mOpacityConstraint.AddSource(Source(actor, mAnimatableTextColorPropertyIndex)); } + mOpacityConstraint.Apply(); } // Renderer needs textures and to be added to control @@ -452,6 +463,11 @@ void TextVisual::DoSetProperty(Dali::Property::Index index, const Dali::Property SetBackgroundProperties(mController, propertyValue, Text::EffectStyle::DEFAULT); break; } + case Toolkit::DevelTextVisual::Property::STRIKETHROUGH: + { + SetStrikethroughProperties(mController, propertyValue, Text::EffectStyle::DEFAULT); + break; + } } } @@ -537,10 +553,12 @@ void TextVisual::UpdateRenderer() 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); + const bool styleEnabled = (shadowEnabled || underlineEnabled || outlineEnabled || backgroundEnabled || markupProcessorEnabled || strikethroughEnabled); + const bool isOverlayStyle = underlineEnabled || strikethroughEnabled; - AddRenderer(control, relayoutSize, hasMultipleTextColors, containsColorGlyph, styleEnabled); + AddRenderer(control, relayoutSize, hasMultipleTextColors, containsColorGlyph, styleEnabled, isOverlayStyle); // Text rendered and ready to display ResourceReady(Toolkit::Visual::ResourceStatus::READY); @@ -575,12 +593,13 @@ PixelData TextVisual::ConvertToPixelData(unsigned char* buffer, int width, int h return pixelData; } -void TextVisual::CreateTextureSet(TilingInfo& info, Renderer& renderer, Sampler& sampler, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled) +void TextVisual::CreateTextureSet(TilingInfo& info, Renderer& renderer, Sampler& sampler, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled, bool isOverlayStyle) { TextureSet textureSet = TextureSet::New(); unsigned int textureSetIndex = 0u; // Convert the buffer to pixel data to make it a texture. + if(info.textBuffer) { PixelData data = ConvertToPixelData(info.textBuffer, info.width, info.height, info.offsetPosition, info.textPixelFormat); @@ -595,6 +614,13 @@ void TextVisual::CreateTextureSet(TilingInfo& info, Renderer& renderer, Sampler& ++textureSetIndex; } + if(styleEnabled && isOverlayStyle && info.styleBuffer) + { + PixelData overlayStyleData = ConvertToPixelData(info.styleBuffer, info.width, info.height, info.offsetPosition, Pixel::RGBA8888); + AddTexture(textureSet, overlayStyleData, sampler, textureSetIndex); + ++textureSetIndex; + } + if(containsColorGlyph && !hasMultipleTextColors && info.maskBuffer) { PixelData maskData = ConvertToPixelData(info.maskBuffer, info.width, info.height, info.offsetPosition, Pixel::L8); @@ -619,7 +645,7 @@ void TextVisual::CreateTextureSet(TilingInfo& info, Renderer& renderer, Sampler& mRendererList.push_back(renderer); } -void TextVisual::AddRenderer(Actor& actor, const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled) +void TextVisual::AddRenderer(Actor& actor, const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled, bool isOverlayStyle) { Shader shader = GetTextShader(mFactoryCache, hasMultipleTextColors, containsColorGlyph, styleEnabled); mImpl->mRenderer.SetShader(shader); @@ -630,7 +656,7 @@ void TextVisual::AddRenderer(Actor& actor, const Vector2& size, bool hasMultiple // No tiling required. Use the default renderer. if(size.height < maxTextureSize) { - TextureSet textureSet = GetTextTexture(size, hasMultipleTextColors, containsColorGlyph, styleEnabled); + TextureSet textureSet = GetTextTexture(size, hasMultipleTextColors, containsColorGlyph, styleEnabled, isOverlayStyle); mImpl->mRenderer.SetTextures(textureSet); //Register transform properties @@ -692,7 +718,7 @@ void TextVisual::AddRenderer(Actor& actor, const Vector2& size, bool hasMultiple } // Create a textureset in the default renderer. - CreateTextureSet(info, mImpl->mRenderer, sampler, hasMultipleTextColors, containsColorGlyph, styleEnabled); + CreateTextureSet(info, mImpl->mRenderer, sampler, hasMultipleTextColors, containsColorGlyph, styleEnabled, isOverlayStyle); verifiedHeight -= maxTextureSize; @@ -711,7 +737,7 @@ void TextVisual::AddRenderer(Actor& actor, const Vector2& size, bool hasMultiple // New offset for tiling. info.offSet.y += maxTextureSize; // Create a textureset int the new tiling renderer. - CreateTextureSet(info, tilingRenderer, sampler, hasMultipleTextColors, containsColorGlyph, styleEnabled); + CreateTextureSet(info, tilingRenderer, sampler, hasMultipleTextColors, containsColorGlyph, styleEnabled, isOverlayStyle); verifiedHeight -= maxTextureSize; } @@ -729,7 +755,7 @@ void TextVisual::AddRenderer(Actor& actor, const Vector2& size, bool hasMultiple } } -TextureSet TextVisual::GetTextTexture(const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled) +TextureSet TextVisual::GetTextTexture(const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled, bool isOverlayStyle) { // Filter mode needs to be set to linear to produce better quality while scaling. Sampler sampler = Sampler::New(); @@ -749,17 +775,19 @@ TextureSet TextVisual::GetTextTexture(const Vector2& size, bool hasMultipleTextC // It may happen the image atlas can't handle a pixel data it exceeds the maximum size. // In that case, create a texture. TODO: should tile the text. unsigned int textureSetIndex = 0u; - AddTexture(textureSet, data, sampler, textureSetIndex); ++textureSetIndex; if(styleEnabled) { - // Create RGBA texture for all the text styles (without the text itself) + // Create RGBA texture for all the text styles that render in the background (without the text itself) PixelData styleData = mTypesetter->Render(size, textDirection, Text::Typesetter::RENDER_NO_TEXT, false, Pixel::RGBA8888); - AddTexture(textureSet, styleData, sampler, textureSetIndex); ++textureSetIndex; + // Create RGBA texture for overlay styles such as underline and strikethrough (without the text itself) + PixelData overlayStyleData = mTypesetter->Render(size, textDirection, Text::Typesetter::RENDER_OVERLAY_STYLE, false, Pixel::RGBA8888); + AddTexture(textureSet, overlayStyleData, sampler, textureSetIndex); + ++textureSetIndex; } if(containsColorGlyph && !hasMultipleTextColors) @@ -847,4 +875,4 @@ Shader TextVisual::GetTextShader(VisualFactoryCache& factoryCache, bool hasMulti } // namespace Toolkit -} // namespace Dali +} // namespace Dali \ No newline at end of file