From: Adeel Kazmi Date: Tue, 29 May 2018 14:25:19 +0000 (+0100) Subject: Fix DALI_DEBUG_RENDERING crash X-Git-Tag: dali_1.3.27~1 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=8641983679bb074a9951c2df9fff7ac6cbf5f5f2 Fix DALI_DEBUG_RENDERING crash Change-Id: I4a01e1b38f01e21eb45fb6995f531a36e99774ac --- diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp index b4ea19b..0cc5c2d 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include @@ -238,3 +240,100 @@ int UtcDaliDebugRenderingGetVisual2(void) EnvironmentVariable::SetTestingEnvironmentVariable(false); END_TEST; } + +int UtcDaliDebugRenderingGetVisualObject01(void) +{ + EnvironmentVariable::SetTestingEnvironmentVariable( true ); + ToolkitTestApplication application; + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + tet_infoline( "Create a TextVisual when debugging is enabled, thus creating a proxy Wireframe Visual" ); + + Dali::Property::Map map; + map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT; + map[ TextVisual::Property::TEXT ] = "Hello"; + + Visual::Base textVisual = factory.CreateVisual( map); + DALI_TEST_CHECK( textVisual ); + + tet_infoline( "Check that GetVisualObject returns the actual TextVisual" ); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject(); + DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) ); + + tet_infoline( "Compare the returned TextVisual with the visual implementation, should differ" ); + DALI_TEST_CHECK( textVisual.GetObjectPtr() != &visualImpl ); + + END_TEST; +} + +int UtcDaliDebugRenderingGetVisualObject02(void) +{ + ToolkitTestApplication application; + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + tet_infoline( "Create a TextVisual without debugging enabled, thus no proxy Wireframe Visual" ); + + Dali::Property::Map map; + map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT; + map[ TextVisual::Property::TEXT ] = "Hello"; + + Visual::Base textVisual = factory.CreateVisual( map); + DALI_TEST_CHECK( textVisual ); + + tet_infoline( "Check that GetVisualObject returns the actual TextVisual" ); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject(); + DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) ); + + tet_infoline( "Compare the returned TextVisual with the visual implementation, should be the same" ); + DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl ); + + END_TEST; +} + +int UtcDaliDebugRenderingGetVisualObject03(void) +{ + ToolkitTestApplication application; + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + tet_infoline( "Create a WireframeVisual without debugging enabled, thus no proxy Wireframe Visual either" ); + + Dali::Property::Map map; + map[ Toolkit::Visual::Property::TYPE ] = Visual::WIREFRAME; + + Visual::Base textVisual = factory.CreateVisual( map); + DALI_TEST_CHECK( textVisual ); + + tet_infoline( "Check that GetVisualObject returns the WireframeVisual" ); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject(); + DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::WireframeVisual* >( &visualImpl ) ); + + tet_infoline( "Compare the returned Visual with the visual implementation, should be the same" ); + DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl ); + + END_TEST; +} + +int UtcDaliDebugRenderingRenderText(void) +{ + EnvironmentVariable::SetTestingEnvironmentVariable( true ); + ToolkitTestApplication application; + tet_infoline( "Ensure we can render text when in debug mode" ); + + try + { + Toolkit::TextLabel label = TextLabel::New( "Hello" ); + Stage::GetCurrent().Add( label ); + DALI_TEST_CHECK( true ); + } catch( ... ) + { + DALI_TEST_CHECK( false ); + } + + END_TEST; +} diff --git a/dali-toolkit/internal/visuals/text/text-visual.h b/dali-toolkit/internal/visuals/text/text-visual.h index 6fbf8ed..f1d7e12 100644 --- a/dali-toolkit/internal/visuals/text/text-visual.h +++ b/dali-toolkit/internal/visuals/text/text-visual.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_INTERNAL_TEXT_VISUAL_H /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -220,13 +220,13 @@ private: Shader GetTextShader( VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled ); /** - * @brief Retrieve the text's controller. - * @param[in] visual The text visual. - * @return The text controller + * @brief Retrieve the TextVisual object. + * @param[in] visual A handle to the TextVisual + * @return The TextVisual object */ static TextVisual& GetVisualObject( Toolkit::Visual::Base visual ) { - return static_cast( visual.GetBaseObject() ); + return static_cast< TextVisual& >( Toolkit::GetImplementation( visual ).GetVisualObject() ); }; private: diff --git a/dali-toolkit/internal/visuals/visual-base-impl.cpp b/dali-toolkit/internal/visuals/visual-base-impl.cpp index 8d2158f..1ae6411 100755 --- a/dali-toolkit/internal/visuals/visual-base-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-base-impl.cpp @@ -474,6 +474,11 @@ Visual::FittingMode Visual::Base::GetFittingMode() const return mImpl->mFittingMode; } +Visual::Base& Visual::Base::GetVisualObject() +{ + return *this; +} + Renderer Visual::Base::GetRenderer() { return mImpl->mRenderer; diff --git a/dali-toolkit/internal/visuals/visual-base-impl.h b/dali-toolkit/internal/visuals/visual-base-impl.h index 4839551..02419d2 100644 --- a/dali-toolkit/internal/visuals/visual-base-impl.h +++ b/dali-toolkit/internal/visuals/visual-base-impl.h @@ -260,6 +260,13 @@ public: */ FittingMode GetFittingMode() const; + /** + * @brief Get the actual Visual Object. + * @return The actual visual object + * @note Should be overridden by deriving controls if they are acting as a proxy to other visual objects. + */ + virtual Base& GetVisualObject(); + protected: /** diff --git a/dali-toolkit/internal/visuals/wireframe/wireframe-visual.cpp b/dali-toolkit/internal/visuals/wireframe/wireframe-visual.cpp index 238d4ac..227a780 100644 --- a/dali-toolkit/internal/visuals/wireframe/wireframe-visual.cpp +++ b/dali-toolkit/internal/visuals/wireframe/wireframe-visual.cpp @@ -240,6 +240,16 @@ void WireframeVisual::OnSetTransform() } } +Visual::Base& WireframeVisual::GetVisualObject() +{ + if( mActualVisual ) + { + return *mActualVisual.Get(); + } + + return *this; +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/visuals/wireframe/wireframe-visual.h b/dali-toolkit/internal/visuals/wireframe/wireframe-visual.h index 9edeca8..d63cfa8 100644 --- a/dali-toolkit/internal/visuals/wireframe/wireframe-visual.h +++ b/dali-toolkit/internal/visuals/wireframe/wireframe-visual.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_INTERNAL_WIREFRAME_VISUAL_H /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2018 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -128,6 +128,13 @@ protected: // from Visual::Base */ virtual void OnSetTransform(); + /** + * @copydoc Visual::Base::GetVisualObject + * + * Overriding as this visual can sometimes act as a proxy to the actual visual, i.e. when using debug rendering. + */ + virtual Base& GetVisualObject() override; + private: /** * Create the geometry which presents the quad wireframe.