[dali_1.1.11] Merge branch 'devel/master' 84/52284/1
authorRichard Huang <r.huang@samsung.com>
Fri, 20 Nov 2015 10:58:42 +0000 (10:58 +0000)
committerRichard Huang <r.huang@samsung.com>
Fri, 20 Nov 2015 10:58:42 +0000 (10:58 +0000)
Change-Id: I2f8dc25ac8abdf00cbcfc6a6e1f97e711a34635e

69 files changed:
automated-tests/src/dali-toolkit/CMakeLists.txt
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/test-platform-abstraction.cpp
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.cpp [new file with mode: 0644]
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.h [new file with mode: 0644]
automated-tests/src/dali-toolkit/utc-Dali-Control.cpp
automated-tests/src/dali-toolkit/utc-Dali-DebugRenderer.cpp [new file with mode: 0644]
automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp
automated-tests/src/dali-toolkit/utc-Dali-NinePatchMaskEffect.cpp [deleted file]
automated-tests/src/dali-toolkit/utc-Dali-RendererFactory.cpp
automated-tests/src/dali-toolkit/utc-Dali-ShaderEffects.cpp
dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.cpp
dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h
dali-toolkit/devel-api/file.list
dali-toolkit/devel-api/shader-effects/alpha-discard-effect.h
dali-toolkit/devel-api/shader-effects/image-region-effect.h
dali-toolkit/devel-api/shader-effects/nine-patch-mask-effect.h [deleted file]
dali-toolkit/internal/controls/buttons/button-impl.cpp
dali-toolkit/internal/controls/buttons/check-box-button-impl.cpp
dali-toolkit/internal/controls/buttons/check-box-button-impl.h
dali-toolkit/internal/controls/buttons/push-button-impl.cpp
dali-toolkit/internal/controls/image-view/image-view-impl.cpp
dali-toolkit/internal/controls/image-view/image-view-impl.h
dali-toolkit/internal/controls/page-turn-view/page-turn-view-impl.cpp
dali-toolkit/internal/controls/popup/popup-impl.cpp
dali-toolkit/internal/controls/renderers/control-renderer-impl.cpp
dali-toolkit/internal/controls/renderers/control-renderer-impl.h
dali-toolkit/internal/controls/renderers/debug/debug-renderer.cpp [new file with mode: 0644]
dali-toolkit/internal/controls/renderers/debug/debug-renderer.h [new file with mode: 0644]
dali-toolkit/internal/controls/renderers/image/image-renderer.cpp
dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-cache.h
dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-impl.h
dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp
dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.h
dali-toolkit/internal/controls/slider/slider-impl.cpp
dali-toolkit/internal/controls/slider/slider-impl.h
dali-toolkit/internal/file.list
dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp
dali-toolkit/internal/text/decorator/text-decorator.cpp
dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp
dali-toolkit/internal/text/text-controller-impl.cpp
dali-toolkit/internal/text/text-controller-impl.h
dali-toolkit/internal/text/text-controller.cpp
dali-toolkit/public-api/controls/control-impl.cpp
dali-toolkit/public-api/controls/control-impl.h
dali-toolkit/public-api/controls/image-view/image-view.cpp
dali-toolkit/public-api/controls/image-view/image-view.h
dali-toolkit/public-api/dali-toolkit-version.cpp
dali-toolkit/styles/images-common/keyboard_focus.9.png [moved from dali-toolkit/styles/images-common/keyboard_focus.png with 85% similarity]
dali-toolkit/styles/images-common/popup_scroll.9.png [new file with mode: 0644]
dali-toolkit/styles/images-common/popup_scroll.png [deleted file]
docs/content/images/background/BackgroundBorder.png [new file with mode: 0644]
docs/content/images/debug-renderer/debug-blocks.png [new file with mode: 0644]
docs/content/images/text-controls/EmptyTextAndNoContentToPaste.png [new file with mode: 0644]
docs/content/images/text-controls/EmptyTextClipboardHasContent.png [new file with mode: 0644]
docs/content/images/text-controls/SelectAllWhitespace.png [new file with mode: 0644]
docs/content/images/text-controls/SelectWhitespaceAfterText.png [new file with mode: 0644]
docs/content/images/text-controls/SelectingText.png [new file with mode: 0644]
docs/content/images/text-controls/TapAfterCopyingText.png [new file with mode: 0644]
docs/content/main.md
docs/content/programming-guide/background.h
docs/content/programming-guide/image-actor.h
docs/content/programming-guide/image-view.h [new file with mode: 0644]
docs/content/programming-guide/shader-intro.h
docs/content/shared-javascript-and-cpp-documentation/debug-renderer.md [new file with mode: 0644]
docs/content/shared-javascript-and-cpp-documentation/text-field.md
packaging/dali-toolkit.spec

index d6e2eaa..3b7b51a 100644 (file)
@@ -40,7 +40,6 @@ SET(TC_SOURCES
    utc-Dali-ItemView.cpp
    utc-Dali-KeyboardFocusManager.cpp
    utc-Dali-Magnifier.cpp
-   utc-Dali-NinePatchMaskEffect.cpp
    utc-Dali-Popup.cpp
    utc-Dali-PushButton.cpp
    utc-Dali-RadioButton.cpp
@@ -51,6 +50,7 @@ SET(TC_SOURCES
    utc-Dali-Model3dView.cpp
    utc-Dali-ControlRenderer.cpp
    utc-Dali-RendererFactory.cpp
+   utc-Dali-DebugRenderer.cpp
    utc-Dali-ImageAtlas.cpp
 )
 
@@ -61,6 +61,7 @@ LIST(APPEND TC_SOURCES
    dali-toolkit-test-utils/toolkit-application.cpp
    dali-toolkit-test-utils/toolkit-clipboard.cpp
    dali-toolkit-test-utils/toolkit-event-thread-callback.cpp
+   dali-toolkit-test-utils/toolkit-environment-variable.cpp
    dali-toolkit-test-utils/toolkit-imf-manager.cpp
    dali-toolkit-test-utils/toolkit-physical-keyboard.cpp
    dali-toolkit-test-utils/toolkit-style-monitor.cpp
index 1e56f8d..973f24a 100644 (file)
@@ -188,7 +188,7 @@ bool TestPlatformAbstraction::WasCalled(TestFuncEnum func)
   {
     case SuspendFunc:                         return mTrace.FindMethod("Suspend");
     case ResumeFunc:                          return mTrace.FindMethod("Resume");
-    case LoadResourceFunc:                    return mTrace.FindMethod("LoadResource");
+    case LoadResourceFunc:                    return mTrace.FindMethod("LoadResource") || mTrace.FindMethod("LoadResourceSynchronously");
     case LoadFileFunc:                        return mTrace.FindMethod("LoadFile");
     case LoadShaderBinaryFileFunc:            return mTrace.FindMethod("LoadShaderBinaryFile");
     case SaveShaderBinaryFileFunc:            return mTrace.FindMethod("SaveShaderBinaryFile");
diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.cpp
new file mode 100644 (file)
index 0000000..f02bfb4
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// CLASS HEADER
+#include "toolkit-environment-variable.h"
+
+// EXTERNAL INCLUDE
+#include <cstddef>
+
+namespace Dali
+{
+
+namespace EnvironmentVariable
+{
+
+namespace
+{
+const char * gReturnValue = NULL;
+}
+
+const char * GetEnvironmentVariable( const char * variable )
+{
+  return gReturnValue;
+}
+
+void SetTestingEnvironmentVariable( bool testing)
+{
+  if( testing )
+  {
+    gReturnValue = "1";
+  }
+  else
+  {
+    gReturnValue = NULL;
+  }
+}
+
+} // namespace EnvironmentVariable
+
+} // namespace Dali
diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.h b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-environment-variable.h
new file mode 100644 (file)
index 0000000..ae968d3
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef __DALI_TOOLKIT_ENVIRONMENT_VARIABLE_H__
+#define __DALI_TOOLKIT_ENVIRONMENT_VARIABLE_H__
+
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#define __DALI_ENVIRONMENT_VARIABLE_H__
+
+#include <cstddef>
+
+namespace Dali
+{
+
+namespace EnvironmentVariable
+{
+
+const char * GetEnvironmentVariable( const char * variable );
+
+void SetTestingEnvironmentVariable( bool );
+
+} // namespace EnvironmentVariable
+
+} // namespace Dali
+
+
+#endif /* __DALI_TOOLKIT_ENVIRONMENT_VARIABLE_H__ */
index 93311ed..9f220de 100644 (file)
@@ -300,7 +300,12 @@ int UtcDaliControlSignalConnectDisconnect(void)
     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 0u, TEST_LOCATION );
     Toolkit::Internal::Control& control = Toolkit::Internal::GetImplementation( dummy );
     DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
-    DALI_TEST_CHECK( dummyImpl );
+
+    if( dummyImpl == NULL )
+    {
+      tet_result( TET_FAIL );
+      END_TEST;
+    }
 
     actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
@@ -329,7 +334,12 @@ int UtcDaliControlSignalAutomaticDisconnect(void)
     DummyControl dummy = DummyControlImpl::New();
     Toolkit::Internal::Control& control = Toolkit::Internal::GetImplementation( dummy );
     DummyControlImpl* dummyImpl = dynamic_cast<DummyControlImpl*>(&control);
-    DALI_TEST_CHECK( dummyImpl );
+
+    if( dummyImpl == NULL )
+    {
+      tet_result( TET_FAIL );
+      END_TEST;
+    }
 
     actor.OnStageSignal().Connect( dummyImpl, &DummyControlImpl::CustomSlot1 );
     DALI_TEST_EQUALS( actor.OnStageSignal().GetConnectionCount(), 1u, TEST_LOCATION );
diff --git a/automated-tests/src/dali-toolkit/utc-Dali-DebugRenderer.cpp b/automated-tests/src/dali-toolkit/utc-Dali-DebugRenderer.cpp
new file mode 100644 (file)
index 0000000..45e166c
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+#include <dali-toolkit-test-suite-utils.h>
+#include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
+#include <dali/devel-api/rendering/renderer.h>
+#include <dali/devel-api/rendering/geometry.h>
+
+#include <toolkit-environment-variable.h> // for setting environment variable: DALI_DEBUG_RENDERING
+
+using namespace Dali;
+using namespace Dali::Toolkit;
+
+namespace
+{
+const char* TEST_IMAGE_FILE_NAME =  "image_01.jpg";
+const char* TEST_NPATCH_FILE_NAME =  "image_01.9.jpg";
+
+bool IsDebugRenderer( ControlRenderer& renderer )
+{
+  bool isDebugRendererType = false;
+  bool isGeometryLineType = false;
+
+  Property::Map propertyMap;
+  renderer.CreatePropertyMap( propertyMap );
+  Property::Value* typeValue = propertyMap.Find( "rendererType",  Property::STRING );
+  if ( typeValue )
+  {
+    isDebugRendererType = ( typeValue->Get<std::string>() == "debugRenderer" );
+  }
+
+  Actor actor = Actor::New();
+  renderer.SetOnStage( actor );
+  Geometry geometry = actor.GetRendererAt( 0 ).GetGeometry();
+  isGeometryLineType = ( geometry.GetGeometryType() == Geometry::LINES );
+
+  return isDebugRendererType && isGeometryLineType;
+}
+}
+
+void dali_debug_renderer_startup(void)
+{
+  test_return_value = TET_UNDEF;
+}
+
+void dali_debug_renderer_cleanup(void)
+{
+  test_return_value = TET_PASS;
+}
+
+int UtcDaliDebugRendererGetRenderer1(void)
+{
+  EnvironmentVariable::SetTestingEnvironmentVariable(true);
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliDebugRendererGetRenderer1:  Request renderer with a Property::Map" );
+
+  RendererFactory factory = RendererFactory::Get();
+  DALI_TEST_CHECK( factory );
+
+  // Test that color renderer is replaced with debug renderer
+  Property::Map propertyMap1;
+  propertyMap1.Insert("rendererType",  "colorRenderer");
+  propertyMap1.Insert("blendColor",  Color::BLUE);
+  ControlRenderer colorRenderer = factory.GetControlRenderer(propertyMap1);
+  DALI_TEST_CHECK( colorRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( colorRenderer ) );
+
+  // Test that border renderer is replaced with debug renderer
+  Property::Map propertyMap2;
+  propertyMap2.Insert("rendererType",  "borderRenderer");
+  propertyMap2.Insert("borderColor",  Color::BLUE);
+  propertyMap2.Insert("borderSize",  2.f);
+  ControlRenderer borderRenderer = factory.GetControlRenderer(propertyMap2);
+  DALI_TEST_CHECK( borderRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( borderRenderer ) );
+
+  // Test that gradient renderer is replaced with debug renderer
+  Property::Map propertyMap3;
+  propertyMap3.Insert("rendererType",  "gradientRenderer");
+  Vector2 start(-1.f, -1.f);
+  Vector2 end(1.f, 1.f);
+  propertyMap3.Insert("gradientStartPosition",   start);
+  propertyMap3.Insert("gradientEndPosition",   end);
+  propertyMap3.Insert("gradientSpreadMethod",   "repeat");
+  Property::Array stopOffsets;
+  stopOffsets.PushBack( 0.2f );
+  stopOffsets.PushBack( 0.8f );
+  propertyMap3.Insert("gradientStopOffset",   stopOffsets);
+  Property::Array stopColors;
+  stopColors.PushBack( Color::RED );
+  stopColors.PushBack( Color::GREEN );
+  propertyMap3.Insert("gradientStopColor",   stopColors);
+  ControlRenderer gradientRenderer = factory.GetControlRenderer(propertyMap3);
+  DALI_TEST_CHECK( gradientRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( gradientRenderer ) );
+
+  // Test that image renderer is replaced with debug renderer
+  Property::Map propertyMap4;
+  propertyMap4.Insert( "rendererType",  "imageRenderer" );
+  propertyMap4.Insert( "imageUrl",  TEST_IMAGE_FILE_NAME );
+  ControlRenderer imageRenderer = factory.GetControlRenderer( propertyMap4 );
+  DALI_TEST_CHECK( imageRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( imageRenderer ) );
+
+  // Test that n patch renderer is replaced with debug renderer
+  Property::Map propertyMap5;
+  propertyMap5.Insert( "rendererType",  "nPatchRenderer" );
+  propertyMap5.Insert( "imageUrl",  TEST_NPATCH_FILE_NAME );
+  ControlRenderer nPatchRenderer = factory.GetControlRenderer( propertyMap4 );
+  DALI_TEST_CHECK( nPatchRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( nPatchRenderer ) );
+
+  EnvironmentVariable::SetTestingEnvironmentVariable(false);
+  END_TEST;
+}
+
+int UtcDaliDebugRendererGetRenderer2(void)
+{
+  EnvironmentVariable::SetTestingEnvironmentVariable(true);
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliDebugRendererGetRenderer2: Request renderer with various parameters" );
+
+  RendererFactory factory = RendererFactory::Get();
+  DALI_TEST_CHECK( factory );
+
+  // Test that color renderer is replaced with debug renderer
+  ControlRenderer colorRenderer = factory.GetControlRenderer(Color::CYAN);
+  DALI_TEST_CHECK( colorRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( colorRenderer ) );
+
+  // Test that border renderer is replaced with debug renderer
+  ControlRenderer borderRenderer = factory.GetControlRenderer(2.f, Color::GREEN);
+  DALI_TEST_CHECK( borderRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( borderRenderer ) );
+
+  // Test that image renderer is replaced with debug renderer
+  Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME);
+  ControlRenderer imageRenderer = factory.GetControlRenderer( image );
+  DALI_TEST_CHECK( imageRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( imageRenderer ) );
+
+  // Test that n patch renderer is replaced with debug renderer
+  ControlRenderer nPatchRenderer = factory.GetControlRenderer( TEST_NPATCH_FILE_NAME );
+  DALI_TEST_CHECK( nPatchRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( nPatchRenderer ) );
+
+  EnvironmentVariable::SetTestingEnvironmentVariable(false);
+  END_TEST;
+}
+
+int UtcDaliDebugRendererResetRenderer(void)
+{
+  EnvironmentVariable::SetTestingEnvironmentVariable(true);
+  ToolkitTestApplication application;
+  tet_infoline( "UtcDaliDebugRendererResetRenderer: Reset renderer with various parameters" );
+
+  RendererFactory factory = RendererFactory::Get();
+  DALI_TEST_CHECK( factory );
+
+  // Test that color renderer is replaced with debug renderer
+  ControlRenderer controlRenderer = factory.GetControlRenderer(Color::CYAN);
+  DALI_TEST_CHECK( controlRenderer );
+  DALI_TEST_CHECK( IsDebugRenderer( controlRenderer ) );
+
+  Actor actor;
+  // Reset to render another color
+  // Test that color renderer is replaced with debug renderer
+  factory.ResetRenderer( controlRenderer, actor, Color::BLUE );
+  DALI_TEST_CHECK( IsDebugRenderer( controlRenderer ) );
+
+  // Reset to render an image
+  // Test that image renderer is replaced with debug renderer
+  Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME);
+  factory.ResetRenderer( controlRenderer, actor, image );
+  DALI_TEST_CHECK( IsDebugRenderer( controlRenderer ) );
+
+  // Reset with a property map of border renderer
+  // Test that border renderer is replaced with debug renderer
+  Property::Map propertyMap;
+  propertyMap.Insert("rendererType",  "borderRenderer");
+  propertyMap.Insert("borderColor",  Color::BLUE);
+  propertyMap.Insert("borderSize",  2.f);
+  factory.ResetRenderer( controlRenderer, actor, propertyMap );
+  DALI_TEST_CHECK( IsDebugRenderer( controlRenderer ) );
+
+  EnvironmentVariable::SetTestingEnvironmentVariable(false);
+  END_TEST;
+}
index e40862c..f817d08 100644 (file)
@@ -505,3 +505,49 @@ int UtcDaliImageViewSetImageN(void)
 
   END_TEST;
 }
+
+int UtcDaliImageViewSetImageTypeChangesP(void)
+{
+  ToolkitTestApplication application;
+
+  ImageView imageView = ImageView::New();
+
+
+  std::string url;
+  Property::Map map;
+
+  Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set a URL
+  imageView.SetImage( "TEST_URL" );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( value.Get( url ) );   // Value should NOT be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set an empty Image
+  imageView.SetImage( Image() );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  // Set an Image
+  ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+  imageView.SetImage( image1 );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( value.Get( map ) );   // Value should NOT be empty
+
+  // Set an empty URL
+  imageView.SetImage( "" );
+  value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+  DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
+  DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
+
+  END_TEST;
+}
diff --git a/automated-tests/src/dali-toolkit/utc-Dali-NinePatchMaskEffect.cpp b/automated-tests/src/dali-toolkit/utc-Dali-NinePatchMaskEffect.cpp
deleted file mode 100644 (file)
index 7d76ab3..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2014 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-#include <iostream>
-#include <stdlib.h>
-
-// Need to override adaptor classes for toolkit test harness, so include
-// test harness headers before dali headers.
-#include <dali-toolkit-test-suite-utils.h>
-
-#include <dali.h>
-#include <dali-toolkit/dali-toolkit.h>
-#include <dali-toolkit/devel-api/shader-effects/nine-patch-mask-effect.h>
-
-using namespace Dali;
-
-void utc_dali_toolkit_nine_patch_startup(void)
-{
-  test_return_value = TET_UNDEF;
-}
-
-void utc_dali_toolkit_nine_patch_cleanup(void)
-{
-  test_return_value = TET_PASS;
-}
-
-
-int UtcDaliNinePatchMaskEffectApply(void)
-{
-  ToolkitTestApplication application;
-
-  BufferImage image = CreateBufferImage();
-  ImageActor actor0 = ImageActor::New( image );
-  Toolkit::NinePatchMaskEffect::Apply( actor0, "" );
-
-  Stage::GetCurrent().Add( actor0 );
-
-  application.SendNotification();   // Force usage of constraint
-  application.Render();
-
-  DALI_TEST_CHECK( actor0.GetStyle() == ImageActor::STYLE_NINE_PATCH );
-
-  ImageActor actor1 = ImageActor::New( image );
-  Vector4 border( 0, 0, 0, 0 );
-  Toolkit::NinePatchMaskEffect::Apply( actor1, "", border );
-
-  Stage::GetCurrent().Add( actor1 );
-
-  application.SendNotification();
-  application.Render();
-
-  DALI_TEST_CHECK( actor1.GetStyle() == ImageActor::STYLE_NINE_PATCH );
-  END_TEST;
-}
index d052c63..374ec6a 100644 (file)
@@ -165,8 +165,19 @@ Integration::ResourcePointer CustomizeNinePatch( TestApplication& application,
   return resourcePtr;
 }
 
-void TestControlRendererRender( ToolkitTestApplication& application, Actor& actor, ControlRenderer& controlRenderer, Integration::ResourcePointer resourcePtr = Integration::ResourcePointer(), std::size_t expectedSamplers = 0)
+void TestControlRendererRender( ToolkitTestApplication& application,
+                                Actor& actor,
+                                ControlRenderer& controlRenderer,
+                                std::size_t expectedSamplers = 0,
+                                ImageDimensions imageDimensions = ImageDimensions(),
+                                Integration::ResourcePointer resourcePtr = Integration::ResourcePointer())
 {
+  if( resourcePtr )
+  {
+    // set the image size, for test case, this needs to be set before loading started
+    application.GetPlatform().SetClosestImageSize(  Vector2(imageDimensions.GetWidth(), imageDimensions.GetHeight()) );
+  }
+
   actor.SetSize( 200.f, 200.f );
   Stage::GetCurrent().Add( actor );
   controlRenderer.SetSize( Vector2(200.f, 200.f) );
@@ -434,7 +445,7 @@ int UtcDaliRendererFactoryGetLinearGradientRenderer(void)
 
   // A lookup texture is generated and pass to shader as sampler
   Actor actor = Actor::New();
-  TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(), 1u );
+  TestControlRendererRender( application, actor, controlRenderer, 1u );
 
   controlRenderer.SetOffStage( actor );
   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
@@ -474,7 +485,7 @@ int UtcDaliRendererFactoryGetRadialGradientRenderer(void)
 
   // A lookup texture is generated and pass to shader as sampler
   Actor actor = Actor::New();
-  TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(), 1u );
+  TestControlRendererRender( application, actor, controlRenderer, 1u );
 
   Matrix3 alignMatrix( radius, 0.f, 0.f, 0.f, radius, 0.f, center.x, center.y, 1.f );
   alignMatrix.Invert();
@@ -503,7 +514,11 @@ int UtcDaliRendererFactoryGetImageRenderer1(void)
   DALI_TEST_CHECK( controlRenderer );
 
   Actor actor = Actor::New();
-  TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)), 1u );
+  // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
+  // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
+  TestControlRendererRender( application, actor, controlRenderer, 1u,
+                             ImageDimensions(512, 513),
+                             Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)));
 
   TestGlAbstraction& gl = application.GetGlAbstraction();
   int textureUnit = -1;
@@ -528,7 +543,11 @@ int UtcDaliRendererFactoryGetImageRenderer2(void)
   ControlRenderer controlRenderer = factory.GetControlRenderer( image );
 
   Actor actor = Actor::New();
-  TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)), 1u );
+  // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
+  // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
+  TestControlRendererRender( application, actor, controlRenderer, 1u,
+                             ImageDimensions(512, 513),
+                             Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)) );
 
   TestGlAbstraction& gl = application.GetGlAbstraction();
   int textureUnit = -1;
@@ -563,7 +582,9 @@ int UtcDaliRendererFactoryGetNPatchRenderer1(void)
     DALI_TEST_CHECK( controlRenderer );
 
     Actor actor = Actor::New();
-    TestControlRendererRender( application, actor, controlRenderer, ninePatchResource, 1u );
+    TestControlRendererRender( application, actor, controlRenderer, 1u,
+                               ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
+                               ninePatchResource );
 
     TestGlAbstraction& gl = application.GetGlAbstraction();
     int textureUnit = -1;
@@ -578,7 +599,9 @@ int UtcDaliRendererFactoryGetNPatchRenderer1(void)
     DALI_TEST_CHECK( controlRenderer );
 
     Actor actor = Actor::New();
-    TestControlRendererRender( application, actor, controlRenderer, ninePatchResource, 1u );
+    TestControlRendererRender( application, actor, controlRenderer, 1u,
+                               ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
+                               ninePatchResource );
 
     TestGlAbstraction& gl = application.GetGlAbstraction();
     int textureUnit = -1;
@@ -618,7 +641,9 @@ int UtcDaliRendererFactoryGetNPatchRenderer2(void)
     DALI_TEST_CHECK( controlRenderer );
 
     Actor actor = Actor::New();
-    TestControlRendererRender( application, actor, controlRenderer, ninePatchResource, 1u );
+    TestControlRendererRender( application, actor, controlRenderer, 1u,
+                               ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
+                               ninePatchResource );
 
     TestGlAbstraction& gl = application.GetGlAbstraction();
     int textureUnit = -1;
@@ -636,7 +661,9 @@ int UtcDaliRendererFactoryGetNPatchRenderer2(void)
     DALI_TEST_CHECK( controlRenderer );
 
     Actor actor = Actor::New();
-    TestControlRendererRender( application, actor, controlRenderer, ninePatchResource, 1u );
+    TestControlRendererRender( application, actor, controlRenderer, 1u,
+                               ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
+                               ninePatchResource );
 
     TestGlAbstraction& gl = application.GetGlAbstraction();
     int textureUnit = -1;
@@ -670,7 +697,9 @@ int UtcDaliRendererFactoryGetNPatchRenderer3(void)
   DALI_TEST_CHECK( controlRenderer );
 
   Actor actor = Actor::New();
-  TestControlRendererRender( application, actor, controlRenderer, ninePatchResource, 1u );
+  TestControlRendererRender( application, actor, controlRenderer, 1u,
+                             ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
+                             ninePatchResource );
 
   TestGlAbstraction& gl = application.GetGlAbstraction();
   int textureUnit = -1;
@@ -705,7 +734,9 @@ int UtcDaliRendererFactoryGetNPatchRenderer4(void)
   DALI_TEST_CHECK( controlRenderer );
 
   Actor actor = Actor::New();
-  TestControlRendererRender( application, actor, controlRenderer, ninePatchResource, 1u );
+  TestControlRendererRender( application, actor, controlRenderer, 1u,
+                             ImageDimensions(ninePatchImageWidth, ninePatchImageHeight),
+                             ninePatchResource );
 
   TestGlAbstraction& gl = application.GetGlAbstraction();
   int textureUnit = -1;
@@ -730,7 +761,9 @@ int UtcDaliRendererFactoryGetNPatchRendererN1(void)
 
   Actor actor = Actor::New();
   //The testkit still has to load a bitmap for the broken renderer image
-  TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)), 1u );
+  TestControlRendererRender( application, actor, controlRenderer, 1u,
+                             ImageDimensions(),
+                             Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)) );
 
   TestGlAbstraction& gl = application.GetGlAbstraction();
   int textureUnit = -1;
@@ -759,7 +792,9 @@ int UtcDaliRendererFactoryGetNPatchRendererN2(void)
 
   Actor actor = Actor::New();
   //The testkit still has to load a bitmap for the broken renderer image
-  TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)), 1u );
+  TestControlRendererRender( application, actor, controlRenderer, 1u,
+                             ImageDimensions(),
+                             Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)) );
 
   TestGlAbstraction& gl = application.GetGlAbstraction();
   int textureUnit = -1;
index 96ffb55..5c2d497 100644 (file)
@@ -35,7 +35,6 @@
 #include <dali-toolkit/devel-api/shader-effects/mirror-effect.h>
 #include <dali-toolkit/devel-api/shader-effects/motion-blur-effect.h>
 #include <dali-toolkit/devel-api/shader-effects/motion-stretch-effect.h>
-#include <dali-toolkit/devel-api/shader-effects/nine-patch-mask-effect.h>
 #include <dali-toolkit/devel-api/shader-effects/overlay-effect.h>
 #include <dali-toolkit/devel-api/shader-effects/quadratic-bezier.h>
 #include <dali-toolkit/devel-api/shader-effects/ripple-effect.h>
@@ -52,8 +51,33 @@ int UtcDaliCreateAlphaDiscardEffect(void)
 {
   ToolkitTestApplication application;
 
-  ShaderEffect effect = Toolkit::CreateAlphaDiscardEffect();
-  DALI_TEST_CHECK( effect );
+  Property::Map effect = Toolkit::CreateAlphaDiscardEffect();
+  DALI_TEST_CHECK( !effect.Empty() );
+
+  Property::Value* customShaderValue = effect.Find( "shader" );
+  DALI_TEST_CHECK( customShaderValue );
+
+  Property::Map customShader;
+  DALI_TEST_CHECK( customShaderValue->Get( customShader ) );
+
+  Property::Value* vertexShaderValue = customShader.Find( "vertexShader" );
+  DALI_TEST_CHECK( !vertexShaderValue );
+
+  Property::Value* fragmentShaderValue = customShader.Find( "fragmentShader" );
+  DALI_TEST_CHECK( fragmentShaderValue );
+
+  std::string fragmentShader;
+  DALI_TEST_CHECK( fragmentShaderValue->Get( fragmentShader ) );
+  DALI_TEST_CHECK( !fragmentShader.empty() );
+
+  Property::Value* gridXValue = customShader.Find( "subdivideGridX" );
+  DALI_TEST_CHECK( !gridXValue );
+
+  Property::Value* gridYValue = customShader.Find( "subdivideGridY" );
+  DALI_TEST_CHECK( !gridYValue );
+
+  Property::Value* hintsValue = customShader.Find( "hints" );
+  DALI_TEST_CHECK( !hintsValue );
 
   END_TEST;
 }
@@ -238,8 +262,33 @@ int UtcDaliCreateImageRegionEffect(void)
 {
   ToolkitTestApplication application;
 
-  ShaderEffect effect = Toolkit::CreateImageRegionEffect();
-  DALI_TEST_CHECK( effect );
+  Property::Map effect = Toolkit::CreateImageRegionEffect();
+  DALI_TEST_CHECK( !effect.Empty() );
+
+  Property::Value* customShaderValue = effect.Find( "shader" );
+  DALI_TEST_CHECK( customShaderValue );
+
+  Property::Map customShader;
+  DALI_TEST_CHECK( customShaderValue->Get( customShader ) );
+
+  Property::Value* vertexShaderValue = customShader.Find( "vertexShader" );
+  DALI_TEST_CHECK( vertexShaderValue );
+
+  std::string vertexShader;
+  DALI_TEST_CHECK( vertexShaderValue->Get( vertexShader ) );
+  DALI_TEST_CHECK( !vertexShader.empty() );
+
+  Property::Value* fragmentShaderValue = customShader.Find( "fragmentShader" );
+  DALI_TEST_CHECK( !fragmentShaderValue );
+
+  Property::Value* gridXValue = customShader.Find( "subdivideGridX" );
+  DALI_TEST_CHECK( !gridXValue );
+
+  Property::Value* gridYValue = customShader.Find( "subdivideGridY" );
+  DALI_TEST_CHECK( !gridYValue );
+
+  Property::Value* hintsValue = customShader.Find( "hints" );
+  DALI_TEST_CHECK( !hintsValue );
 
   END_TEST;
 }
index 6eaaea2..084ddcb 100644 (file)
 
 // EXTERNAL INCLUDES
 #include <dali/devel-api/adaptor-framework/singleton-service.h>
+#include <dali/devel-api/adaptor-framework/environment-variable.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/controls/renderers/renderer-factory-impl.h>
 
-
 namespace Dali
 {
 
 namespace Toolkit
 {
 
+namespace
+{
+  const char * const DALI_DEBUG_RENDERING("DALI_DEBUG_RENDERING");
+}
+
 RendererFactory RendererFactory::Get()
 {
   RendererFactory factory;
@@ -46,10 +51,17 @@ RendererFactory RendererFactory::Get()
       factory = RendererFactory( dynamic_cast<Internal::RendererFactory*>(handle.GetObjectPtr()) );
     }
 
-    if( !factory )
+    if( !factory )// If not, create the RendererFactory and register it as a singleton
     {
-      // If not, create the RendererFactory and register it as a singleton
-      factory = RendererFactory( new Internal::RendererFactory() );
+      // Check whether debug rendering is required
+      if( EnvironmentVariable::GetEnvironmentVariable( DALI_DEBUG_RENDERING ) )
+      {
+        factory = RendererFactory( new Internal::RendererFactory(true) );
+      }
+      else
+      {
+        factory = RendererFactory( new Internal::RendererFactory(false) );
+      }
       singletonService.Register( typeid(RendererFactory), factory );
 
     }
index 5d4052b..6dffc9a 100644 (file)
@@ -40,6 +40,8 @@ class RendererFactory;
 /**
  * @brief RendererFactory is a singleton object that provides and shares renderers for controls
  *
+ * By setting environment variable 'DALI_DEBUG_RENDERING', all concrete renderer is replaced with the debug renderer which renders a quad wireframe.
+ *
  * The renderer type is required in the property map for requesting a control renderer.
  *
  * | %Property Name           | Type             |
index f234c23..953c478 100755 (executable)
@@ -89,7 +89,6 @@ devel_api_shader_effects_header_files = \
   $(devel_api_src_dir)/shader-effects/mirror-effect.h \
   $(devel_api_src_dir)/shader-effects/motion-blur-effect.h \
   $(devel_api_src_dir)/shader-effects/motion-stretch-effect.h \
-  $(devel_api_src_dir)/shader-effects/nine-patch-mask-effect.h \
   $(devel_api_src_dir)/shader-effects/overlay-effect.h \
   $(devel_api_src_dir)/shader-effects/quadratic-bezier.h \
   $(devel_api_src_dir)/shader-effects/ripple-effect.h \
index 4d1e40a..0b557a0 100644 (file)
@@ -35,15 +35,19 @@ namespace Toolkit
  *
  * Usage example:
  *
- *   ImageActor actor = ImageActor::New( Image( EXAMPLE_IMAGE_PATH ) );
- *   ShaderEffect alphaDiscardEffect = CreateAlphaDiscardEffect();
- *   actor.SetShaderEffect( alphaDiscardEffect );
+ *   ImageView actor = ImageView::New( EXAMPLE_IMAGE_PATH );
+ *   Property::Map alphaDiscardEffect = CreateAlphaDiscardEffect();
+ *   actor.SetProperty( ImageView::Property::IMAGE, alphaDiscardEffect );
  *
  * @return A handle to a newly allocated ShaderEffect.
  */
-inline ShaderEffect CreateAlphaDiscardEffect()
+inline Property::Map CreateAlphaDiscardEffect()
 {
   const char* ALPHA_DISCARD_FRAGMENT_SHADER_SOURCE =
+      "varying mediump vec2 vTexCoord;                                \n"
+      "                                                               \n"
+      "uniform sampler2D sTexture;                                    \n"
+      "uniform lowp vec4 uColor;                                      \n"
       "void main()                                                    \n"
       "{                                                              \n"
       "  mediump vec4 color = texture2D( sTexture, vTexCoord );       \n"
@@ -54,9 +58,13 @@ inline ShaderEffect CreateAlphaDiscardEffect()
       "  gl_FragColor = color * uColor;                               \n"
       "}                                                              \n";
 
-  return ShaderEffect::New( "", // Use default
-                            ALPHA_DISCARD_FRAGMENT_SHADER_SOURCE );
-}
+  Property::Map map;
+
+  Property::Map customShader;
+  customShader[ "fragmentShader" ] = ALPHA_DISCARD_FRAGMENT_SHADER_SOURCE;
+
+  map[ "shader" ] = customShader;
+  return map;}
 
 } // namespace Toolkit
 
index 2bce6b3..7d263d9 100644 (file)
@@ -19,7 +19,7 @@
  */
 
 // EXTERNAL INCLUDES
-#include <dali/public-api/shader-effects/shader-effect.h>
+#include <dali/public-api/object/property-map.h>
 
 namespace Dali
 {
@@ -40,14 +40,23 @@ namespace Toolkit
  *
  * @return A handle to a newly allocated ShaderEffect
  */
-inline ShaderEffect CreateImageRegionEffect()
+inline Property::Map CreateImageRegionEffect()
 {
   std::string vertexShader(
+      "attribute mediump vec2 aPosition;\n"
+      "\n"
+      "uniform mediump mat4 uMvpMatrix;\n"
+      "uniform vec3 uSize;\n"
+      "uniform vec4 uTextureRect;"
+      "\n"
+      "varying vec2 vTexCoord;\n"
+
       "uniform mediump vec2 uTopLeft;\n"
       "uniform mediump vec2 uBottomRight;\n"
       "void main()\n"
       "{\n"
-      "  mediump vec4 position = vec4(aPosition,1.0);\n"
+      "  mediump vec4 position = vec4(aPosition, 0.0, 1.0);\n"
+      "  position.xyz *= uSize;\n"
       "  gl_Position = uMvpMatrix * position;\n"
       // The line below is doing the same as the following commented lines:
       //"  vec2 imageSize = sTextureRect.zw - sTextureRect.xy;\n"
@@ -55,15 +64,19 @@ inline ShaderEffect CreateImageRegionEffect()
       //"  vec2 bottomRight = sTextureRect.xy + uBottomRight * imageSize;\n"
       //"  vec2 texCoord = (aTexCoord - sTextureRect.xy) / imageSize;\n"
       //"  vTexCoord = topLeft + texCoord * ( bottomRight - topLeft );\n"
-      "  vTexCoord = sTextureRect.xy + uTopLeft * ( sTextureRect.zw - sTextureRect.xy ) + ( aTexCoord - sTextureRect.xy ) * ( uBottomRight - uTopLeft );\n"
+
+      "  vec2 texCoord = aPosition + vec2(0.5);\n"
+      "  vTexCoord = uTextureRect.xy + uTopLeft * ( uTextureRect.zw - uTextureRect.xy ) + ( texCoord - uTextureRect.xy ) * ( uBottomRight - uTopLeft );\n"
       "}\n"
   );
 
-  Dali::ShaderEffect shaderEffect = Dali::ShaderEffect::New( vertexShader, "" );
-  shaderEffect.SetUniform( "uTopLeft", Vector2( 0.f, 0.f ) );
-  shaderEffect.SetUniform( "uBottomRight", Vector2( 1.f, 1.f ) );
+  Property::Map map;
+
+  Property::Map customShader;
+  customShader[ "vertexShader" ] = vertexShader;
 
-  return shaderEffect;
+  map[ "shader" ] = customShader;
+  return map;
 }
 
 } // namespace Toolkit
diff --git a/dali-toolkit/devel-api/shader-effects/nine-patch-mask-effect.h b/dali-toolkit/devel-api/shader-effects/nine-patch-mask-effect.h
deleted file mode 100644 (file)
index 931e5cd..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef __DALI_TOOLKIT_NINE_PATCH_MASK_EFFECT_H__
-#define __DALI_TOOLKIT_NINE_PATCH_MASK_EFFECT_H__
-
-/*
- * Copyright (c) 2015 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.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-// EXTERNAL INCLUDES
-#include <dali/public-api/actors/image-actor.h>
-
-namespace Dali
-{
-
-namespace Toolkit
-{
-
-/**
- * @brief NinePatchMaskEffect is used to control which parts of an image are visible, using the alpha channel of a separate mask image.
- *
- * The mask image is expected to be smaller than the main image being viewed.
- * Conceptually the mask image is divided into a 3x3 grid (9 patches). The middle patch is stretched whilst the outer border is not.
- *
- * Usage example:
- *
- * @code
- *   ImageActor actor = ImageActor::New( Image( EXAMPLE_IMAGE_PATH ) );
- *   NinePatchMaskEffect::Apply( actor, MASK_IMAGE_PATH );
- * @endcode
- *
- * NinePatchMaskEffect is mutually exclusive with ImageActor::STYLE_NINE_PATCH i.e. the actor's main image should not be a nine-patch.
- */
-namespace NinePatchMaskEffect
-{
-
-static void NinePatchMaskEffectSizeConstraint( Vector2& current, const PropertyInputContainer& inputs )
-{
-  const Vector3& actorSize = inputs[0]->GetVector3();
-  current.x = actorSize.x;
-  current.y = actorSize.y;
-}
-
-inline void DoApply( ImageActor actor, const std::string& maskImage, const Vector2& maskSize, Vector4 maskBorder )
-{
-  const char* ALPHA_MASK_VERTEX_SHADER_SOURCE =
-  "precision mediump float;\n"
-  "uniform vec2 uImageSize;                                                       \n"
-  "uniform vec2 uMaskSize;                                                        \n"
-  "varying vec2 vMaskTexCoord;                                                    \n"
-  "                                                                               \n"
-  "void main()                                                                    \n"
-  "{                                                                              \n"
-  "  gl_Position = uMvpMatrix * vec4(aPosition, 1.0);                             \n"
-  "                                                                               \n"
-  "  // Ignore mask UVs for image                                                 \n"
-  "                                                                               \n"
-  "  highp vec2 halfImageSize = uImageSize * 0.5;                                 \n"
-  "  vTexCoord = (aPosition.xy + halfImageSize) / uImageSize;                     \n"
-  "                                                                               \n"
-  "  // UVs were calculated for image size, so convert for mask size              \n"
-  "                                                                               \n"
-  "  highp vec2 halfMaskSize  = uMaskSize * 0.5;                                  \n"
-  "  highp vec2 halfSizeDelta = halfImageSize - halfMaskSize;                     \n"
-  "                                                                               \n"
-  "  highp vec2 maskPosition = aPosition.xy;                                      \n"
-  "  maskPosition.x -= halfSizeDelta.x * sign(aPosition.x);                       \n"
-  "  maskPosition.y -= halfSizeDelta.y * sign(aPosition.y);                       \n"
-  "                                                                               \n"
-  "  vMaskTexCoord = (maskPosition + halfMaskSize) / uMaskSize;                   \n"
-  "}                                                                              \n";
-
-  const char* ALPHA_MASK_FRAGMENT_SHADER_SOURCE =
-  "varying mediump vec2 vMaskTexCoord;                                            \n"
-  "                                                                               \n"
-  "void main()                                                                    \n"
-  "{                                                                              \n"
-  "  highp vec4 mask = texture2D(sEffect, vMaskTexCoord);                         \n"
-  "  gl_FragColor = texture2D(sTexture, vTexCoord) * uColor * vec4(1,1,1,mask.a); \n"
-  "}                                                                              \n";
-
-  ShaderEffect maskEffect = ShaderEffect::New(
-    ALPHA_MASK_VERTEX_SHADER_SOURCE,
-    ALPHA_MASK_FRAGMENT_SHADER_SOURCE,
-    ShaderEffect::GeometryHints( ShaderEffect::HINT_BLENDING ) );
-
-  maskEffect.SetEffectImage( ResourceImage::New( maskImage ) );
-
-  maskEffect.SetUniform( "uImageSize", Vector2(0,0) /*Constrained to actor size*/ );
-
-  Constraint constraint = Constraint::New<Vector2>( maskEffect, maskEffect.GetPropertyIndex("uImageSize"), NinePatchMaskEffectSizeConstraint );
-  constraint.AddSource( Source(actor, Actor::Property::SIZE) );
-  constraint.Apply();
-
-  maskEffect.SetUniform( "uMaskSize", maskSize );
-
-  // Actor must provide nine-patch style geometry for this effect to work
-  actor.SetStyle( ImageActor::STYLE_NINE_PATCH );
-  actor.SetNinePatchBorder( maskBorder );
-
-  actor.SetShaderEffect( maskEffect );
-}
-
-/**
- * @brief Apply the mask effect to an ImageActor.
- *
- * NinePatchMaskEffect is mutually exclusive with ImageActor::STYLE_NINE_PATCH i.e. the actor's main image should not be a nine-patch.
- * @param [in] actor The actor which needs the effect. To remove the effect call actor.RemoveShaderEffect().
- * @param [in] maskImage The path to a file containing the mask. The center pixels of the mask will be stretched.
- */
-inline void Apply( ImageActor actor, const std::string& maskImage )
-{
-  const Uint16Pair maskSize = ResourceImage::GetImageSize( maskImage );
-
-  const float leftRight = (maskSize.GetWidth()  - 1.0f) * 0.5f;
-  const float topBottom = (maskSize.GetHeight() - 1.0f) * 0.5f;
-
-  DoApply( actor, maskImage, Vector2( maskSize.GetWidth(), maskSize.GetHeight() ), Vector4( leftRight, topBottom, leftRight, topBottom ) );
-}
-
-/**
- * @brief Apply the mask effect to an ImageActor.
- *
- * NinePatchMaskEffect is mutually exclusive with ImageActor::STYLE_NINE_PATCH i.e. the actor's main image should not be a nine-patch.
- * @param [in] actor The actor which needs the effect. To remove the effect call actor.RemoveShaderEffect().
- * @param [in] maskImage The path to a file containing the mask.
- * @param [in] maskBorder Specifies the part of the mask image that will be stretched (left, top, right, bottom).
- */
-inline void Apply( ImageActor actor, const std::string& maskImage, const Vector4& maskBorder )
-{
-  const Uint16Pair maskSize = ResourceImage::GetImageSize( maskImage );
-
-  DoApply( actor, maskImage, Vector2( maskSize.GetWidth(), maskSize.GetHeight() ), maskBorder );
-}
-
-} // namespace NinePatchMaskEffect
-
-} // namespace Toolkit
-
-} // namespace Dali
-
-#endif // __DALI_TOOLKIT_NINE_PATCH_MASK_EFFECT_H__
index 4548ac9..f8b0fb2 100644 (file)
@@ -30,6 +30,7 @@
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/controls/default-controls/solid-color-actor.h>
 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
 
 /**
  * Button states and contents
@@ -574,18 +575,14 @@ const Vector4 Button::GetSelectedColor() const
 
 void Button::SetUnselectedImage( const std::string& filename )
 {
-  ImageActor newContent;
+  Toolkit::ImageView newContent;
   if( !filename.empty() )
   {
-    Image resourceimage = Dali::ResourceImage::New( filename );
-    if( resourceimage )
-    {
-      newContent = ImageActor::New( resourceimage );
-    }
+    newContent = Toolkit::ImageView::New( filename );
   }
   else
   {
-    newContent = ImageActor::New();
+    newContent = Toolkit::ImageView::New();
   }
 
   if( newContent )
@@ -606,18 +603,14 @@ Actor& Button::GetUnselectedImage()
 
 void Button::SetSelectedImage( const std::string& filename )
 {
-  ImageActor newContent;
+  Toolkit::ImageView newContent;
   if( !filename.empty() )
   {
-    Image resourceimage = Dali::ResourceImage::New( filename );
-    if( resourceimage )
-    {
-      newContent = ImageActor::New( resourceimage );
-    }
+   newContent = Toolkit::ImageView::New( filename );
   }
   else
   {
-    newContent = ImageActor::New();
+    newContent = Toolkit::ImageView::New();
   }
 
   if( newContent )
@@ -638,14 +631,10 @@ Actor& Button::GetSelectedImage()
 
 void Button::SetBackgroundImage( const std::string& filename )
 {
-  Image resourceimage = Dali::ResourceImage::New( filename );
-  if( resourceimage )
-  {
-    SetupContent( mBackgroundContent, ImageActor::New( resourceimage ) );
+  SetupContent( mBackgroundContent, Toolkit::ImageView::New( filename ) );
 
-    OnBackgroundImageSet();
-    RelayoutRequest();
-  }
+  OnBackgroundImageSet();
+  RelayoutRequest();
 }
 
 Actor& Button::GetBackgroundImage()
@@ -655,14 +644,10 @@ Actor& Button::GetBackgroundImage()
 
 void Button::SetSelectedBackgroundImage( const std::string& filename )
 {
-  Image resourceimage = Dali::ResourceImage::New( filename );
-  if( resourceimage )
-  {
-    SetupContent( mSelectedBackgroundContent, ImageActor::New( resourceimage ) );
+  SetupContent( mSelectedBackgroundContent, Toolkit::ImageView::New( filename ) );
 
-    OnSelectedBackgroundImageSet();
-    RelayoutRequest();
-  }
+  OnSelectedBackgroundImageSet();
+  RelayoutRequest();
 }
 
 Actor& Button::GetSelectedBackgroundImage()
@@ -672,14 +657,10 @@ Actor& Button::GetSelectedBackgroundImage()
 
 void Button::SetDisabledImage( const std::string& filename )
 {
-  Image resourceimage = Dali::ResourceImage::New( filename );
-  if( resourceimage )
-  {
-    SetupContent( mDisabledContent, ImageActor::New( resourceimage ) );
+  SetupContent( mDisabledContent, Toolkit::ImageView::New( filename ) );
 
-    OnDisabledImageSet();
-    RelayoutRequest();
-  }
+  OnDisabledImageSet();
+  RelayoutRequest();
 }
 
 Actor& Button::GetDisabledImage()
@@ -689,14 +670,10 @@ Actor& Button::GetDisabledImage()
 
 void Button::SetDisabledSelectedImage( const std::string& filename )
 {
-  Image resourceimage = Dali::ResourceImage::New( filename );
-  if( resourceimage )
-  {
-    SetupContent( mDisabledSelectedContent, ImageActor::New( resourceimage ) );
+  SetupContent( mDisabledSelectedContent, Toolkit::ImageView::New( filename ) );
 
-    OnDisabledSelectedImageSet();
-    RelayoutRequest();
-  }
+  OnDisabledSelectedImageSet();
+  RelayoutRequest();
 }
 
 Actor& Button::GetDisabledSelectedImage()
@@ -706,14 +683,10 @@ Actor& Button::GetDisabledSelectedImage()
 
 void Button::SetDisabledBackgroundImage( const std::string& filename )
 {
-  Image resourceimage = Dali::ResourceImage::New( filename );
-  if( resourceimage )
-  {
-    SetupContent( mDisabledBackgroundContent, ImageActor::New( resourceimage ) );
+  SetupContent( mDisabledBackgroundContent, Toolkit::ImageView::New( filename ) );
 
-    OnDisabledBackgroundImageSet();
-    RelayoutRequest();
-  }
+  OnDisabledBackgroundImageSet();
+  RelayoutRequest();
 }
 
 Actor& Button::GetDisabledBackgroundImage()
@@ -1198,7 +1171,6 @@ void Button::PrepareAddButtonImage( Actor& actor )
 {
   if( actor )
   {
-    actor.Unparent();
     Self().Add( actor );
     PrepareForTranstionOut( actor );
   }
@@ -1221,7 +1193,6 @@ void Button::AddButtonImage( Actor& actor )
 {
   if( actor )
   {
-    actor.Unparent();
     Self().Add( actor );
   }
 }
index e468c0e..44d62a5 100644 (file)
 #include "check-box-button-impl.h"
 
 // EXTERNAL INCLUDES
-#include <dali/public-api/actors/image-actor.h>
 #include <dali/public-api/object/type-registry.h>
 #include <dali/public-api/images/resource-image.h>
 
 //INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/control-depth-index-ranges.h>
+#include <dali-toolkit/internal/controls/image-view/image-view-impl.h>
 #include <dali-toolkit/devel-api/shader-effects/image-region-effect.h>
 
 namespace Dali
@@ -40,8 +41,6 @@ namespace
 
 const float DISTANCE_BETWEEN_IMAGE_AND_LABEL( 5.0f );
 const float ANIMATION_TIME( 0.26f );  // EFL checkbox tick time
-// Required for the UV reveal shader to render the tick on top of the rest of the checkbox.
-const float SHADER_DEPTH_OFFSET = 1.0f;
 
 BaseHandle Create()
 {
@@ -83,6 +82,21 @@ CheckBoxButton::~CheckBoxButton()
 {
 }
 
+void CheckBoxButton::SetTickUVEffect()
+{
+  Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( mSelectedImage );
+  if( imageView )
+  {
+    imageView.RegisterProperty( "uTextureRect", Vector4(0.f, 0.f, 1.f, 1.f ) );
+    imageView.RegisterProperty( "uTopLeft", Vector2::ZERO );
+
+    Property::Map shaderMap = CreateImageRegionEffect();
+    imageView.SetProperty( Toolkit::ImageView::Property::IMAGE, shaderMap );
+
+    GetImpl( imageView ).SetDepthIndex( DECORATION_DEPTH_INDEX );
+  }
+}
+
 void CheckBoxButton::OnButtonInitialize()
 {
   // Wrap around all children
@@ -92,6 +106,9 @@ void CheckBoxButton::OnButtonInitialize()
   SetSelectedImage( SELECTED_BUTTON_IMAGE_DIR );
   SetDisabledImage( DISABLED_UNSELECTED_BUTTON_IMAGE_DIR );
   SetDisabledSelectedImage( DISABLED_SELECTED_BUTTON_IMAGE_DIR );
+
+  mSelectedImage = GetSelectedImage();
+  SetTickUVEffect();
 }
 
 void CheckBoxButton::OnLabelSet( bool noPadding )
@@ -163,19 +180,12 @@ void CheckBoxButton::PrepareForTranstionIn( Actor actor )
   if( actor == selectedImage )
   {
     actor.SetScale( Vector3( 0.0f, 1.0f, 1.0f ) );
+    actor.RegisterProperty( "uBottomRight", Vector2( 0.0f, 1.0f ) );
 
-    if( !mTickUVEffect )
+    if( mSelectedImage != selectedImage )
     {
-      mTickUVEffect = CreateImageRegionEffect();
-    }
-    mTickUVEffect.SetUniform( "uBottomRight", Vector2( 0.0f, 1.0f ) );
-
-    ImageActor imageActor = ImageActor::DownCast( actor );
-    if( imageActor )
-    {
-      // Ensure the tick effect is rendered above the reset of the checkbox.
-      imageActor.SetSortModifier( SHADER_DEPTH_OFFSET );
-      imageActor.SetShaderEffect( mTickUVEffect );
+      mSelectedImage = selectedImage;
+      SetTickUVEffect();
     }
   }
 }
@@ -186,17 +196,12 @@ void CheckBoxButton::PrepareForTranstionOut( Actor actor )
   if( actor == selectedImage )
   {
     actor.SetScale( Vector3::ONE );
+    actor.RegisterProperty( "uBottomRight", Vector2::ONE );
 
-    if( !mTickUVEffect )
+    if( mSelectedImage != selectedImage )
     {
-      mTickUVEffect = CreateImageRegionEffect();
-    }
-    mTickUVEffect.SetUniform( "uBottomRight", Vector2::ONE );
-
-    ImageActor imageActor = ImageActor::DownCast( actor );
-    if( imageActor )
-    {
-      imageActor.SetShaderEffect( mTickUVEffect );
+      mSelectedImage = selectedImage;
+      SetTickUVEffect();
     }
   }
 }
@@ -211,12 +216,9 @@ void CheckBoxButton::OnTransitionIn( Actor actor )
       Dali::Animation transitionAnimation = GetTransitionAnimation();
       if( transitionAnimation )
       {
-        DALI_ASSERT_DEBUG( mTickUVEffect );
-        if( mTickUVEffect )
-        {
-          // UV anim
-          transitionAnimation.AnimateTo( Property( mTickUVEffect, "uBottomRight" ), Vector2::ONE );
-        }
+        // UV anim
+        transitionAnimation.AnimateTo( Property( actor, "uBottomRight" ), Vector2::ONE );
+
         // Actor size anim
         transitionAnimation.AnimateTo( Property( actor, Actor::Property::SCALE_X ), 1.0f );
       }
@@ -225,9 +227,9 @@ void CheckBoxButton::OnTransitionIn( Actor actor )
     {
       //explicitly end the swipe animation
       actor.SetScale( Vector3::ONE );
-      if( mTickUVEffect )
+      if( mSelectedImage == selectedImage  )
       {
-        mTickUVEffect.SetUniform( "uBottomRight", Vector2::ONE );
+        actor.RegisterProperty( "uBottomRight", Vector2::ONE );
       }
     }
   }
index 1697001..e80b838 100644 (file)
@@ -64,6 +64,11 @@ private:
    */
   virtual ~CheckBoxButton();
 
+  /**
+   * Setup the ticking effect to the selected image.
+   */
+  void SetTickUVEffect();
+
 private: // From Button
 
 
@@ -106,7 +111,7 @@ private:
   CheckBoxButton& operator=( const CheckBoxButton& );
 
 private:
-  ShaderEffect              mTickUVEffect;         ///< ImageRegionEffect to expand the tick across
+  Actor         mSelectedImage;
 };
 
 } // namespace Internal
index 4331c87..49d84fb 100644 (file)
@@ -26,6 +26,7 @@
 #include <dali/devel-api/scripting/scripting.h>
 
 // INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
 
 namespace Dali
@@ -145,7 +146,7 @@ void PushButton::OnButtonInitialize()
 void PushButton::SetIcon( DecorationState state, const std::string iconFilename )
 {
   mIconName[ state ] = iconFilename;
-  SetDecoration( state, ImageActor::New( Dali::ResourceImage::New( iconFilename ) ) );
+  SetDecoration( state, Toolkit::ImageView::New( iconFilename  ) );
   ConfigureSizeNegotiation();
 }
 
index 59a3b33..714701a 100644 (file)
@@ -66,7 +66,9 @@ Toolkit::ImageView ImageView::New()
 
 void ImageView::SetImage( Image image )
 {
-  if( mImage != image )
+  if( ( mImage != image ) ||
+      ! mUrl.empty()      ||   // If we're changing from a URL type to an Image type
+      ! mPropertyMap.Empty() ) // If we're changing from a property map type to an Image type
   {
     mUrl.clear();
     mPropertyMap.Clear();
@@ -76,36 +78,48 @@ void ImageView::SetImage( Image image )
     Actor self = Self();
     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, image );
     mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
+
+    RelayoutRequest();
   }
 }
 
 void ImageView::SetImage( Property::Map map )
 {
+  mUrl.clear();
+  mImage.Reset();
   mPropertyMap = map;
 
   Actor self = Self();
   Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mPropertyMap );
 
-  int width = 0;
   Property::Value* widthValue = mPropertyMap.Find( "width" );
   if( widthValue )
   {
-    widthValue->Get( width );
+    int width;
+    if( widthValue->Get( width ) )
+    {
+      mImageSize = ImageDimensions( width, mImageSize.GetHeight() );
+    }
   }
 
-  int height = 0;
   Property::Value* heightValue = mPropertyMap.Find( "height" );
   if( heightValue )
   {
-    heightValue->Get( height );
+    int height;
+    if( heightValue->Get( height ) )
+    {
+      mImageSize = ImageDimensions( mImageSize.GetWidth(), height );
+    }
   }
 
-  mImageSize = ImageDimensions( width, height );
+  RelayoutRequest();
 }
 
 void ImageView::SetImage( const std::string& url, ImageDimensions size )
 {
-  if( mUrl != url )
+  if( ( mUrl != url ) ||
+      mImage          ||       // If we're changing from an Image type to a URL type
+      ! mPropertyMap.Empty() ) // If we're changing from a property map type to a URL type
   {
     mImage.Reset();
     mPropertyMap.Clear();
@@ -123,9 +137,16 @@ void ImageView::SetImage( const std::string& url, ImageDimensions size )
 
     Actor self = Self();
     Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mUrl, mImageSize );
+
+    RelayoutRequest();
   }
 }
 
+void ImageView::SetDepthIndex( int depthIndex )
+{
+  mRenderer.SetDepthIndex( depthIndex );
+}
+
 Vector3 ImageView::GetNaturalSize()
 {
   Vector3 size;
index 124ae5f..86437ff 100644 (file)
@@ -94,6 +94,15 @@ public:
    */
   static Property::Value GetProperty( BaseObject* object, Property::Index propertyIndex );
 
+  /**
+   * @brief Set the depth index of this image renderer
+   *
+   * Renderer with higher depth indices are rendered in front of other renderers with smaller values
+   *
+   * @param[in] depthIndex The depth index of this renderer
+   */
+  void SetDepthIndex( int depthIndex );
+
 private: // From Control
 
   /**
index f3e2ed1..f40290c 100644 (file)
@@ -26,6 +26,7 @@
 #include <dali/public-api/object/type-registry.h>
 #include <dali/devel-api/object/type-registry-helper.h>
 #include <dali/public-api/render-tasks/render-task-list.h>
+#include <dali/devel-api/rendering/cull-face.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/controls/page-turn-view/page-turn-effect.h>
index 7a84f4e..66eeca1 100755 (executable)
@@ -37,6 +37,7 @@
 #include <dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h>
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/public-api/controls/default-controls/solid-color-actor.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
 #include <dali-toolkit/public-api/accessibility-manager/accessibility-manager.h>
 #include <dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.h>
 
@@ -305,7 +306,7 @@ void Popup::OnInitialize()
   mPopupLayout = Toolkit::TableView::New( 3, 1 );
 
   // Adds the default background image.
-  SetPopupBackgroundImage( ImageActor::New( ResourceImage::New( DEFAULT_BACKGROUND_IMAGE_PATH ) ) );
+  SetPopupBackgroundImage( Toolkit::ImageView::New( ResourceImage::New( DEFAULT_BACKGROUND_IMAGE_PATH ) ) );
 
   mPopupLayout.SetName( "popupLayoutTable" );
   mPopupLayout.SetParentOrigin( ParentOrigin::CENTER );
@@ -849,7 +850,7 @@ void Popup::LayoutTail()
   {
     // Adds the tail actor.
     Image tail = ResourceImage::New( image );
-    mTailImage = ImageActor::New( tail );
+    mTailImage = Toolkit::ImageView::New( tail );
     mTailImage.SetName( "tailImage" );
     const Vector3 anchorPoint = AnchorPoint::BOTTOM_RIGHT - position;
     mTailImage.SetParentOrigin( position );
@@ -1227,7 +1228,7 @@ void Popup::SetProperty( BaseObject* object, Property::Index propertyIndex, cons
           Image image = ResourceImage::New( valueString );
           if( image )
           {
-            ImageActor actor = ImageActor::New( image );
+            Toolkit::ImageView actor = Toolkit::ImageView::New( image );
             popupImpl.SetPopupBackgroundImage( actor );
           }
         }
index 3b4a949..7ac2490 100644 (file)
@@ -147,11 +147,12 @@ void ControlRenderer::DoSetOffStage( Actor& actor )
 
 void ControlRenderer::CreatePropertyMap( Property::Map& map ) const
 {
+  DoCreatePropertyMap( map );
+
   if( mImpl->mCustomShader )
   {
     mImpl->mCustomShader->CreatePropertyMap( map );
   }
-  DoCreatePropertyMap( map );
 }
 
 bool ControlRenderer::GetIsOnStage() const
index 883d4d6..5e19bc2 100644 (file)
@@ -160,7 +160,7 @@ protected:
    * @param[in] actor The Actor the renderer is applied to if, empty if the renderer has not been applied to any Actor
    * @param[in] propertyMap The properties for the requested ControlRenderer object.
    */
-  virtual void DoInitialize( Actor& actor, const Property::Map& propertyMap ) = 0;
+  virtual void DoInitialize( Actor& actor, const Property::Map& propertyMap ) {};
 
 protected:
 
diff --git a/dali-toolkit/internal/controls/renderers/debug/debug-renderer.cpp b/dali-toolkit/internal/controls/renderers/debug/debug-renderer.cpp
new file mode 100644 (file)
index 0000000..c1449dc
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+// CLASS HEADER
+#include "debug-renderer.h"
+
+//INTERNAL INCLUDES
+#include <dali-toolkit/internal/controls/renderers/renderer-factory-impl.h>
+#include <dali-toolkit/internal/controls/renderers/renderer-factory-cache.h>
+#include <dali-toolkit/internal/controls/renderers/control-renderer-data-impl.h>
+
+namespace Dali
+{
+
+namespace Toolkit
+{
+
+namespace Internal
+{
+
+namespace
+{
+const char * const RENDERER_TYPE("rendererType");
+const char * const RENDERER_TYPE_VALUE("debugRenderer");
+
+const char * const POSITION_ATTRIBUTE_NAME("aPosition");
+const char * const INDEX_NAME("indices");
+
+const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
+attribute mediump vec2  aPosition;\n
+uniform   mediump mat4  uMvpMatrix;\n
+uniform   mediump vec3  uSize;\n
+\n
+void main()\n
+{\n
+  mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
+  vertexPosition.xyz *= uSize;\n
+  gl_Position = uMvpMatrix * vertexPosition;\n
+}\n
+);
+
+const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(\n
+uniform lowp vec4 uColor;\n
+\n
+void main()\n
+{\n
+  gl_FragColor = uColor;\n
+}\n
+);
+
+}
+
+
+DebugRenderer::DebugRenderer( RendererFactoryCache& factoryCache )
+: ControlRenderer( factoryCache )
+{
+}
+
+DebugRenderer::~DebugRenderer()
+{}
+
+void DebugRenderer::DoSetOnStage( Actor& actor )
+{
+  InitializeRenderer();
+}
+
+void DebugRenderer::DoCreatePropertyMap( Property::Map& map ) const
+{
+  map.Clear();
+  map.Insert( RENDERER_TYPE, RENDERER_TYPE_VALUE );
+}
+
+void DebugRenderer::InitializeRenderer()
+{
+  mImpl->mRenderer = mFactoryCache.GetDebugRenderer();
+  if( !mImpl->mRenderer )
+  {
+    Geometry geometry = CreateQuadWireframeGeometry();
+    Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
+    Material material = Material::New( shader );
+    mImpl->mRenderer = Renderer::New( geometry,
+                                      material );
+    mFactoryCache.CacheDebugRenderer( mImpl->mRenderer );
+  }
+}
+
+Geometry DebugRenderer::CreateQuadWireframeGeometry()
+{
+  const float halfWidth = 0.5f;
+  const float halfHeight = 0.5f;
+  struct QuadVertex { Vector2 position;};
+  QuadVertex quadVertexData[4] =
+  {
+      { Vector2(-halfWidth, -halfHeight) },
+      { Vector2( halfWidth, -halfHeight) },
+      { Vector2( halfWidth,  halfHeight) },
+      { Vector2(-halfWidth,  halfHeight) }
+  };
+
+  Property::Map quadVertexFormat;
+  quadVertexFormat[POSITION_ATTRIBUTE_NAME] = Property::VECTOR2;
+  PropertyBuffer quadVertices = PropertyBuffer::New( quadVertexFormat, 4 );
+  quadVertices.SetData(quadVertexData);
+
+  // Create indices
+  unsigned int indexData[10] = { 0, 1, 1, 2, 2, 3, 3, 0 };
+  Property::Map indexFormat;
+  indexFormat[INDEX_NAME] = Property::INTEGER;
+  PropertyBuffer indices = PropertyBuffer::New( indexFormat, sizeof(indexData)/sizeof(indexData[0]) );
+  indices.SetData(indexData);
+
+  // Create the geometry object
+  Geometry geometry = Geometry::New();
+  geometry.AddVertexBuffer( quadVertices );
+  geometry.SetIndexBuffer( indices );
+  geometry.SetGeometryType( Geometry::LINES );
+
+  return geometry;
+}
+
+} // namespace Internal
+
+} // namespace Toolkit
+
+} // namespace Dali
diff --git a/dali-toolkit/internal/controls/renderers/debug/debug-renderer.h b/dali-toolkit/internal/controls/renderers/debug/debug-renderer.h
new file mode 100644 (file)
index 0000000..e287a9a
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef __DALI_TOOLKIT_INTERNAL_DEBUG_RENDERER_H__
+#define __DALI_TOOLKIT_INTERNAL_DEBUG_RENDERER_H__
+
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// INTERNAL INCLUDES
+#include <dali-toolkit/internal/controls/renderers/control-renderer-impl.h>
+
+namespace Dali
+{
+
+namespace Toolkit
+{
+
+namespace Internal
+{
+
+/**
+ * The renderer which renders a wireframe outline to the control's quad for debugging
+ *
+ */
+class DebugRenderer: public ControlRenderer
+{
+public:
+
+  /**
+   * @brief Constructor.
+   *
+   * @param[in] factoryCache A pointer pointing to the RendererFactoryCache object
+   */
+  DebugRenderer( RendererFactoryCache& factoryCache );
+
+  /**
+   * @brief A reference counted object may only be deleted by calling Unreference().
+   */
+  virtual ~DebugRenderer();
+
+protected:
+
+  /**
+   * @copydoc ControlRenderer::DoSetOnStage
+   */
+  virtual void DoSetOnStage( Actor& actor );
+
+  /**
+   * @copydoc ControlRenderer::CreatePropertyMap
+   */
+  virtual void DoCreatePropertyMap( Property::Map& map ) const;
+
+
+private:
+  /**
+   * Create the geometry which presents the quad wireframe.
+   * @return The border geometry
+   */
+  Geometry CreateQuadWireframeGeometry();
+
+  /**
+   * @brief Initialise the renderer from the cache, if not available, create and save to the cache for sharing.
+   */
+  void InitializeRenderer();
+
+private:
+
+  // Undefined
+  DebugRenderer( const DebugRenderer& debugRenderer );
+
+  // Undefined
+  DebugRenderer& operator=( const DebugRenderer& debugRenderer );
+
+};
+
+} // namespace Internal
+
+} // namespace Toolkit
+
+} // namespace Dali
+
+#endif /* __DALI_TOOLKIT_INTERNAL_DEBUG_RENDERER_H__ */
index f142d59..1453b73 100644 (file)
@@ -19,6 +19,7 @@
 #include "image-renderer.h"
 
 // EXTERNAL HEADER
+#include <cstring> // for strncasecmp
 #include <dali/public-api/images/resource-image.h>
 #include <dali/integration-api/debug.h>
 
@@ -40,6 +41,9 @@ namespace Internal
 
 namespace
 {
+const char HTTP_URL[] = "http://";
+const char HTTPS_URL[] = "https://";
+
 const char * const RENDERER_TYPE("rendererType");
 const char * const RENDERER_TYPE_VALUE("imageRenderer");
 
@@ -312,35 +316,23 @@ void ImageRenderer::DoInitialize( Actor& actor, const Property::Map& propertyMap
     mDesiredSize = ImageDimensions( desiredWidth, desiredHeight );
   }
 
+  // remove old renderer if exit
   if( mImpl->mRenderer )
   {
-    //remove old renderer
-    if( actor )
+    if( actor ) //remove old renderer from actor
     {
       actor.RemoveRenderer( mImpl->mRenderer );
     }
-
-    //clean the cache
-    if( !oldImageUrl.empty() )
+    if( !oldImageUrl.empty() ) //clean old renderer from cache
     {
       CleanCache( oldImageUrl );
     }
+  }
 
-    //Initialize the renderer
-    if( !mImageUrl.empty() )
-    {
-      InitializeRenderer( mImageUrl );
-    }
-    else if( mImage )
-    {
-      InitializeRenderer( mImage );
-    }
-
-    //add the new renderer to the actor
-    if( actor && mImpl->mRenderer )
-    {
-      actor.AddRenderer( mImpl->mRenderer );
-    }
+  // if actor is on stage, create new renderer and apply to actor
+  if( actor && actor.OnStage() )
+  {
+    SetOnStage( actor );
   }
 }
 
@@ -414,37 +406,41 @@ Renderer ImageRenderer::CreateRenderer() const
 
 void ImageRenderer::InitializeRenderer( const std::string& imageUrl )
 {
-  if( mImageUrl.empty() )
+  if( imageUrl.empty() )
   {
-    mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
     return;
   }
 
+  mImageUrl = imageUrl;
   mImpl->mRenderer.Reset();
-  if( !mImpl->mCustomShader )
+
+  if( !mImpl->mCustomShader &&
+      ( strncasecmp( imageUrl.c_str(), HTTP_URL,  sizeof(HTTP_URL)  -1 ) != 0 ) && // ignore remote images
+      ( strncasecmp( imageUrl.c_str(), HTTPS_URL, sizeof(HTTPS_URL) -1 ) != 0 ) )
   {
     mImpl->mRenderer = mFactoryCache.GetRenderer( imageUrl );
     if( !mImpl->mRenderer )
     {
-        Material material = mAtlasManager.Add(mTextureRect, imageUrl, mDesiredSize, mFittingMode, mSamplingMode );
-        if( material )
-        {
-          Geometry geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) );
-          mImpl->mRenderer = Renderer::New( geometry, material );
-          SetTextureRectUniform(mTextureRect);
-        }
-        else // big image, atlasing is not applied
-        {
-          mImpl->mRenderer = CreateRenderer();
-          SetTextureRectUniform(FULL_TEXTURE_RECT);
+      Material material = mAtlasManager.Add(mTextureRect, imageUrl, mDesiredSize, mFittingMode, mSamplingMode );
+      if( material )
+      {
+        Geometry geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) );
+        mImpl->mRenderer = Renderer::New( geometry, material );
+        SetTextureRectUniform(mTextureRect);
+      }
+      else // big image, atlasing is not applied
+      {
+        mImpl->mRenderer = CreateRenderer();
+        mTextureRect = FULL_TEXTURE_RECT;
+        SetTextureRectUniform(mTextureRect);
 
-          ResourceImage image = Dali::ResourceImage::New( imageUrl );
-          image.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded );
-          Material material = mImpl->mRenderer.GetMaterial();
-          material.AddTexture( image, TEXTURE_UNIFORM_NAME );
-        }
+        ResourceImage image = Dali::ResourceImage::New( imageUrl );
+        image.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded );
+        Material material = mImpl->mRenderer.GetMaterial();
+        material.AddTexture( image, TEXTURE_UNIFORM_NAME );
+      }
 
-        mFactoryCache.SaveRenderer( imageUrl, mImpl->mRenderer );
+      mFactoryCache.SaveRenderer( imageUrl, mImpl->mRenderer );
     }
     else
     {
@@ -455,11 +451,22 @@ void ImageRenderer::InitializeRenderer( const std::string& imageUrl )
   }
   else
   {
+    // for custom shader or remote image, renderer is not cached and atlas is not applied
+
     mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
     mImpl->mRenderer = CreateRenderer();
-    ResourceImage image = Dali::ResourceImage::New( imageUrl, mDesiredSize, mFittingMode, mSamplingMode );
-    image.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded );
-    ApplyImageToSampler( image );
+    ResourceImage resourceImage = Dali::ResourceImage::New( imageUrl, mDesiredSize, mFittingMode, mSamplingMode );
+    resourceImage.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded );
+    ApplyImageToSampler( resourceImage );
+
+    // custom vertex shader does not need texture rect uniform
+    if( mImpl->mCustomShader && !mImpl->mCustomShader->mVertexShader.empty() )
+    {
+      return;
+    }
+
+    mTextureRect = FULL_TEXTURE_RECT;
+    SetTextureRectUniform( mTextureRect );
   }
 }
 
@@ -474,7 +481,13 @@ void ImageRenderer::InitializeRenderer( const Image& image )
 
   mImpl->mRenderer = CreateRenderer();
   ApplyImageToSampler( image );
-  SetTextureRectUniform( FULL_TEXTURE_RECT );
+
+  // default shader or custom shader with the default image vertex shader
+  if( !mImpl->mCustomShader || mImpl->mCustomShader->mVertexShader.empty() )
+  {
+    mTextureRect = FULL_TEXTURE_RECT;
+    SetTextureRectUniform( mTextureRect );
+  }
 }
 
 
@@ -488,22 +501,6 @@ void ImageRenderer::DoSetOnStage( Actor& actor )
   {
     InitializeRenderer( mImage );
   }
-
-  if( !GetIsFromCache() )
-  {
-    Image image = mImage;
-    if( !mImageUrl.empty() )
-    {
-      ResourceImage resourceImage = Dali::ResourceImage::New( mImageUrl, mDesiredSize, mFittingMode, mSamplingMode );
-      resourceImage.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded );
-      image = resourceImage;
-
-      // Set value to the uTextureRect uniform
-      SetTextureRectUniform( FULL_TEXTURE_RECT );
-    }
-
-    ApplyImageToSampler( image );
-  }
 }
 
 void ImageRenderer::DoSetOffStage( Actor& actor )
@@ -632,15 +629,18 @@ Shader ImageRenderer::GetImageShader( RendererFactoryCache& factoryCache )
 
 void ImageRenderer::SetImage( Actor& actor, const std::string& imageUrl, ImageDimensions size, Dali::FittingMode::Type fittingMode, Dali::SamplingMode::Type samplingMode )
 {
-  mDesiredSize = size;
-  mFittingMode = fittingMode;
-  mSamplingMode = samplingMode;
-
   if( mImageUrl != imageUrl )
   {
+    std::string oldImageUrl = mImageUrl;
+    mImageUrl = imageUrl;
+    mDesiredSize = size;
+    mFittingMode = fittingMode;
+    mSamplingMode = samplingMode;
+    mImage.Reset();
+
     if( mImpl->mRenderer )
     {
-      if( GetIsFromCache() )
+      if( GetIsFromCache() ) // if renderer is from cache, remove the old one
       {
         //remove old renderer
         if( actor )
@@ -649,31 +649,23 @@ void ImageRenderer::SetImage( Actor& actor, const std::string& imageUrl, ImageDi
         }
 
         //clean the cache
-        if( !mImageUrl.empty() )
+        if( !oldImageUrl.empty() )
         {
-          CleanCache(mImageUrl);
+          CleanCache(oldImageUrl);
         }
 
-        //Initialize the renderer
-        InitializeRenderer( imageUrl );
-
-        //add the new renderer to the actor
-        if( actor && mImpl->mRenderer )
+        if( actor && actor.OnStage() ) // if actor on stage, create a new renderer and apply to actor
         {
-          actor.AddRenderer( mImpl->mRenderer );
+          SetOnStage(actor);
         }
       }
-      else
+      else // if renderer is not from cache, reuse the same renderer and only change the texture
       {
         ResourceImage image = Dali::ResourceImage::New( imageUrl, mDesiredSize, mFittingMode, mSamplingMode );
         image.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded );
         ApplyImageToSampler( image );
       }
     }
-
-    mImageUrl = imageUrl;
-
-    mImage.Reset();
   }
 }
 
@@ -681,9 +673,11 @@ void ImageRenderer::SetImage( Actor& actor, const Image& image )
 {
   if( mImage != image )
   {
+    mImage = image;
+
     if( mImpl->mRenderer )
     {
-      if( GetIsFromCache() )
+      if( GetIsFromCache() ) // if renderer is from cache, remove the old one
       {
         //remove old renderer
         if( actor )
@@ -696,24 +690,19 @@ void ImageRenderer::SetImage( Actor& actor, const Image& image )
         {
           CleanCache(mImageUrl);
         }
+        mImageUrl.clear();
 
-        //Initialize the renderer
-        InitializeRenderer( image );
-
-        //add the new renderer to the actor
-        if( actor && mImpl->mRenderer )
+        if( actor && actor.OnStage() ) // if actor on stage, create a new renderer and apply to actor
         {
-          actor.AddRenderer( mImpl->mRenderer );
+          SetOnStage(actor);
         }
       }
-      else
+      else // if renderer is not from cache, reuse the same renderer and only change the texture
       {
         ApplyImageToSampler( image );
       }
     }
-    SetTextureRectUniform( FULL_TEXTURE_RECT );
 
-    mImage = image;
     mImageUrl.clear();
     mDesiredSize = ImageDimensions();
     mFittingMode = FittingMode::DEFAULT;
index e13e85d..70961ba 100644 (file)
@@ -308,24 +308,53 @@ Geometry NPatchRenderer::CreateGeometry()
 Shader NPatchRenderer::CreateShader()
 {
   Shader shader;
-  if( mStretchPixelsX.Size() == 1 && mStretchPixelsY.Size() == 1 )
+  if( !mImpl->mCustomShader )
   {
-    shader = mFactoryCache.GetShader( RendererFactoryCache::NINE_PATCH_SHADER );
-    if( !shader )
+    if( mStretchPixelsX.Size() == 1 && mStretchPixelsY.Size() == 1 )
+    {
+      shader = mFactoryCache.GetShader( RendererFactoryCache::NINE_PATCH_SHADER );
+      if( !shader )
+      {
+        shader = Shader::New( VERTEX_SHADER_3X3, FRAGMENT_SHADER );
+        mFactoryCache.SaveShader( RendererFactoryCache::NINE_PATCH_SHADER, shader );
+      }
+    }
+    else if( mStretchPixelsX.Size() > 0 || mStretchPixelsY.Size() > 0)
     {
-      shader = Shader::New( VERTEX_SHADER_3X3, FRAGMENT_SHADER );
-      mFactoryCache.SaveShader( RendererFactoryCache::NINE_PATCH_SHADER, shader );
+      std::stringstream vertexShader;
+      vertexShader << "#define FACTOR_SIZE_X " << mStretchPixelsX.Size() + 2 << "\n"
+                   << "#define FACTOR_SIZE_Y " << mStretchPixelsY.Size() + 2 << "\n"
+                   << VERTEX_SHADER;
+
+      shader = Shader::New( vertexShader.str(), FRAGMENT_SHADER );
     }
   }
-  else if( mStretchPixelsX.Size() > 0 || mStretchPixelsY.Size() > 0)
+  else
   {
-    std::stringstream vertexShader;
-    vertexShader << "#define FACTOR_SIZE_X " << mStretchPixelsX.Size() + 2 << "\n"
-                 << "#define FACTOR_SIZE_Y " << mStretchPixelsY.Size() + 2 << "\n"
-                 << VERTEX_SHADER;
+    const char* fragmentShader = FRAGMENT_SHADER;
+    Dali::Shader::ShaderHints hints = Dali::Shader::HINT_NONE;
 
-    shader = Shader::New( vertexShader.str(), FRAGMENT_SHADER );
+    if( !mImpl->mCustomShader->mFragmentShader.empty() )
+    {
+      fragmentShader = mImpl->mCustomShader->mFragmentShader.c_str();
+    }
+    hints = mImpl->mCustomShader->mHints;
+
+    if( mStretchPixelsX.Size() == 1 && mStretchPixelsY.Size() == 1 )
+    {
+      shader = Shader::New( VERTEX_SHADER_3X3, fragmentShader, hints );
+    }
+    else if( mStretchPixelsX.Size() > 0 || mStretchPixelsY.Size() > 0)
+    {
+      std::stringstream vertexShader;
+      vertexShader << "#define FACTOR_SIZE_X " << mStretchPixelsX.Size() + 2 << "\n"
+                   << "#define FACTOR_SIZE_Y " << mStretchPixelsY.Size() + 2 << "\n"
+                   << VERTEX_SHADER;
+
+      shader = Shader::New( vertexShader.str(), fragmentShader, hints );
+    }
   }
+
   return shader;
 }
 
index 524137a..47fd771 100644 (file)
@@ -140,6 +140,16 @@ bool RendererFactoryCache::CleanRendererCache( const std::string& key )
   return false;
 }
 
+void RendererFactoryCache::CacheDebugRenderer( Renderer& renderer )
+{
+  mDebugRenderer = renderer;
+}
+
+Renderer RendererFactoryCache::GetDebugRenderer()
+{
+  return mDebugRenderer;
+}
+
 Geometry RendererFactoryCache::CreateQuadGeometry()
 {
   const float halfWidth = 0.5f;
index d1c26ee..14ae4a5 100644 (file)
@@ -141,6 +141,16 @@ public:
    */
   bool CleanRendererCache( const std::string& key );
 
+  /**
+   * @brief Cache the debug renderer
+   */
+  void CacheDebugRenderer( Renderer& renderer );
+
+  /**
+   * @brief Request the debug renderer;
+   */
+  Renderer GetDebugRenderer();
+
 protected:
 
   /**
@@ -189,6 +199,8 @@ private:
 
   HashVector mRendererHashes;
   CachedRenderers mRenderers;
+
+  Renderer mDebugRenderer;
 };
 
 } // namespace Internal
index 0a25ffa..41b3060 100644 (file)
@@ -27,6 +27,7 @@
 // Internal HEADER
 #include <dali-toolkit/internal/controls/renderers/border/border-renderer.h>
 #include <dali-toolkit/internal/controls/renderers/color/color-renderer.h>
+#include <dali-toolkit/internal/controls/renderers/debug/debug-renderer.h>
 #include <dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.h>
 #include <dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.h>
 #include <dali-toolkit/internal/controls/renderers/image/image-renderer.h>
@@ -72,7 +73,8 @@ DALI_TYPE_REGISTRATION_END()
 
 } // namespace
 
-RendererFactory::RendererFactory()
+RendererFactory::RendererFactory( bool debugEnabled )
+:mDebugEnabled( debugEnabled )
 {
 }
 
@@ -93,6 +95,11 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Property::Ma
       mFactoryCache = new RendererFactoryCache();
     }
 
+    if( mDebugEnabled )
+    {
+      return Toolkit::ControlRenderer( new DebugRenderer( *( mFactoryCache.Get() ) ) );
+    }
+
     if( typeValue ==  COLOR_RENDERER )
     {
       rendererPtr = new ColorRenderer( *( mFactoryCache.Get() ) );
@@ -136,6 +143,11 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Vector4& col
     mFactoryCache = new RendererFactoryCache();
   }
 
+  if( mDebugEnabled )
+  {
+    return Toolkit::ControlRenderer( new DebugRenderer( *( mFactoryCache.Get() ) ) );
+  }
+
   ColorRenderer* rendererPtr = new ColorRenderer( *( mFactoryCache.Get() ) );
   rendererPtr->SetColor( color );
 
@@ -144,6 +156,11 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Vector4& col
 
 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const Vector4& color )
 {
+  if( mDebugEnabled && renderer )
+  {
+    return;
+  }
+
   if( renderer )
   {
     ColorRenderer* rendererPtr = dynamic_cast< ColorRenderer* >( &GetImplementation( renderer ) );
@@ -169,13 +186,14 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( float borderSize,
   {
     mFactoryCache = new RendererFactoryCache();
   }
-  BorderRenderer* rendererPtr = new BorderRenderer( *mFactoryCache.Get() );
 
-  if( !mFactoryCache )
+  if( mDebugEnabled )
   {
-    mFactoryCache = new RendererFactoryCache();
+    return Toolkit::ControlRenderer( new DebugRenderer( *( mFactoryCache.Get() ) ) );
   }
 
+  BorderRenderer* rendererPtr = new BorderRenderer( *mFactoryCache.Get() );
+
   rendererPtr->SetBorderSize( borderSize );
   rendererPtr->SetBorderColor( borderColor );
 
@@ -189,6 +207,11 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Image& image
     mFactoryCache = new RendererFactoryCache();
   }
 
+  if( mDebugEnabled )
+  {
+    return Toolkit::ControlRenderer( new DebugRenderer( *( mFactoryCache.Get() ) ) );
+  }
+
   NinePatchImage npatchImage = NinePatchImage::DownCast( image );
   if( npatchImage )
   {
@@ -210,8 +233,20 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Image& image
 
 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const Image& image )
 {
+  if( mDebugEnabled && renderer )
+  {
+    return;
+  }
+
   if( renderer )
   {
+    if( ! image )
+    {
+      // If the image is empty, then reset the renderer and return
+      renderer.RemoveAndReset( actor );
+      return;
+    }
+
     NinePatchImage npatchImage = NinePatchImage::DownCast( image );
     if( npatchImage )
     {
@@ -249,6 +284,11 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const std::string&
     mFactoryCache = new RendererFactoryCache();
   }
 
+  if( mDebugEnabled )
+  {
+    return Toolkit::ControlRenderer( new DebugRenderer( *( mFactoryCache.Get() ) ) );
+  }
+
   if( NinePatchImage::IsNinePatchUrl( url ) )
   {
     NPatchRenderer* rendererPtr = new NPatchRenderer( *( mFactoryCache.Get() ) );
@@ -269,9 +309,20 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const std::string&
 
 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const std::string& url, ImageDimensions size )
 {
+  if( mDebugEnabled && renderer )
+  {
+    return;
+  }
+
   if( renderer )
   {
-    if( NinePatchImage::IsNinePatchUrl( url ) )
+    if( url.empty() )
+    {
+      // If the URL is empty, then reset the renderer and return
+      renderer.RemoveAndReset( actor );
+      return;
+    }
+    else if( NinePatchImage::IsNinePatchUrl( url ) )
     {
       NPatchRenderer* rendererPtr = dynamic_cast< NPatchRenderer* >( &GetImplementation( renderer ) );
       if( rendererPtr )
@@ -302,6 +353,11 @@ void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor&
 
 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const Property::Map& propertyMap )
 {
+  if( mDebugEnabled && renderer )
+  {
+    return;
+  }
+
   if( renderer )
   {
     ControlRenderer& controlRenderer = GetImplementation( renderer );
index 9b55182..033b904 100644 (file)
@@ -49,8 +49,10 @@ public:
 
   /**
    * @brief Constructor
+   *
+   * @param[in] debugEnabled If true, use debug renderer to replace all the concrete renderer.
    */
-  RendererFactory();
+  RendererFactory( bool debugEnabled );
 
   /**
    * @copydoc Toolkit::RenderFactory::GetControlRenderer( const Property::Map& )
@@ -130,7 +132,8 @@ private:
 private:
 
   RendererFactoryCachePtr mFactoryCache;
-  ImageAtlasManagerPtr mAtlasManager;
+  ImageAtlasManagerPtr    mAtlasManager;
+  bool                    mDebugEnabled;
 };
 
 } // namespace Internal
index ff3dbb1..8d3aa64 100755 (executable)
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
 
 using namespace Dali;
 
 namespace
 {
 
-const char* DEFAULT_INDICATOR_IMAGE_PATH = DALI_IMAGE_DIR "popup_scroll.png";
-const Vector4 DEFAULT_INDICATOR_NINE_PATCH_BORDER(4.0f, 9.0f, 7.0f, 11.0f);
+const char* DEFAULT_INDICATOR_IMAGE_PATH = DALI_IMAGE_DIR "popup_scroll.9.png";
 const float MINIMUM_INDICATOR_HEIGHT(20.0f); // The minimum indicator height for the nine patch border
 const float DEFAULT_SLIDER_DEPTH(1.0f);
 const float DEFAULT_INDICATOR_SHOW_DURATION(0.5f);
@@ -204,10 +204,7 @@ void ScrollBar::SetScrollPropertySource( Handle handle, Property::Index property
 
 void ScrollBar::CreateDefaultIndicatorActor()
 {
-  Image indicatorImage = ResourceImage::New( DEFAULT_INDICATOR_IMAGE_PATH );
-  ImageActor indicator = ImageActor::New( indicatorImage );
-  indicator.SetNinePatchBorder( DEFAULT_INDICATOR_NINE_PATCH_BORDER );
-  indicator.SetStyle( ImageActor::STYLE_NINE_PATCH );
+  Toolkit::ImageView indicator = Toolkit::ImageView::New( DEFAULT_INDICATOR_IMAGE_PATH );
   indicator.SetParentOrigin( ParentOrigin::TOP_LEFT );
   indicator.SetAnchorPoint( AnchorPoint::TOP_LEFT );
 
index 1f9691d..ff9e07d 100755 (executable)
@@ -20,7 +20,6 @@
 
 // EXTERNAL INCLUDES
 #include <dali/public-api/adaptor-framework/timer.h>
-#include <dali/public-api/actors/image-actor.h>
 #include <dali/public-api/animation/constraint.h>
 #include <dali/public-api/animation/animation.h>
 #include <dali/public-api/common/dali-vector.h>
index ca94e91..cbbd166 100755 (executable)
@@ -29,6 +29,7 @@
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
 
 using namespace Dali;
 
@@ -78,13 +79,6 @@ DALI_SIGNAL_REGISTRATION(   Toolkit, Slider, "mark",
 
 DALI_TYPE_REGISTRATION_END()
 
-const float BACKING_Z = -0.1f;
-const float PROGRESS_Z = 0.1f;
-const float HANDLE_Z = 1.0f;
-const float VALUE_TEXT_INCREMENT = 0.01f;
-const float HANDLE_VALUE_DISPLAY_TEXT_Z = HANDLE_Z + VALUE_TEXT_INCREMENT;
-const float VALUE_DISPLAY_TEXT_Z = VALUE_TEXT_INCREMENT + VALUE_TEXT_INCREMENT;  // Put above HANDLE_VALUE_DISPLAY_TEXT_Z (parented to handle)
-
 const float MARK_SNAP_TOLERANCE = 0.05f; // 5% of slider width
 
 const int VALUE_VIEW_SHOW_DURATION = 1000;  // millisec
@@ -149,6 +143,11 @@ Dali::Toolkit::Slider Slider::New()
 Slider::Slider()
 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
   mState( NORMAL ),
+  mPopupImageName(""),
+  mPopupArrowImageName(""),
+  mBackingImageName(""),
+  mHandleImageName(""),
+  mProgressImageName(""),
   mDisableColor( 0.0f, 0.0f, 0.0f, 0.0f ),
   mPopupTextColor( 0.0f, 0.0f, 0.0f, 0.0f ),
   mHitRegion( 0.0f, 0.0f ),
@@ -322,7 +321,7 @@ void Slider::DisplayValue( float value, bool raiseSignals )
 
   float x = mDomain.from.x + percent * ( mDomain.to.x - mDomain.from.x );
 
-  mHandle.SetPosition( x, 0.0f, HANDLE_Z );
+  mHandle.SetX( x );
 
   // Progress bar
   if( mProgress )
@@ -383,12 +382,11 @@ Actor Slider::CreateHitRegion()
   return hitRegion;
 }
 
-ImageActor Slider::CreateBacking()
+Toolkit::ImageView Slider::CreateBacking()
 {
-  ImageActor backing = ImageActor::New();
+  Toolkit::ImageView backing = Toolkit::ImageView::New();
   backing.SetParentOrigin( ParentOrigin::CENTER );
   backing.SetAnchorPoint( AnchorPoint::CENTER );
-  backing.SetZ( BACKING_Z );
 
   return backing;
 }
@@ -397,27 +395,21 @@ void Slider::SetBackingImageName( const std::string& imageName )
 {
   if( mBacking && ( imageName.size() > 0 ) )
   {
-    Image image = ResourceImage::New( imageName );
-    mBacking.SetImage( image );
+    mBacking.SetImage( imageName );
+    mBackingImageName = imageName;
   }
 }
 
 std::string Slider::GetBackingImageName()
 {
-  if( mBacking )
-  {
-    return ResourceImage::DownCast( mBacking.GetImage() ).GetUrl();
-  }
-
-  return std::string( "" );
+  return mBackingImageName;
 }
 
-ImageActor Slider::CreateProgress()
+Toolkit::ImageView Slider::CreateProgress()
 {
-  ImageActor progress = ImageActor::New();
+  Toolkit::ImageView progress = Toolkit::ImageView::New();
   progress.SetParentOrigin( ParentOrigin::CENTER_LEFT );
   progress.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
-  progress.SetZ( PROGRESS_Z );
 
   return progress;
 }
@@ -426,19 +418,14 @@ void Slider::SetProgressImageName( const std::string& imageName )
 {
   if( mProgress && ( imageName.size() > 0 ) )
   {
-    Image image = ResourceImage::New( imageName );
-    mProgress.SetImage( image );
+    mProgress.SetImage( imageName );
+    mProgressImageName = imageName;
   }
 }
 
 std::string Slider::GetProgressImageName()
 {
-  if( mProgress )
-  {
-    return ResourceImage::DownCast( mProgress.GetImage()).GetUrl();
-  }
-
-  return std::string( "" );
+  return mProgressImageName;
 }
 
 void Slider::SetPopupImageName( const std::string& imageName )
@@ -487,22 +474,20 @@ void Slider::ResizeProgressRegion( const Vector2& region )
   }
 }
 
-ImageActor Slider::CreateHandle()
+Toolkit::ImageView Slider::CreateHandle()
 {
-  ImageActor handle = ImageActor::New();
+  Toolkit::ImageView handle = Toolkit::ImageView::New();
   handle.SetParentOrigin( ParentOrigin::CENTER_LEFT );
   handle.SetAnchorPoint( AnchorPoint::CENTER );
-  handle.SetZ( HANDLE_Z );
 
   return handle;
 }
 
-ImageActor Slider::CreatePopupArrow()
+Toolkit::ImageView Slider::CreatePopupArrow()
 {
-  ImageActor arrow = ImageActor::New();
+  Toolkit::ImageView arrow = Toolkit::ImageView::New();
   arrow.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
   arrow.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
-  arrow.SetZ( HANDLE_Z );
 
   return arrow;
 }
@@ -516,14 +501,13 @@ Toolkit::TextLabel Slider::CreatePopupText()
   textLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
   textLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
   textLabel.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, DEFAULT_POPUP_TEXT_COLOR );
-  textLabel.SetZ( VALUE_DISPLAY_TEXT_Z );
   textLabel.SetPadding( Padding( POPUP_TEXT_PADDING, POPUP_TEXT_PADDING, 0.0f, 0.0f ) );
   return textLabel;
 }
 
-ImageActor Slider::CreatePopup()
+Toolkit::ImageView Slider::CreatePopup()
 {
-  ImageActor popup = ImageActor::New();
+  Toolkit::ImageView popup = Toolkit::ImageView::New();
   popup.SetParentOrigin( ParentOrigin::TOP_CENTER );
   popup.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
   popup.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::WIDTH );
@@ -538,19 +522,14 @@ void Slider::SetHandleImageName( const std::string& imageName )
 {
   if( mHandle && ( imageName.size() > 0 ) )
   {
-    Image image = ResourceImage::New( imageName );
-    mHandle.SetImage( image );
+    mHandle.SetImage( imageName );
+    mHandleImageName = imageName;
   }
 }
 
 std::string Slider::GetHandleImageName()
 {
-  if( mHandle )
-  {
-    return ResourceImage::DownCast( mHandle.GetImage() ).GetUrl();
-  }
-
-  return std::string( "" );
+  return mHandleImageName;
 }
 
 void Slider::ResizeHandleRegion( const Vector2& region )
@@ -666,7 +645,7 @@ void Slider::CreateChildren()
 
   // Handle
   mHandle = CreateHandle();
-  mBacking.Add( mHandle );
+  mProgress.Add( mHandle );
 }
 
 void Slider::SetHitRegion( const Vector2& size )
index ea652fd..9e25fcc 100755 (executable)
@@ -27,6 +27,7 @@
 #include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/devel-api/controls/slider/slider.h>
 #include <dali-toolkit/public-api/controls/text-controls/text-label.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
 
 namespace Dali
 {
@@ -400,35 +401,35 @@ private:
    *
    * @return The backing actor
    */
-  ImageActor CreateBacking();
+  Toolkit::ImageView CreateBacking();
 
   /**
    * Create the progress backing for the slider
    *
    * @return The backing actor
    */
-  ImageActor CreateProgress();
+  Toolkit::ImageView CreateProgress();
 
   /**
    * Create the handle for the slider
    *
    * @return The created image handle
    */
-  ImageActor CreateHandle();
+  Toolkit::ImageView CreateHandle();
 
   /**
    * Create the popup arrow
    *
    * @return The created image handle
    */
-  ImageActor CreatePopupArrow();
+  Toolkit::ImageView CreatePopupArrow();
 
   /**
    * Create the popup
    *
    * @return The created image handle
    */
-  ImageActor CreatePopup();
+  Toolkit::ImageView CreatePopup();
 
   /**
    * Create the textview for the popup
@@ -681,15 +682,15 @@ private:
   Domain mDomain;                           ///< Current domain of the handle
 
   Actor mHitArea;                           ///< The input handler
-  ImageActor mBacking;                      ///< Backing image
-  ImageActor mHandle;                       ///< Slider handle
-  ImageActor mProgress;                     ///< Progress backing
   Actor mValueDisplay;                      ///< Display of the value
-  ImageActor mPopup;                        ///< Popup backing
-  ImageActor mPopupArrow;                   ///< Popup arrow backing
-
-  Toolkit::TextLabel mValueTextLabel;         //< The text value in popup
-  Toolkit::TextLabel mHandleValueTextLabel;   ///< The text value on handle
+  Toolkit::ImageView mBacking;              ///< Backing image
+  Toolkit::ImageView mHandle;               ///< Slider handle
+  Toolkit::ImageView mProgress;             ///< Progress backing
+  Toolkit::ImageView mPopup;                ///< Popup backing
+  Toolkit::ImageView mPopupArrow;           ///< Popup arrow backing
+
+  Toolkit::TextLabel mValueTextLabel;       //< The text value in popup
+  Toolkit::TextLabel mHandleValueTextLabel; ///< The text value on handle
   Vector2 mHandleLastTouchPoint;            ///< The last touch point for the handle
   Timer mValueTimer;                        ///< Timer used to hide value view
 
@@ -705,6 +706,9 @@ private:
 
   std::string mPopupImageName;      ///< Image name for popup image
   std::string mPopupArrowImageName; ///< Image name for popup arrow
+  std::string mBackingImageName;    ///< Image name for backing image
+  std::string mHandleImageName;     ///< Image name for handle image
+  std::string mProgressImageName;   ///< Image name for progress image
 
   Vector4 mDisableColor;    ///< The color to tint the slider when disabled
   Vector4 mPopupTextColor;  ///< The color of the popup text
index a30cf52..ad19367 100644 (file)
@@ -17,6 +17,7 @@ toolkit_src_files = \
    $(toolkit_src_dir)/controls/renderers/renderer-factory-impl.cpp \
    $(toolkit_src_dir)/controls/renderers/border/border-renderer.cpp \
    $(toolkit_src_dir)/controls/renderers/color/color-renderer.cpp \
+   $(toolkit_src_dir)/controls/renderers/debug/debug-renderer.cpp \
    $(toolkit_src_dir)/controls/renderers/image/image-renderer.cpp \
    $(toolkit_src_dir)/controls/renderers/npatch/npatch-renderer.cpp \
    $(toolkit_src_dir)/controls/renderers/gradient/gradient.cpp \
index a950b35..1e55ba0 100644 (file)
@@ -34,6 +34,7 @@
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/controls/control.h>
 #include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
 #include <dali-toolkit/public-api/accessibility-manager/accessibility-manager.h>
 #include <dali-toolkit/devel-api/focus-manager/keyinput-focus-manager.h>
 
@@ -55,8 +56,7 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_KEY
 
 const char* const IS_FOCUS_GROUP_PROPERTY_NAME = "isKeyboardFocusGroup"; // This property will be replaced by a flag in Control.
 
-const char* const FOCUS_BORDER_IMAGE_PATH = DALI_IMAGE_DIR "keyboard_focus.png";
-const Vector4 FOCUS_BORDER_IMAGE_BORDER = Vector4(7.0f, 7.0f, 7.0f, 7.0f);
+const char* const FOCUS_BORDER_IMAGE_PATH = DALI_IMAGE_DIR "keyboard_focus.9.png";
 
 BaseHandle Create()
 {
@@ -457,12 +457,8 @@ Actor KeyboardFocusManager::GetFocusIndicatorActor()
 void KeyboardFocusManager::CreateDefaultFocusIndicatorActor()
 {
   // Create a focus indicator actor shared by all the keyboard focusable actors
-  Image borderImage = ResourceImage::New(FOCUS_BORDER_IMAGE_PATH);
-
-  ImageActor focusIndicator = ImageActor::New(borderImage);
+  Toolkit::ImageView focusIndicator = Toolkit::ImageView::New(FOCUS_BORDER_IMAGE_PATH);
   focusIndicator.SetPositionInheritanceMode( Dali::USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
-  focusIndicator.SetStyle( ImageActor::STYLE_NINE_PATCH );
-  focusIndicator.SetNinePatchBorder(FOCUS_BORDER_IMAGE_BORDER);
   focusIndicator.SetPosition(Vector3(0.0f, 0.0f, 1.0f));
 
   // Apply size constraint to the focus indicator
index 5d3976c..757eb4e 100644 (file)
@@ -435,6 +435,7 @@ struct Decorator::Impl : public ConnectionTracker
     if( mActiveCopyPastePopup )
     {
       ShowPopup();
+      mPopupSetNewPosition = true;
     }
     else
     {
@@ -1872,7 +1873,7 @@ const Vector4& Decorator::GetHandleColor() const
 
 void Decorator::SetPosition( HandleType handleType, float x, float y, float height )
 {
-  // Adjust grab handle displacement
+  // Adjust handle's displacement
   Impl::HandleImpl& handle = mImpl->mHandle[handleType];
 
   handle.grabDisplacementX -= x - handle.position.x;
index 5592589..4cb19ed 100644 (file)
@@ -720,6 +720,13 @@ Actor AtlasRenderer::Render( Text::ViewInterface& view, int depth )
                       positions,
                       glyphs,
                       depth );
+
+    /* In the case where AddGlyphs does not create a renderable Actor for example when glyphs are all whitespace create a new Actor.  */
+    /* This renderable actor is used to position the text, other "decorations" can rely on there always being an Actor regardless of it is whitespace or regular text*/
+    if ( !mImpl->mActor )
+    {
+      mImpl->mActor = Actor::New();
+    }
   }
 
   return mImpl->mActor;
index b262e99..ccd64db 100644 (file)
@@ -485,7 +485,7 @@ void Controller::Impl::GetDefaultFonts( Vector<FontRun>& fonts, Length numberOfC
 {
   if( mFontDefaults )
   {
-    DALI_LOG_INFO( gLogFilter, Debug::Concise, "Controller::GetDefaultFonts font family(%s)\n", mFontDefaults->mFontDescription.family.c_str() );
+    DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::GetDefaultFonts font family(%s)\n", mFontDefaults->mFontDescription.family.c_str() );
     FontRun fontRun;
     fontRun.characterRun.characterIndex = 0;
     fontRun.characterRun.numberOfCharacters = numberOfCharacters;
@@ -630,6 +630,8 @@ void Controller::Impl::OnPanEvent( const Event& event )
 
 void Controller::Impl::OnLongPressEvent( const Event& event )
 {
+  DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::OnLongPressEvent\n" );
+
   if  ( EventData::EDITING == mEventData->mState )
   {
     ChangeState ( EventData::EDITING_WITH_POPUP );
@@ -708,7 +710,10 @@ void Controller::Impl::OnHandleEvent( const Event& event )
     {
       mEventData->mUpdateCursorPosition = true;
 
-      ChangeState( EventData::EDITING_WITH_POPUP );
+      if ( !IsClipboardEmpty() )
+      {
+        ChangeState( EventData::EDITING_WITH_PASTE_POPUP ); // Moving grabhandle will show Paste Popup
+      }
 
       if( handleStopScrolling )
       {
@@ -865,6 +870,8 @@ void Controller::Impl::OnSelectEvent( const Event& event )
 
 void Controller::Impl::OnSelectAllEvent()
 {
+  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "OnSelectAllEvent mEventData->mSelectionEnabled%s \n", mEventData->mSelectionEnabled?"true":"false");
+
   if( NULL == mEventData )
   {
     // Nothing to do if there is no text.
@@ -1179,7 +1186,7 @@ void Controller::Impl::SetPopupButtons()
       buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::SELECT_ALL ) );
     }
   }
-  else if  ( EventData::EDITING_WITH_POPUP == mEventData->mState )
+  else if ( EventData::EDITING_WITH_POPUP == mEventData->mState )
   {
     if ( mLogicalModel->mText.Count() && !IsShowingPlaceholderText())
     {
@@ -1192,6 +1199,14 @@ void Controller::Impl::SetPopupButtons()
       buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::CLIPBOARD ) );
     }
   }
+  else if ( EventData::EDITING_WITH_PASTE_POPUP == mEventData->mState )
+  {
+    if ( !IsClipboardEmpty() )
+    {
+      buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::PASTE ) );
+      buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::CLIPBOARD ) );
+    }
+  }
 
   mEventData->mDecorator->SetEnabledPopupButtons( buttonsToShow );
 }
@@ -1204,6 +1219,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     return;
   }
 
+  DALI_LOG_INFO( gLogFilter, Debug::General, "ChangeState state:%d  newstate:%d\n", mEventData->mState, newState );
+
   if( mEventData->mState != newState )
   {
     mEventData->mState = newState;
@@ -1262,6 +1279,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     }
     else if( EventData::EDITING_WITH_POPUP == mEventData->mState )
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_POPUP \n", newState );
+
       mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
       if( mEventData->mCursorBlinkEnabled )
       {
@@ -1286,6 +1305,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     }
     else if( EventData::EDITING_WITH_GRAB_HANDLE == mEventData->mState )
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_GRAB_HANDLE \n", newState );
+
       mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
       if( mEventData->mCursorBlinkEnabled )
       {
@@ -1317,6 +1338,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     }
     else if ( EventData::GRAB_HANDLE_PANNING == mEventData->mState )
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "GRAB_HANDLE_PANNING \n", newState );
+
       mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
       if( mEventData->mCursorBlinkEnabled )
       {
@@ -1331,6 +1354,28 @@ void Controller::Impl::ChangeState( EventData::State newState )
       }
       mEventData->mDecoratorUpdated = true;
     }
+    else if ( EventData::EDITING_WITH_PASTE_POPUP == mEventData->mState )
+    {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_PASTE_POPUP \n", newState );
+
+      mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
+      if( mEventData->mCursorBlinkEnabled )
+      {
+        mEventData->mDecorator->StartCursorBlink();
+      }
+
+      mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true );
+      mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false );
+      mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false );
+
+      if( mEventData->mGrabHandlePopupEnabled )
+      {
+        SetPopupButtons();
+        mEventData->mDecorator->SetPopupActive( true );
+      }
+      HideClipboard();
+      mEventData->mDecoratorUpdated = true;
+    }
   }
 }
 
@@ -1386,26 +1431,22 @@ void Controller::Impl::FindSelectionIndices( float visualX, float visualY, Chara
 
   startIndex = hitCharacter;
   endIndex = hitCharacter;
+  bool isHitCharacterWhitespace = TextAbstraction::IsWhiteSpace( mLogicalModel->mText[hitCharacter] );
 
-  if( !TextAbstraction::IsWhiteSpace( mLogicalModel->mText[hitCharacter] ) )
+  // Find the start and end of the text
+  for( startIndex = hitCharacter; startIndex > 0; --startIndex )
   {
-    // Find the start and end of the text
-    for( startIndex = hitCharacter; startIndex > 0; --startIndex )
+    if( isHitCharacterWhitespace != TextAbstraction::IsWhiteSpace( mLogicalModel->mText[ startIndex-1 ] ) )
     {
-      Character charCode = mLogicalModel->mText[ startIndex-1 ];
-      if( TextAbstraction::IsWhiteSpace( charCode ) )
-      {
-        break;
-      }
+      break;
     }
-    const CharacterIndex pastTheEnd = mLogicalModel->mText.Count();
-    for( endIndex = hitCharacter + 1u; endIndex < pastTheEnd; ++endIndex )
+  }
+  const CharacterIndex pastTheEnd = mLogicalModel->mText.Count();
+  for( endIndex = hitCharacter + 1u; endIndex < pastTheEnd; ++endIndex )
+  {
+    if( isHitCharacterWhitespace != TextAbstraction::IsWhiteSpace( mLogicalModel->mText[ endIndex ] ) )
     {
-      Character charCode = mLogicalModel->mText[ endIndex ];
-      if( TextAbstraction::IsWhiteSpace( charCode ) )
-      {
-        break;
-      }
+      break;
     }
   }
 }
@@ -1858,10 +1899,7 @@ void Controller::Impl::UpdateCursorPosition( const CursorInfo& cursorInfo )
   }
 
   // Set which cursors are active according the state.
-  if( ( EventData::EDITING == mEventData->mState )                  ||
-      ( EventData::EDITING_WITH_POPUP == mEventData->mState )       ||
-      ( EventData::EDITING_WITH_GRAB_HANDLE == mEventData->mState ) ||
-      ( EventData::GRAB_HANDLE_PANNING == mEventData->mState ) )
+  if( EventData::IsEditingState( mEventData->mState ) || ( EventData::GRAB_HANDLE_PANNING == mEventData->mState ) )
   {
     if( cursorInfo.isSecondaryCursor )
     {
@@ -1891,7 +1929,7 @@ void Controller::Impl::UpdateSelectionHandle( HandleType handleType,
 
   const Vector2 cursorPosition = cursorInfo.primaryPosition + mEventData->mScrollPosition + mAlignmentOffset;
 
-  // Sets the grab handle position.
+  // Sets the handle's position.
   mEventData->mDecorator->SetPosition( handleType,
                                        cursorPosition.x,
                                        cursorPosition.y,
index 2e2c240..0f5149d 100644 (file)
@@ -107,6 +107,7 @@ struct EventData
     EDITING,
     EDITING_WITH_POPUP,
     EDITING_WITH_GRAB_HANDLE,
+    EDITING_WITH_PASTE_POPUP,
     GRAB_HANDLE_PANNING,
     SELECTION_HANDLE_PANNING
   };
@@ -115,6 +116,11 @@ struct EventData
 
   ~EventData();
 
+  static bool IsEditingState( State stateToCheck )
+  {
+    return ( stateToCheck == EDITING || stateToCheck == EDITING_WITH_POPUP || stateToCheck == EDITING_WITH_GRAB_HANDLE || stateToCheck == EDITING_WITH_PASTE_POPUP );
+  }
+
   DecoratorPtr       mDecorator;               ///< Pointer to the decorator.
   ImfManager         mImfManager;              ///< The Input Method Framework Manager.
   std::string        mPlaceholderTextActive;   ///< The text to display when the TextField is empty with key-input focus.
@@ -506,6 +512,7 @@ struct Controller::Impl
 
   bool mRecalculateNaturalSize:1;          ///< Whether the natural size needs to be recalculated.
   bool mUserDefinedFontFamily:1;           ///< Whether the Font family was set by the user instead of being left as sytem default.
+
 };
 
 } // namespace Text
index f7958ff..592bc12 100644 (file)
@@ -90,7 +90,8 @@ void Controller::SetText( const std::string& text )
     // If popup shown then hide it by switching to Editing state
     if( ( EventData::SELECTING == mImpl->mEventData->mState )          ||
         ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
-        ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) )
+        ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) ||
+        ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState ) )
     {
       mImpl->ChangeState( EventData::EDITING );
     }
@@ -843,9 +844,7 @@ void Controller::ResetCursorPosition( CharacterIndex cursorIndex )
     mImpl->mEventData->mPrimaryCursorPosition = cursorIndex;
 
     // Update the cursor if it's in editing mode.
-    if( ( EventData::EDITING == mImpl->mEventData->mState )            ||
-        ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
-        ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) )
+    if ( EventData::IsEditingState( mImpl->mEventData->mState )  )
     {
       mImpl->mEventData->mUpdateCursorPosition = true;
     }
@@ -898,9 +897,7 @@ void Controller::TextInsertedEvent()
                                                            REORDER );
 
   // Queue a cursor reposition event; this must wait until after DoRelayout()
-  if( ( EventData::EDITING == mImpl->mEventData->mState )            ||
-      ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
-      ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) )
+  if ( EventData::IsEditingState( mImpl->mEventData->mState )  )
   {
     mImpl->mEventData->mUpdateCursorPosition = true;
     mImpl->mEventData->mScrollAfterUpdatePosition = true;
@@ -1505,33 +1502,48 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
 
   if( NULL != mImpl->mEventData )
   {
+    DALI_LOG_INFO( gLogFilter, Debug::Concise, "TapEvent state:%d \n", mImpl->mEventData->mState );
+
     if( 1u == tapCount )
     {
       // This is to avoid unnecessary relayouts when tapping an empty text-field
       bool relayoutNeeded( false );
 
-      if( mImpl->IsShowingRealText() &&
-          EventData::EDITING == mImpl->mEventData->mState )
+      if ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState || EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState )
+      {
+        mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE);  // If Popup shown hide it here so can be shown again if required.
+      }
+
+      if( mImpl->IsShowingRealText() && ( EventData::INACTIVE !=  mImpl->mEventData->mState ) )
       {
-        // Show grab handle on second tap
-        mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
+        // Already in an active state so show a popup
+        if ( !mImpl->IsClipboardEmpty() )
+        {
+          // Shows Paste popup but could show full popup with Selection options. ( EDITING_WITH_POPUP )
+          mImpl->ChangeState( EventData::EDITING_WITH_PASTE_POPUP );
+        }
+        else
+        {
+          mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
+        }
         relayoutNeeded = true;
       }
-      else if( EventData::EDITING                  != mImpl->mEventData->mState &&
-               EventData::EDITING_WITH_GRAB_HANDLE != mImpl->mEventData->mState )
+      else
       {
         if( mImpl->IsShowingPlaceholderText() &&  !mImpl->IsFocusedPlaceholderAvailable() )
         {
           // Hide placeholder text
           ResetText();
         }
-        // Show cursor on first tap
-        mImpl->ChangeState( EventData::EDITING );
-        relayoutNeeded = true;
-      }
-      else if( mImpl->IsShowingRealText() )
-      {
-        // Move the cursor
+
+        if ( EventData::INACTIVE == mImpl->mEventData->mState )
+        {
+          mImpl->ChangeState( EventData::EDITING );
+        }
+        else if ( !mImpl->IsClipboardEmpty() )
+        {
+          mImpl->ChangeState( EventData::EDITING_WITH_POPUP );
+        }
         relayoutNeeded = true;
       }
 
@@ -1562,6 +1574,7 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
 }
 
 void Controller::PanEvent( Gesture::State state, const Vector2& displacement )
+        // Show cursor and grabhandle on first tap, this matches the behaviour of tapping when already editing
 {
   DALI_ASSERT_DEBUG( mImpl->mEventData && "Unexpected PanEvent" );
 
@@ -1619,6 +1632,8 @@ void Controller::LongPressEvent( Gesture::State state, float x, float y  )
 
 void Controller::SelectEvent( float x, float y, bool selectAll )
 {
+  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SelectEvent\n" );
+
   if( mImpl->mEventData )
   {
     mImpl->ChangeState( EventData::SELECTING );
index b37b4fb..649946c 100644 (file)
@@ -399,6 +399,23 @@ const std::string& Control::GetStyleName() const
   return mImpl->mStyleName;
 }
 
+void Control::UpdateBackgroundState()
+{
+  // Set the depth of the background renderer after creating/modifying it.
+  // We do this regardless of whether or not it is on stage as the index
+  // is relative and still valid if this control is re-parented.
+  if( mImpl->mBackgroundRenderer )
+  {
+    mImpl->mBackgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
+
+    Actor self( Self() );
+    if( self.OnStage() )
+    {
+      mImpl->mBackgroundRenderer.SetOnStage( self );
+    }
+  }
+}
+
 void Control::SetBackgroundColor( const Vector4& color )
 {
   Actor self( Self() );
@@ -411,13 +428,9 @@ void Control::SetBackgroundColor( const Vector4& color )
   else
   {
     mImpl->mBackgroundRenderer = factory.GetControlRenderer( color );
-
-    if( self.OnStage() )
-    {
-      mImpl->mBackgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
-      mImpl->mBackgroundRenderer.SetOnStage( self );
-    }
   }
+
+  UpdateBackgroundState();
 }
 
 Vector4 Control::GetBackgroundColor() const
@@ -441,12 +454,7 @@ void Control::SetBackground(const Property::Map& map)
   Toolkit::RendererFactory factory = Toolkit::RendererFactory::Get();
   mImpl->mBackgroundRenderer = factory.GetControlRenderer( map );
 
-  // mBackgroundRenderer might be empty, if an invalid map is provided, no background.
-  if( self.OnStage() && mImpl->mBackgroundRenderer)
-  {
-    mImpl->mBackgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
-    mImpl->mBackgroundRenderer.SetOnStage( self );
-  }
+  UpdateBackgroundState();
 }
 
 void Control::SetBackgroundImage( Image image )
@@ -461,13 +469,9 @@ void Control::SetBackgroundImage( Image image )
   else
   {
     mImpl->mBackgroundRenderer = factory.GetControlRenderer( image );
-
-    if( self.OnStage() )
-    {
-      mImpl->mBackgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
-      mImpl->mBackgroundRenderer.SetOnStage( self );
-    }
   }
+
+  UpdateBackgroundState();
 }
 
 void Control::ClearBackground()
@@ -798,17 +802,16 @@ void Control::OnStageConnection( int depth )
 {
   if( mImpl->mBackgroundRenderer)
   {
-    mImpl->mBackgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX );
-    Actor self(Self());
+    Actor self( Self() );
     mImpl->mBackgroundRenderer.SetOnStage( self );
   }
 }
 
 void Control::OnStageDisconnection()
 {
-  if( mImpl->mBackgroundRenderer)
+  if( mImpl->mBackgroundRenderer )
   {
-    Actor self(Self());
+    Actor self( Self() );
     mImpl->mBackgroundRenderer.SetOffStage( self );
   }
 }
index aa86d6a..c6b3b5e 100644 (file)
@@ -268,6 +268,15 @@ public:
    */
   DALI_INTERNAL bool EmitKeyEventSignal( const KeyEvent& event );
 
+private:
+
+  /**
+   * Sets up the background image/color based on the current state.
+   * This will set the depth index (always), and add to stage if the control is on stage.
+   *
+   */
+  void UpdateBackgroundState();
+
 protected: // For derived classes to call
 
   /**
index 8c408e9..6408c19 100644 (file)
@@ -65,8 +65,14 @@ ImageView ImageView::New( Image image )
   return ImageView( imageView );
 }
 
-ImageView ImageView::New( const std::string& url,
-                          ImageDimensions size)
+ImageView ImageView::New( const std::string& url )
+{
+  ImageView imageView = Internal::ImageView::New();
+  imageView.SetImage( url, ImageDimensions() );
+  return imageView;
+}
+
+ImageView ImageView::New( const std::string& url, ImageDimensions size )
 {
   ImageView imageView = Internal::ImageView::New();
   imageView.SetImage( url, size );
@@ -83,8 +89,12 @@ void ImageView::SetImage( Image image )
   Dali::Toolkit::GetImpl( *this ).SetImage( image );
 }
 
-void ImageView::SetImage( const std::string& url,
-                          ImageDimensions size )
+void ImageView::SetImage( const std::string& url )
+{
+  Dali::Toolkit::GetImpl( *this ).SetImage( url, ImageDimensions() );
+}
+
+void ImageView::SetImage( const std::string& url, ImageDimensions size )
 {
   Dali::Toolkit::GetImpl( *this ).SetImage( url, size );
 }
index 4a7545e..f3b5416 100644 (file)
@@ -77,32 +77,47 @@ public:
    * @brief Create an initialized ImageView.
    *
    * @return A handle to a newly allocated Dali ImageView.
+   *
+   * @note ImageView will not display anything.
    */
   static ImageView New();
 
   /**
    * @brief Create an initialized ImageView from an Image.
    *
-   * If the handle is empty, ImageView will display nothing
+   * If the handle is empty, ImageView will not display anything.
+   *
    * @param[in] image The Image to display.
    * @return A handle to a newly allocated ImageView.
    */
   static ImageView New( Image image );
 
   /**
-   * @brief Create an initialized ImageView from an Image resource url
+   * @brief Create an initialized ImageView from an Image resource URL
    *
-   * @note A valid size is preferable for efficiency.
-   *       However, do not set size that is bigger than the actual image size, as the up-scaling is not available,
-   *       the content of the area not covered by actual image is undefined, it will not be cleared.
+   * If the string is empty, ImageView will not display anything.
+   *
+   * @param[in] url The url of the image resource to display.
+   * @return A handle to a newly allocated ImageView.
+   */
+  static ImageView New( const std::string& url );
+
+  /**
+   * @brief Create an initialized ImageView from an Image resource URL
+   *
+   * If the string is empty, ImageView will not display anything.
+   *
+   * @since DALi 1.1.10
    *
-   * If the string is empty, ImageView will display nothing
    * @param[in] url The url of the image resource to display.
    * @param [in] size The width and height to fit the loaded image to.
    * @return A handle to a newly allocated ImageView.
+   *
+   * @note A valid size is preferable for efficiency.
+   *       However, do not set a size that is bigger than the actual image size, as up-scaling is not available.
+   *       The content of the area not covered by the actual image is undefined and will not be cleared.
    */
-  static ImageView New( const std::string& url,
-                        ImageDimensions size = ImageDimensions() );
+  static ImageView New( const std::string& url, ImageDimensions size );
 
   /**
    * @brief Destructor
@@ -146,17 +161,27 @@ public:
   void SetImage( Image image );
 
   /**
-   * @brief Sets this ImageView from an Image url
+   * @brief Sets this ImageView from an Image URL
    *
-   * If the handle is empty, ImageView will display nothing
+   * If the URL is empty, ImageView will not display anything.
    *
    * @since DALi 1.1.4
    *
    * @param[in] url The Image resource to display.
+   */
+  void SetImage( const std::string& url );
+
+  /**
+   * @brief Sets this ImageView from an Image URL
+   *
+   * If the URL is empty, ImageView will not display anything.
+   *
+   * @since DALi 1.1.10
+   *
+   * @param[in] url A URL to the image resource to display.
    * @param [in] size The width and height to fit the loaded image to.
    */
-  void SetImage( const std::string& url,
-                 ImageDimensions size = ImageDimensions() );
+  void SetImage( const std::string& url, ImageDimensions size );
 
   /**
    * @deprecated Gets the Image
index 6e6c267..7bbdf3e 100644 (file)
@@ -31,7 +31,7 @@ namespace Toolkit
 
 const unsigned int TOOLKIT_MAJOR_VERSION = 1;
 const unsigned int TOOLKIT_MINOR_VERSION = 1;
-const unsigned int TOOLKIT_MICRO_VERSION = 10;
+const unsigned int TOOLKIT_MICRO_VERSION = 11;
 const char * const TOOLKIT_BUILD_DATE    = __DATE__ " " __TIME__;
 
 #ifdef DEBUG_ENABLED
similarity index 85%
rename from dali-toolkit/styles/images-common/keyboard_focus.png
rename to dali-toolkit/styles/images-common/keyboard_focus.9.png
index de7e051..5590f15 100644 (file)
Binary files a/dali-toolkit/styles/images-common/keyboard_focus.png and b/dali-toolkit/styles/images-common/keyboard_focus.9.png differ
diff --git a/dali-toolkit/styles/images-common/popup_scroll.9.png b/dali-toolkit/styles/images-common/popup_scroll.9.png
new file mode 100644 (file)
index 0000000..2ffc3a7
Binary files /dev/null and b/dali-toolkit/styles/images-common/popup_scroll.9.png differ
diff --git a/dali-toolkit/styles/images-common/popup_scroll.png b/dali-toolkit/styles/images-common/popup_scroll.png
deleted file mode 100755 (executable)
index 1dc8fc0..0000000
Binary files a/dali-toolkit/styles/images-common/popup_scroll.png and /dev/null differ
diff --git a/docs/content/images/background/BackgroundBorder.png b/docs/content/images/background/BackgroundBorder.png
new file mode 100644 (file)
index 0000000..e580281
Binary files /dev/null and b/docs/content/images/background/BackgroundBorder.png differ
diff --git a/docs/content/images/debug-renderer/debug-blocks.png b/docs/content/images/debug-renderer/debug-blocks.png
new file mode 100644 (file)
index 0000000..5c86f29
Binary files /dev/null and b/docs/content/images/debug-renderer/debug-blocks.png differ
diff --git a/docs/content/images/text-controls/EmptyTextAndNoContentToPaste.png b/docs/content/images/text-controls/EmptyTextAndNoContentToPaste.png
new file mode 100644 (file)
index 0000000..5a007c1
Binary files /dev/null and b/docs/content/images/text-controls/EmptyTextAndNoContentToPaste.png differ
diff --git a/docs/content/images/text-controls/EmptyTextClipboardHasContent.png b/docs/content/images/text-controls/EmptyTextClipboardHasContent.png
new file mode 100644 (file)
index 0000000..5f29f75
Binary files /dev/null and b/docs/content/images/text-controls/EmptyTextClipboardHasContent.png differ
diff --git a/docs/content/images/text-controls/SelectAllWhitespace.png b/docs/content/images/text-controls/SelectAllWhitespace.png
new file mode 100644 (file)
index 0000000..30e326a
Binary files /dev/null and b/docs/content/images/text-controls/SelectAllWhitespace.png differ
diff --git a/docs/content/images/text-controls/SelectWhitespaceAfterText.png b/docs/content/images/text-controls/SelectWhitespaceAfterText.png
new file mode 100644 (file)
index 0000000..c0d2fad
Binary files /dev/null and b/docs/content/images/text-controls/SelectWhitespaceAfterText.png differ
diff --git a/docs/content/images/text-controls/SelectingText.png b/docs/content/images/text-controls/SelectingText.png
new file mode 100644 (file)
index 0000000..44a2ccb
Binary files /dev/null and b/docs/content/images/text-controls/SelectingText.png differ
diff --git a/docs/content/images/text-controls/TapAfterCopyingText.png b/docs/content/images/text-controls/TapAfterCopyingText.png
new file mode 100644 (file)
index 0000000..eaa260b
Binary files /dev/null and b/docs/content/images/text-controls/TapAfterCopyingText.png differ
index 920c5db..7bd9936 100644 (file)
@@ -30,6 +30,7 @@
   + [Event Handling](@ref event-system)
   + [Layouting](@ref size-negotiation)
   + [Image Actor](@ref image-actor)
+  + [Image View](@ref image-view)
  + [Animation](@ref animation)
   + [Basic Framework](@ref animation-basics)
   + [Key Frame Animations](@ref animation-key-frame)
@@ -74,6 +75,7 @@
  + Environment Variables
  + [Resource Tracking](@ref resourcetracking)
  + Logging
+ + [Debug Renderer](@ref debugrenderer)
  + [Stagehand - DALi Visual Debugger](@ref stagehand)
 
 ### Viewing Modes
index a8dc916..132fe19 100644 (file)
@@ -57,5 +57,24 @@ then the above image will look like:
 </td>
 </table>
 
+@section background-renderer Background Renderer
+
+The background can be set to use a specified renderer, e.g the border renderer
+@code
+Property::Map renderer;
+renderer.Insert("rendererType","borderRenderer");
+renderer.Insert("borderColor",COLOR::RED);
+renderer.Insert("borderSize",20.f);
+
+control.SetProperty( Control::Property::BACKGROUND, renderer);
+@endcode
+
+then the above image will look like:
+<table border=0 cellpadding=10><tr>
+<td>
+\image html BackgroundBorder.png
+</td>
+</table>
+
 *
 */
index 99a42cd..b528ef1 100644 (file)
  * section.
  *
  * <h2 class="pg">Style</h2>
- * The Actor can render an image in two different ways.<br>
+ * The Actor can render an image in only as a quad. Use ImageView for nine-patch/n-patch image rendering.<br>
  * -# STYLE_QUAD: A simple flat quad style for rendering images.<br>
- * -# STYLE_NINE_PATCH: This style gives the flexibility to stretch images by dividing it into 9 sections.
- * The four corners are not scaled; the four edges are scaled in one axis, and the middle is scaled in both axes.<br>
- *
- * @code
- * // default : ImageActor::STYLE_QUAD
- * myImageActor.SetStyle (Dali::ImageActor::STYLE_NINE_PATCH);
- * @endcode
- *
- *
- * <h2 class="pg">Border</h2>
- * The border is used in the ImageActor::STYLE_NINE_PATCH. It defines the border values of the image for stretching.<br>
- *
- * @code
- * Dali::ImageActor::Border border(0.45,0.15,0.45,0.15);
- * myImageActor.SetBorder(border);
- * @endcode
- *
+ * -# STYLE_NINE_PATCH: This is deprecated as of Dali 1.1.11. 
  *
  * <h2 class="pg">Pixel area</h2>
  * The area of the image to be displayed by the Image Actor can be set by setting the Pixel area. Pixel area is relative to the top-left (0,0) of the image.
diff --git a/docs/content/programming-guide/image-view.h b/docs/content/programming-guide/image-view.h
new file mode 100644 (file)
index 0000000..886a6ab
--- /dev/null
@@ -0,0 +1,113 @@
+/*! \page image-view Image Views
+ *
+ *
+ * <h1 class="pg">Overview</h1>
+ * The Dali::Toolkit::ImageView inherits from Dali::Toolkit::Control and provide means to display resources like Images on the stage.<br>
+ *
+ * - <b>ImageView:</b> An actor for displaying Images. It allows the developer to display a Dali::Image object or an image from a url path on the stage.<br>
+ *
+ * <h1 class="pg">Image View</h1>
+ *
+ * <h2 class="pg">Construction</h2>
+ * The Image View is constructed by passing a Dali::Image object or by a url path.<br>
+ *
+ * <h3 class="pg">Loading from a url path</h3>
+ * Image View will load a file from a given url path. Using a url path is the prefered way of displaying an image as the Dali engine can do optimsations to
+ * reuse shaders and perform automatic image atlassing.<br>
+ * This can be a path to a image file:
+ * @code
+ * Dali::Toolkit::ImageView myImageView = ImageView::New( "source-image-url.png" );
+ * @endcode
+ *
+ * A path to a nine-patch/n-patch image file:
+ * @code
+ * Dali::Toolkit::ImageView myImageView = ImageView::New( "source-image-url.9.png" );
+ * @endcode
+ *
+ * <h3 class="pg">Loading from a Image handle</h3>
+ * Dali::Image is an abstract base class with multiple derived classes.
+ *
+ * @code
+ * Dali::Image image = BufferImage::New( 100, 100 );
+ * Dali::Toolkit::ImageView myImageView = Toolkit::ImageView::New( image );
+ * @endcode
+ *
+ * <h3 class="pg">The IMAGE property</h3>
+ * the IMAGE property allows you to change many aspects of the image that is renderered.
+ * This property can either be a string for a image url path or a Property::Map that specifies
+ * the image in more detail.
+ *
+ * <h3 class="pg">Renderers</h3>
+ * You can specify a specific renderer instead of using the default Image Renderer, e.g to use the Border Renderer.
+ *
+ * @code
+ * Property::Map renderer;
+ * renderer.Insert("rendererType","borderRenderer");
+ * renderer.Insert("borderColor",COLOR::RED);
+ * renderer.Insert("borderSize",20.f);
+ *
+ * Dali::Toolkit::ImageView myImageView = Dali::Toolkit::ImageView::New();
+ * myImageView.SetProperty( Control::Property::IMAGE, renderer);
+ * @endcode
+
+ * <h3 class="pg">Resizing at Load Time</h3>
+ * An application loading images from an external source will often want to
+ * display those images at a lower resolution than their native ones.
+ * To support this, DALi can resize an image at load time so that its
+ * in-memory copy uses less space and its visual quality benefits from being
+ * prefiltered.
+ * There are four algorithms which can be used to fit an image to a desired
+ * rectangle, a desired width or a desired height
+ * (see Dali::FittingMode).
+ *
+ * Here is an example doing rescaling:
+ *
+ * @code
+ * Property::Map imageProperty;
+ * imageProperty.Insert("imageUrl", "source-image-url.png");
+ * imageProperty.Insert("imageFittingMode", "scaleToFill");
+ * imageProperty.Insert("fitWidth", 240);
+ * imageProperty.Insert("fitHeight", 240);
+ * Dali::Toolkit::ImageView myImageView = Dali::Toolkit::ImageView::New();
+ * myImageView.SetProperty( Control::Property::IMAGE, imageProperty);
+
+ * @endcode
+ *
+ * This example sets the size and fitting mode appropriately for a large thumbnail
+ * during Dali::ResourceImage construction.
+ * In general, to enable scaling on load, pass a non-zero width or height and
+ * one of the four fitting modes to the Dali::ResourceImage creator function
+ * as shown above.
+ *
+ * The fitting modes and a suggested use-case for each are as follows:
+ * <ol>
+ *   <li> "shrinkToFit" Full-screen image display: Limit loaded image resolution to device resolution but show all of image.
+ *   <li> "scaleToFill" Thumbnail gallery grid: Limit loaded image resolution to screen tile, filling whole tile but losing a few pixels to match the tile shape.
+ *   <li> "fitWidth" Image columns: Limit loaded image resolution to column.
+ *   <li> "fitHeight" Image rows: Limit loaded image resolution to row height.
+ * </ol>
+ *
+ * The dali-demo project contains a full example under
+ * <code>examples/image-scaling-and-filtering</code>
+ * and a specific sampling mode example under
+ * <code>examples/image-scaling-irregular-grid</code>.
+ *
+ * There are more details on this topic in the
+ * \link resourceimagescaling Rescaling Images \endlink
+ * section.
+ *
+ * <h2 class="pg">Style</h2>
+ * The Actor can render an image in only as a quad or as a nine-patch/n-patch image. This is done by using a nine-patch filename naming scheme of ending with
+ * a ".9" or a ".#". There is no special treatment if the file encodes a nine-patch image or n-patch image as long as it has either ".9" or ".#" the image will be correctly loaded.<br>
+ * @code
+ * Dali::Toolkit::ImageView myImageView1 = Dali::Toolkit::ImageView::New("source-to-nine-patch-image.9.png");
+ * Dali::Toolkit::ImageView myImageView2 = Dali::Toolkit::ImageView::New("source-to-nine-patch-image.#.png");
+ * @endcode
+ *
+ * <h2 class="pg">Changing the image</h2>
+ * The Image View can be changed by calling Dali::Toolkit::ImageView::SetImage methods or by changing the IMAGE property.
+ * @code
+ * myImageActor.SetImage( newImage );
+ * @endcode
+ *
+ */
index 75fef8f..54c8909 100644 (file)
@@ -1,35 +1,86 @@
 /*! \page shader-intro Shader Effects
  *
-
-<h2 class="pg">Introduction</h2>
-
-The shader effects allow the developer to apply visual deformations on the actors.
-They can affect the geometry, the colors and textures of the actor.
-
-
-<br>
-<br>
-<h2 class="pg">Custom Shader Effects</h2>
-The \ref Dali::ShaderEffect "ShaderEffect" lets the developers create their own shader effects by specifying the vertex and pixel shaders.
-
-A custom shader effect can be created like this:
-@code
-String myVertexShader; // This variable would contain the code for a vertex shader.
-Dali::ShaderEffect myEffect = Dali::ShaderEffect::New( myVertexShader,
-                                                       "" // use default pixel shader
-                                                     );
-@endcode
-
-The value of a uniform can be set like this:
-@code
-// if the uniform was declared like this in the shader: uniform float myUniform;
-myEffect.SetUniform( "myUniform", 0.5f );
-@endcode
-
-The custom shader effect can be applied to an actor like any other shader:
-@code
-actor.SetShaderEffect( myEffect );
-@endcode
-
+ *
+ * <h2 class="pg">Introduction</h2>
+ *
+ * The shader effects allow the developer to apply visual deformations on Image Views.
+ * They can affect the geometry, the colors and textures of the Image View.
+ *
+ * <br>
+ * <br>
+ * <h2 class="pg">Custom Shader Effects</h2>
+ * The custom shader lets the developers create their own shader effects by specifying the vertex and pixel shaders.
+ *
+ * To set a custom shader to ImageRenderer you have to pass it through as a Property::Map
+ * @code
+ * //an example vertex shader
+ * const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
+ *   attribute mediump vec2 aPosition;\n
+ *   varying mediump vec2 vTexCoord;\n
+ *   uniform mediump mat4 uMvpMatrix;\n
+ *   uniform mediump vec3 uSize;\n
+ *   \n
+ *   void main()\n
+ *   {\n
+ *     mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
+ *     vertexPosition.xyz *= uSize;\n
+ *     vertexPosition = uMvpMatrix * vertexPosition;\n
+ *     \n
+ *     vTexCoord = aPosition + vec2(0.5);\n
+ *     gl_Position = vertexPosition;\n
+ *   }\n
+ * );
+ *
+ * //an example fragment shader
+ * const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
+ *   varying mediump vec2 vTexCoord;\n
+ *   uniform sampler2D sTexture;\n
+ *   uniform lowp vec4 uColor;\n
+ *   \n
+ *   void main()\n
+ *   {\n
+ *     gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
+ *   }\n
+ * );
+ *
+ * Property::Map customShader;
+ *
+ * customShader.Insert(“vertex-shader”, VERTEX_SHADER); //if this is not set then the default ImageView vertex shader will be used
+ * customShader.Insert(“fragment-shader”, FRAGMENT_SHADER); //if this is not set then the default ImageView fragment shader will be used
+ *
+ * Property::Map map;
+ * map.Insert(“shader”, customShader);
+ *
+ * ImageView imageView = ImageView::New("image-url.png")
+ * imageView.SetProperty(ImageView::Property::IMAGE, map);
+ * @endcode
+ *
+ * Optionally, you can subdivide the grid horizontally or vertically before you add it to the map but you should not do this if a quad is used.
+ * @code
+ * int X_SUB_DIVISIONS = 20;
+ * int Y_SUB_DIVISIONS = 20;
+ * customShader.Insert(“subdivide-grid-x”, X_SUB_DIVISIONS); //optional number of times to subdivide the grid horizontally, don’t add if you just want to use a quad
+ * customShader.Insert(“subdivide-grid-y”, Y_SUB_DIVISIONS); //optional number of times to subdivide the grid vertically, don’t add if you just want to use a quad
+ *
+ * //shader hints can be an array or a string
+ * optional array of shader hints
+ *
+ * Property::Array shaderHints;
+ * shaderHints.PushBack(“requires-self-depth-test”);
+ * shaderHints.PushBack(“output-is-transparent”);
+ * shaderHints.PushBack(“output-is-opaque”);
+ * shaderHints.PushBack(“modifies-geometry”);
+ * customShader.Insert(“hints”, shaderHints);
+ *
+ * //or optional single shader hint as a string
+ * //customShader.Insert(“hints”, “output-is-transparent”);
+ * @endcode
+ *
+ * The value of a uniform can be set on the imageView
+ * @code
+ * // if the uniform was declared like this in the shader: uniform float myUniform;
+ * imageView.RegisterProperty( "myUniform", 0.5f );
+ * @endcode
+ *
  *
  */
diff --git a/docs/content/shared-javascript-and-cpp-documentation/debug-renderer.md b/docs/content/shared-javascript-and-cpp-documentation/debug-renderer.md
new file mode 100644 (file)
index 0000000..8bb8bc6
--- /dev/null
@@ -0,0 +1,21 @@
+<!--
+/**-->
+
+# Debug Renderer {#debugrenderer}
+
+## Enable debug rendering
+
+Setting DALI_DEBUG_RENDERING environment variable will enable the renderer debuging.
+
+Then, every concrete control renderer( ColorRenderer, BorderRenderer, ImageRenderer, GradientRenderer, etc. ) is replaced with a DebugRenderer object.
+Debug renderer renders a simple quad wireframe, so that the control layout and scene structure is clearly displayed.
+
+### Example:
+~~~{.bash}
+sh-4.1$ DALI_DEBUG_RENDERING=1 /usr/apps/com.samsung.dali-demo/bin/blocks.example
+~~~
+
+![ ](../assets/img/debug-renderer/debug-blocks.png)
+![ ](debug-blocks.png)
+
+
index 05bf048..e51c4ff 100644 (file)
@@ -70,6 +70,28 @@ field.SetProperty( TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN" ); // "CEN
 field.HorizontalAlignment = "BEGIN"; // "CENTER" or "END"
 ~~~
 
+### Copy and Paste  (Selection)
+
+Text can be selected by a long press or double tapping it.   Depending on certain conditions a popup could be shown giving options including [CUT][COPY][PASTE], [SELECT ALL] or [CLIPBOARD]. Below these conditions will be explained.
+
+[CUT] or [COPY] send the selected text to the clipboard ready to be pasted directly or via the clipboard UI.   Pressing [PASTE] will paste the top item from the clipboard (what has just been copied, possibly from another application).  If the system supports a clipboard UI this can be displayed by pressing the [CLIPBOARD] button.
+
+Empty text means the user has not inputted any text, a TextField containing special characters or purely whitespace is not empty.
+
+Below shows how the popup will look depending on the state of the TextField
+
+|  |  |
+|--|--|
+| Condition: Long press/double tap when empty text but clipboard has content  |  Condition: Long press/double tap when TextField contains text |
+|[PASTE][CLIPBOARD] buttons shown| [CUT][COPY], [SELECT ALL] unless all text selected and [PASTE][CLIPBOARD] if content to paste. |
+|    ![ ](../assets/img/text-controls/EmptyTextClipboardHasContent.png) ![ ](./EmptyTextClipboardHasContent.png) |   ![ ](../assets/img/text-controls/SelectingText.png) ![ ](./SelectingText.png) |
+| Condition: Long press/double tap popup when TextField contains just whitespace | Condition: Empty text & clipboard empty |
+| Whitespace treated as regular text, [CUT][COPY] shown and [PASTE][CLIPBOARD] if content to paste. As all text is selected there is no need for [SELECT ALL] |  No popup shown after longpress/double tap|
+|  ![ ](../assets/img/text-controls/SelectAllWhitespace.png) ![ ](./SelectAllWhitespace.png) | ![ ](../assets/img/text-controls/EmptyTextAndNoContentToPaste.png) ![ ](./EmptyTextAndNoContentToPaste.png)|
+| Condition: Longpress/(double tap) on whitespace which is following text | Condition: Tapping text or panning grab handle |
+| [PASTE][CLIPBOARD] shown if something to paste. [SELECT ALL] as more text to select | If content in clipboard [PASTE][CLIPBOARD] popup will be shown. |
+| ![ ](../assets/img/text-controls/SelectWhitespaceAfterText.png) ![ ](./SelectWhitespaceAfterText.png) | ![ ](../assets/img/text-controls/TapAfterCopyingText.png) ![ ](./TapAfterCopyingText.png) |
+
 ### TextField Decorations
 
 #### Color
index e8bf15f..2822025 100644 (file)
@@ -1,6 +1,6 @@
 Name:       dali-toolkit
 Summary:    The OpenGLES Canvas Core Library Toolkit
-Version:    1.1.10
+Version:    1.1.11
 Release:    1
 Group:      System/Libraries
 License:    Apache-2.0, BSD-2.0, MIT