[NUI] Support EncodedImageBuffer ImageType property + Upgrade EncodedImageBuffer...
authorEunki, Hong <eunkiki.hong@samsung.com>
Tue, 14 Nov 2023 03:53:06 +0000 (12:53 +0900)
committerJaehyun Cho <jaehyun0cho@gmail.com>
Wed, 15 Nov 2023 07:09:04 +0000 (16:09 +0900)
Let we allow to give the type of buffer s.t. what buffer is mean.
We can load svg and lottie image as encoded image buffer now.

+

Let we make EncodedImageBuffer can be created at worker thread.
And make the demo to load buffer asynchronously.

This patch have dependency with below dali patch :

https://review.tizen.org/gerrit/c/platform/core/uifw/dali-csharp-binder/+/301314

Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
src/Tizen.NUI/src/internal/Interop/Interop.EncodedImageBuffer.cs
src/Tizen.NUI/src/public/Images/EncodedImageBuffer.cs
test/Tizen.NUI.Samples/Tizen.NUI.Samples/Samples/EncodedImageSample.cs

index 7860c7f..2f89bf8 100644 (file)
@@ -27,6 +27,9 @@ namespace Tizen.NUI
             [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_EncodedImageBuffer_New")]
             public static extern IntPtr New(global::System.Runtime.InteropServices.HandleRef jarg1);
 
+            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_EncodedImageBuffer_New__SWIG_1")]
+            public static extern IntPtr New(global::System.Runtime.InteropServices.HandleRef jarg1, int imageType);
+
             [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_new_EncodedImageBuffer__SWIG_0")]
             public static extern IntPtr NewEncodedImageBuffer();
 
@@ -36,6 +39,12 @@ namespace Tizen.NUI
             [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_delete_EncodedImageBuffer")]
             public static extern void DeleteEncodedImageBuffer(global::System.Runtime.InteropServices.HandleRef jarg1);
 
+            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_EncodedImageBuffer_SetImageType")]
+            public static extern void SetImageType(global::System.Runtime.InteropServices.HandleRef jarg1, int imageType);
+
+            [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_EncodedImageBuffer_GetImageType")]
+            public static extern int GetImageType(global::System.Runtime.InteropServices.HandleRef jarg1);
+
             [DllImport(NDalicPINVOKE.Lib, EntryPoint = "CSharp_Dali_EncodedImageBuffer_GetRawBuffer")]
             public static extern IntPtr GetRawBuffer(IntPtr handle);
 
index 17f9814..9d5f0a2 100644 (file)
@@ -38,6 +38,37 @@ namespace Tizen.NUI
         private VectorUnsignedChar mCachedBuffer = null; // cached encoded raw buffer
 
         /// <summary>
+        /// The list of type of encoded image buffer.
+        /// It will be used when we want to specify the buffer data type.
+        /// </summary>
+        /// <remarks>Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime.</remarks>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        [System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1717:Only FlagsAttribute enums should have plural names")]
+        public enum ImageTypes
+        {
+            /// <summary>
+            /// Regular images.
+            /// </summary>
+            /// <remarks>Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime.</remarks>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            RegularImage = 0,
+
+            /// <summary>
+            /// Vector rasterize images.
+            /// </summary>
+            /// <remarks>Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime.</remarks>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            VectorImage,
+
+            /// <summary>
+            /// Animated vector rasterize images.
+            /// </summary>
+            /// <remarks>Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime.</remarks>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            AnimatedVectorImage,
+        }
+
+        /// <summary>
         /// Constructor.
         /// </summary>
         /// <param name="stream">The Stream of the image file.</param>
@@ -45,19 +76,58 @@ namespace Tizen.NUI
         /// <exception cref="InvalidOperationException"> Thrown when stream don't have any data. </exception>
         /// <remarks>Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime.</remarks>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public EncodedImageBuffer(System.IO.Stream stream) : this(GetRawBuffrFromStreamHelper(stream))
+        public EncodedImageBuffer(System.IO.Stream stream) : this(GetRawBuffrFromStreamHelper(stream), ImageTypes.RegularImage)
+        {
+            if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+        }
+
+        /// <summary>
+        /// Constructor with image type.
+        /// </summary>
+        /// <param name="stream">The Stream of the image file.</param>
+        /// <param name="imageType">The type of the image stream.</param>
+        /// <exception cref="ArgumentNullException"> Thrown when stream is null. </exception>
+        /// <exception cref="InvalidOperationException"> Thrown when stream don't have any data. </exception>
+        /// <remarks>Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime.</remarks>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public EncodedImageBuffer(System.IO.Stream stream, ImageTypes imageType) : this(GetRawBuffrFromStreamHelper(stream), imageType)
         {
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
-        internal EncodedImageBuffer(VectorUnsignedChar buffer) : this(Interop.EncodedImageBuffer.New(VectorUnsignedChar.getCPtr(buffer)), true)
+        internal EncodedImageBuffer(VectorUnsignedChar buffer, ImageTypes imageType) : this(Interop.EncodedImageBuffer.New(VectorUnsignedChar.getCPtr(buffer), (int)imageType), true)
         {
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
             mCachedBuffer = buffer;
         }
 
-        internal EncodedImageBuffer(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn)
+        internal EncodedImageBuffer(global::System.IntPtr cPtr, bool cMemoryOwn) : this(cPtr, cMemoryOwn, false)
+        {
+            // Note : EncodedImageBuffer don't need to be register in Registry default. So we can create this class from worker thread.
+        }
+
+        internal EncodedImageBuffer(global::System.IntPtr cPtr, bool cMemoryOwn, bool cRegister) : base(cPtr, cMemoryOwn, cRegister)
+        {
+        }
+
+        /// <summary>
+        /// The type of image for this EncodedImageBuffer.
+        /// </summary>
+        /// <remarks>Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime.</remarks>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ImageTypes ImageType
         {
+            set
+            {
+                Interop.EncodedImageBuffer.SetImageType(SwigCPtr, (int)value);
+                NDalicPINVOKE.ThrowExceptionIfExists();
+            }
+            get
+            {
+                ImageTypes ret = (ImageTypes)Interop.EncodedImageBuffer.GetImageType(SwigCPtr);
+                NDalicPINVOKE.ThrowExceptionIfExists();
+                return ret;
+            }
         }
 
         /// <summary>
index 45bc6ad..7535e65 100755 (executable)
@@ -1,34 +1,72 @@
-
-using Tizen.NUI.BaseComponents;
+using Tizen.NUI.BaseComponents;
 using Tizen.NUI.Components;
 
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
 namespace Tizen.NUI.Samples
 {
     public class EncodedImageTest : IExample
     {
         Window win;
         ImageView imageView;
+        int index = 0;
+        Timer timer;
+
+        static private string DEMO_IMAGE_DIR = Tizen.Applications.Application.Current.DirectoryInfo.Resource + "images/";
 
-        static public string DEMO_IMAGE_DIR = CommonResource.GetDaliResourcePath() + "DaliDemo/";
+        static private readonly List<(string, EncodedImageBuffer.ImageTypes)> TestImages = new()
+        {
+            (DEMO_IMAGE_DIR + "Dali/DaliDemo/Logo-for-demo.png", EncodedImageBuffer.ImageTypes.RegularImage),
+            (DEMO_IMAGE_DIR + "Dali/DaliDemo/Kid1.svg", EncodedImageBuffer.ImageTypes.VectorImage),
+            (DEMO_IMAGE_DIR + "../a.json", EncodedImageBuffer.ImageTypes.AnimatedVectorImage),
+        };
 
         public void Activate()
         {
             win = NUIApplication.GetDefaultWindow();
-            
+
+            SetImage(index);
+        }
+
+        private bool OnTick(object o, Timer.TickEventArgs e)
+        {
+            index = (index + 1) % TestImages.Count;
+            SetImage(index);
+            return false;
+        }
+
+        private void OnResourceReady(object o, global::System.EventArgs e)
+        {
+            timer = new Timer(2000);
+            timer.Tick += OnTick;
+            timer.Start();
+        }
+
+        private async void SetImage(int index)
+        {
+            var encodedTask = CreateEncodedImageBufferAsync(TestImages[index].Item1, TestImages[index].Item2);
+
+            imageView?.Unparent();
+            imageView?.Dispose();
+
             EncodedImageBuffer buffer;
             ImageUrl imageUrl;
-            
-            buffer = CreateEncodedImageBuffer(DEMO_IMAGE_DIR + "Logo-for-demo.png");
-
-            imageUrl = buffer?.GenerateUrl();
 
             imageView = new ImageView()
             {
                 WidthResizePolicy = ResizePolicyType.FillToParent,
                 HeightResizePolicy = ResizePolicyType.FillToParent,
-
-                ResourceUrl = imageUrl?.ToString(),
             };
+            imageView.ResourceReady += OnResourceReady;
+
+            buffer = await encodedTask;
+
+            imageUrl = buffer?.GenerateUrl();
+            imageView.ResourceUrl = imageUrl?.ToString();
+            imageView.Play();
 
             imageUrl?.Dispose();
             buffer?.Dispose();
@@ -36,16 +74,18 @@ namespace Tizen.NUI.Samples
             win.GetDefaultLayer().Add(imageView);
         }
 
-        private EncodedImageBuffer CreateEncodedImageBuffer(string filename)
+        private async Task<EncodedImageBuffer> CreateEncodedImageBufferAsync(string filename, EncodedImageBuffer.ImageTypes imageType)
         {
             EncodedImageBuffer buffer = null;
             global::System.IO.Stream stream = new global::System.IO.FileStream(filename, global::System.IO.FileMode.Open);
-            buffer = new EncodedImageBuffer(stream);
+            buffer = new EncodedImageBuffer(stream, imageType);
             return buffer;
         }
 
         public void Deactivate()
         {
+            timer?.Stop();
+            timer?.Dispose();
             imageView?.Unparent();
             imageView?.Dispose();
         }