From: Eunki, Hong Date: Tue, 14 Nov 2023 03:53:06 +0000 (+0900) Subject: [NUI] Support EncodedImageBuffer ImageType property + Upgrade EncodedImageBuffer... X-Git-Tag: accepted/tizen/8.0/unified/20240613.065534~124 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=be498224981274f055226a2ceda1cdc3d3090b13;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git [NUI] Support EncodedImageBuffer ImageType property + Upgrade EncodedImageBuffer demo 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 --- diff --git a/src/Tizen.NUI/src/internal/Interop/Interop.EncodedImageBuffer.cs b/src/Tizen.NUI/src/internal/Interop/Interop.EncodedImageBuffer.cs index 7860c7f..2f89bf8 100644 --- a/src/Tizen.NUI/src/internal/Interop/Interop.EncodedImageBuffer.cs +++ b/src/Tizen.NUI/src/internal/Interop/Interop.EncodedImageBuffer.cs @@ -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); diff --git a/src/Tizen.NUI/src/public/Images/EncodedImageBuffer.cs b/src/Tizen.NUI/src/public/Images/EncodedImageBuffer.cs index 17f9814..9d5f0a2 100644 --- a/src/Tizen.NUI/src/public/Images/EncodedImageBuffer.cs +++ b/src/Tizen.NUI/src/public/Images/EncodedImageBuffer.cs @@ -38,6 +38,37 @@ namespace Tizen.NUI private VectorUnsignedChar mCachedBuffer = null; // cached encoded raw buffer /// + /// The list of type of encoded image buffer. + /// It will be used when we want to specify the buffer data type. + /// + /// Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime. + [EditorBrowsable(EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Naming", "CA1717:Only FlagsAttribute enums should have plural names")] + public enum ImageTypes + { + /// + /// Regular images. + /// + /// Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime. + [EditorBrowsable(EditorBrowsableState.Never)] + RegularImage = 0, + + /// + /// Vector rasterize images. + /// + /// Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime. + [EditorBrowsable(EditorBrowsableState.Never)] + VectorImage, + + /// + /// Animated vector rasterize images. + /// + /// Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime. + [EditorBrowsable(EditorBrowsableState.Never)] + AnimatedVectorImage, + } + + /// /// Constructor. /// /// The Stream of the image file. @@ -45,19 +76,58 @@ namespace Tizen.NUI /// Thrown when stream don't have any data. /// Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime. [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(); + } + + /// + /// Constructor with image type. + /// + /// The Stream of the image file. + /// The type of the image stream. + /// Thrown when stream is null. + /// Thrown when stream don't have any data. + /// Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime. + [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) + { + } + + /// + /// The type of image for this EncodedImageBuffer. + /// + /// Hidden API: Only for inhouse or developing usage. The behavior and interface can be changed anytime. + [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; + } } /// diff --git a/test/Tizen.NUI.Samples/Tizen.NUI.Samples/Samples/EncodedImageSample.cs b/test/Tizen.NUI.Samples/Tizen.NUI.Samples/Samples/EncodedImageSample.cs index 45bc6ad..7535e65 100755 --- a/test/Tizen.NUI.Samples/Tizen.NUI.Samples/Samples/EncodedImageSample.cs +++ b/test/Tizen.NUI.Samples/Tizen.NUI.Samples/Samples/EncodedImageSample.cs @@ -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 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(); }