[Multimedia.Util] Modified to throw NotSupportedException for NotSupported error... 38/160438/1
authorcoderhyme <jhyo.kim@samsung.com>
Thu, 16 Nov 2017 06:37:50 +0000 (15:37 +0900)
committercoderhyme <jhyo.kim@samsung.com>
Thu, 16 Nov 2017 06:37:50 +0000 (15:37 +0900)
Additionally, moved transform classes into own files.

Change-Id: I8e283ed484c16898eef8fbdbb1693763c59d0ef8
Signed-off-by: coderhyme <jhyo.kim@samsung.com>
src/Tizen.Multimedia.Util/ImageUtil/ColorSpaceTransform.cs [new file with mode: 0644]
src/Tizen.Multimedia.Util/ImageUtil/CropTransform.cs [new file with mode: 0644]
src/Tizen.Multimedia.Util/ImageUtil/FlipTransform.cs [new file with mode: 0644]
src/Tizen.Multimedia.Util/ImageUtil/ImageColorSpace.cs
src/Tizen.Multimedia.Util/ImageUtil/ImageTransform.cs
src/Tizen.Multimedia.Util/ImageUtil/ImageTransformCollection.cs [new file with mode: 0644]
src/Tizen.Multimedia.Util/ImageUtil/ImageTransformGroup.cs [new file with mode: 0644]
src/Tizen.Multimedia.Util/ImageUtil/ImageTransformer.cs
src/Tizen.Multimedia.Util/ImageUtil/ImageUtil.cs
src/Tizen.Multimedia.Util/ImageUtil/ResizeTransform.cs [new file with mode: 0644]
src/Tizen.Multimedia.Util/ImageUtil/RotateTransform.cs [new file with mode: 0644]

diff --git a/src/Tizen.Multimedia.Util/ImageUtil/ColorSpaceTransform.cs b/src/Tizen.Multimedia.Util/ImageUtil/ColorSpaceTransform.cs
new file mode 100644 (file)
index 0000000..e4a468a
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+using System;
+using System.Collections.Generic;
+using static Interop.ImageUtil;
+using static Interop.ImageUtil.Transform;
+
+namespace Tizen.Multimedia.Util
+{
+    /// <summary>
+    /// Changes the colorspace of an image.
+    /// </summary>
+    /// <seealso cref="ColorSpace"/>
+    /// <since_tizen> 4 </since_tizen>
+    public class ColorSpaceTransform : ImageTransform
+    {
+        private ImageColorSpace _imageColorSpace;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ColorSpaceTransform"/> class.
+        /// </summary>
+        /// <param name="colorSpace">The colorspace of output image.</param>
+        /// <exception cref="ArgumentException"><paramref name="colorSpace"/> is invalid.</exception>
+        /// <exception cref="NotSupportedException"><paramref name="colorSpace"/> is not supported.</exception>
+        /// <seealso cref="SupportedColorSpaces"/>
+        /// <since_tizen> 4 </since_tizen>
+        public ColorSpaceTransform(ColorSpace colorSpace)
+        {
+            ColorSpace = colorSpace;
+        }
+
+        /// <summary>
+        /// Gets or sets the colorspace of the result image.
+        /// </summary>
+        /// <exception cref="ArgumentException"><paramref name="value"/> is invalid.</exception>
+        /// <exception cref="NotSupportedException"><paramref name="value"/> is not supported.</exception>
+        /// <seealso cref="SupportedColorSpaces"/>
+        /// <since_tizen> 4 </since_tizen>
+        public ColorSpace ColorSpace
+        {
+            get { return _imageColorSpace.ToCommonColorSpace(); }
+            set
+            {
+                ValidationUtil.ValidateEnum(typeof(ColorSpace), value, nameof(ColorSpace));
+
+                _imageColorSpace = value.ToImageColorSpace();
+            }
+        }
+
+        internal override string GenerateNotSupportedErrorMessage(VideoMediaFormat format)
+            => $"Converting colorspace from '{format.MimeType}' to '{ColorSpace.ToString()}' is not supported.";
+
+        internal override void Configure(TransformHandle handle)
+        {
+            SetColorspace(handle, _imageColorSpace);
+        }
+
+
+        /// <summary>
+        /// Gets the supported colorspaces for <see cref="ColorSpaceTransform"/>.
+        /// </summary>
+        /// <since_tizen> 4 </since_tizen>
+        public static IEnumerable<ColorSpace> SupportedColorSpaces
+        {
+            get
+            {
+                foreach (ImageColorSpace value in Enum.GetValues(typeof(ImageColorSpace)))
+                {
+                    yield return value.ToCommonColorSpace();
+                }
+            }
+        }
+    }
+}
diff --git a/src/Tizen.Multimedia.Util/ImageUtil/CropTransform.cs b/src/Tizen.Multimedia.Util/ImageUtil/CropTransform.cs
new file mode 100644 (file)
index 0000000..489a0ad
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+using System;
+using static Interop.ImageUtil;
+using static Interop.ImageUtil.Transform;
+
+namespace Tizen.Multimedia.Util
+{
+    /// <summary>
+    /// Crops an image.
+    /// </summary>
+    /// <since_tizen> 4 </since_tizen>
+    public class CropTransform : ImageTransform
+    {
+        private Rectangle _region;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="CropTransform"/> class.
+        /// </summary>
+        /// <param name="region">The crop region.</param>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     The X-position of <paramref name="region"/> is less than zero.<br/>
+        ///     -or-<br/>
+        ///     The Y-position of <paramref name="region"/> is less than zero.<br/>
+        ///     -or-<br/>
+        ///     The width of <paramref name="region"/> is less than or equal to zero.<br/>
+        ///     -or-<br/>
+        ///     The height of <paramref name="region"/> is less than or equal to zero.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public CropTransform(Rectangle region)
+        {
+            Region = region;
+        }
+
+        /// <summary>
+        /// Gets or sets the crop region.
+        /// </summary>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     The X-position of <paramref name="value"/> is less than zero.<br/>
+        ///     -or-<br/>
+        ///     The Y-position of <paramref name="value"/> is less than zero.<br/>
+        ///     -or-<br/>
+        ///     The width of <paramref name="value"/> is less than or equal to zero.<br/>
+        ///     -or-<br/>
+        ///     The height of <paramref name="value"/> is less than or equal to zero.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public Rectangle Region
+        {
+            get { return _region; }
+            set
+            {
+
+                if (value.X < 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(Region), value,
+                        "X position of the region can't be less than zero.");
+                }
+
+                if (value.Y < 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(Region), value,
+                        "Y position of the region can't be less than zero.");
+                }
+
+                if (value.Width <= 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(Region), value,
+                        "Width of the region can't be less than or equal zero.");
+                }
+
+                if (value.Height < 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(Region), value,
+                        "Height of the region can't be less than or equal to zero.");
+                }
+
+                _region = value;
+            }
+        }
+
+        internal override void Configure(TransformHandle handle)
+        {
+            SetCropArea(handle, Region.Left, Region.Top, Region.Right, Region.Bottom);
+        }
+
+        internal override void ValidateFormat(VideoMediaFormat format)
+        {
+            if (format.Size.Width < Region.Right || format.Size.Height < Region.Bottom)
+            {
+                throw new InvalidOperationException(
+                    $"Crop region is invalid; Source size({format.Size.ToString()}), Crop region({Region.ToString()}).");
+            }
+        }
+
+        internal override string GenerateNotSupportedErrorMessage(VideoMediaFormat format)
+        {
+            return $"'{format.MimeType}' is not supported by CropTransform.";
+        }
+    }
+}
diff --git a/src/Tizen.Multimedia.Util/ImageUtil/FlipTransform.cs b/src/Tizen.Multimedia.Util/ImageUtil/FlipTransform.cs
new file mode 100644 (file)
index 0000000..71da15e
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+using System;
+using System.Threading.Tasks;
+using static Interop.ImageUtil;
+using static Interop.ImageUtil.Transform;
+
+namespace Tizen.Multimedia.Util
+{
+    /// <summary>
+    /// Flips an image.
+    /// </summary>
+    /// <seealso cref="Rotation"/>
+    /// <since_tizen> 4 </since_tizen>
+    public class FlipTransform : ImageTransform
+    {
+        private Flips _flip;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="FlipTransform"/> class.
+        /// </summary>
+        /// <param name="flip">The value how to flip an image.</param>
+        /// <exception cref="ArgumentException"><paramref name="flip"/> is invalid.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="flip"/> is <see cref="Flips.None"/>.</exception>
+        /// <since_tizen> 4 </since_tizen>
+        public FlipTransform(Flips flip)
+        {
+            Flip = flip;
+        }
+
+        /// <summary>
+        /// Gets or sets the value how to flip an image.
+        /// </summary>
+        /// <exception cref="ArgumentException"><paramref name="value"/> is invalid.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is <see cref="Flips.None"/>.</exception>
+        /// <since_tizen> 4 </since_tizen>
+        public Flips Flip
+        {
+            get { return _flip; }
+            set
+            {
+                ValidationUtil.ValidateFlagsEnum(value, Flips.Horizontal | Flips.Vertical, nameof(Flips));
+
+                if (value == Flips.None)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), "Flip can't be None.");
+                }
+
+                _flip = value;
+            }
+        }
+
+        internal override string GenerateNotSupportedErrorMessage(VideoMediaFormat format)
+            => $"'{format.MimeType}' is not supported by FlipTransform.";
+
+        internal override void Configure(TransformHandle handle)
+        {
+            // intended blank
+        }
+
+        private async Task<MediaPacket> ApplyAsync(TransformHandle handle, MediaPacket source,
+            ImageRotation rotation)
+        {
+            SetRotation(handle, rotation);
+            return await RunAsync(handle, source);
+        }
+
+        internal override async Task<MediaPacket> ApplyAsync(MediaPacket source)
+        {
+            using (TransformHandle handle = CreateHandle())
+            {
+                if (Flip.HasFlag(Flips.Vertical | Flips.Horizontal))
+                {
+                    var flipped = await ApplyAsync(handle, source, ImageRotation.FlipHorizontal);
+                    try
+                    {
+                        return await ApplyAsync(handle, flipped, ImageRotation.FlipVertical);
+                    }
+                    finally
+                    {
+                        flipped.Dispose();
+                    }
+                }
+
+                return await ApplyAsync(handle, source, Flip.HasFlag(Flips.Horizontal) ?
+                    ImageRotation.FlipHorizontal : ImageRotation.FlipVertical);
+            }
+        }
+    }
+}
index 8c3fd1b..2939805 100644 (file)
@@ -97,7 +97,7 @@ namespace Tizen.Multimedia.Util
 
                 case ImageColorSpace.Yuyv: return ColorSpace.Yuyv;
 
-                case ImageColorSpace.Yuv422: return ColorSpace.Yuv422;
+                case ImageColorSpace.Yuv422: return ColorSpace.Yuv422P;
 
                 case ImageColorSpace.I420: return ColorSpace.I420;
 
@@ -141,7 +141,8 @@ namespace Tizen.Multimedia.Util
 
                 case ColorSpace.Yuyv: return ImageColorSpace.Yuyv;
 
-                case ColorSpace.Yuv422: return ImageColorSpace.Yuv422;
+                case ColorSpace.Yuv422:
+                case ColorSpace.Yuv422P: return ImageColorSpace.Yuv422;
 
                 case ColorSpace.I420: return ImageColorSpace.I420;
 
index 65cac7b..5923882 100644 (file)
@@ -15,8 +15,6 @@
  */
 
 using System;
-using System.Collections;
-using System.Collections.Generic;
 using System.Diagnostics;
 using System.Runtime.InteropServices;
 using System.Threading.Tasks;
@@ -37,9 +35,30 @@ namespace Tizen.Multimedia.Util
 
         internal async Task<MediaPacket> RunAsync(TransformHandle handle, MediaPacket source)
         {
+            Debug.Assert(source.Format is VideoMediaFormat);
+            ValidateFormat(source.Format as VideoMediaFormat);
+
             var tcs = new TaskCompletionSource<MediaPacket>();
 
-            TransformCompletedCallback cb = (nativehandle, errorCode, _) =>
+            using (var cbKeeper = ObjectKeeper.Get(GetCallback(tcs, source)))
+            {
+                var result = Run(handle, source.GetHandle(), cbKeeper.Target);
+
+                if (result == ImageUtilError.NotSupportedFormat)
+                {
+                    throw new NotSupportedException(
+                        GenerateNotSupportedErrorMessage(source.Format as VideoMediaFormat));
+                }
+                result.ThrowIfFailed("Failed to transform given packet with " + GetType());
+
+                return await tcs.Task;
+            }
+        }
+
+        private TransformCompletedCallback GetCallback(TaskCompletionSource<MediaPacket> tcs,
+            MediaPacket source)
+        {
+            return (nativehandle, errorCode, _) =>
             {
                 if (errorCode == ImageUtilError.None)
                 {
@@ -52,18 +71,16 @@ namespace Tizen.Multimedia.Util
                         tcs.TrySetException(e);
                     }
                 }
+                else if (errorCode == ImageUtilError.NotSupportedFormat)
+                {
+                    tcs.TrySetException(new NotSupportedException(
+                        GenerateNotSupportedErrorMessage(source.Format as VideoMediaFormat)));
+                }
                 else
                 {
                     tcs.TrySetException(errorCode.ToException("Image transformation failed"));
                 }
             };
-
-            using (var cbKeeper = ObjectKeeper.Get(cb))
-            {
-                Run(handle, source.GetHandle(), cb).ThrowIfFailed("Failed to transform given packet with " + GetType());
-
-                return await tcs.Task;
-            }
         }
 
         internal static TransformHandle CreateHandle()
@@ -73,557 +90,22 @@ namespace Tizen.Multimedia.Util
             return handle;
         }
 
-        internal abstract void Configure(TransformHandle handle);
-
-        internal virtual async Task<MediaPacket> ApplyAsync(MediaPacket source)
-        {
-            using (TransformHandle handle = CreateHandle())
-            {
-                Configure(handle);
-
-                return await RunAsync(handle, source);
-            }
-        }
-    }
-
-    /// <summary>
-    /// Represents a collection of <see cref="ImageTransform"/> objects that can be individually accessed by index.
-    /// </summary>
-    /// <since_tizen> 4 </since_tizen>
-    public class ImageTransformCollection : IEnumerable<ImageTransform>, IList<ImageTransform>
-    {
-        private List<ImageTransform> _list = new List<ImageTransform>();
-
-        /// <summary>
-        /// Initializes a new instance of the ImageTransformCollection class.
-        /// </summary>
-        /// <since_tizen> 4 </since_tizen>
-        public ImageTransformCollection()
-        {
-        }
-
-        /// <summary>
-        /// Gets or sets the <see cref="ImageTransform"/> at the specified index.
-        /// </summary>
-        /// <param name="index">The zero-based index of the <see cref="ImageTransform"/> to get or set.</param>
-        /// <value>The <see cref="ImageTransform"/> at the specified index.</value>
-        /// <exception cref="ArgumentOutOfRangeException">
-        ///     index is less than 0.<br/>
-        ///     -or-<br/>
-        ///     index is equal to or greater than <see cref="Count"/>.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public ImageTransform this[int index]
-        {
-            get { return _list[index]; }
-            set { _list[index] = value; }
-        }
-
-        /// <summary>
-        /// Gets the number of items contained in the TransformCollection.
-        /// </summary>
-        /// <since_tizen> 4 </since_tizen>
-        public int Count => _list.Count;
-
-        bool ICollection<ImageTransform>.IsReadOnly => false;
-
-        /// <summary>
-        /// Adds a <see cref="ImageTransform"/> to the end of the collection.
-        /// </summary>
-        /// <param name="item">The <see cref="ImageTransform"/> to add.</param>
-        /// <remarks>
-        /// <see cref="ImageTransformCollection"/> accepts null as a valid value for reference types and allows duplicate elements.
-        /// </remarks>
-        /// <since_tizen> 4 </since_tizen>
-        public void Add(ImageTransform item)
-        {
-            if (item == null)
-            {
-                throw new ArgumentNullException(nameof(item));
-            }
-            _list.Add(item);
-        }
-
-        /// <summary>
-        /// Removes all items.
-        /// </summary>
-        /// <since_tizen> 4 </since_tizen>
-        public void Clear() => _list.Clear();
-
-        /// <summary>
-        /// Determines whether the <see cref="ImageTransformCollection"/> contains the specified item.
-        /// </summary>
-        /// <param name="item">The <see cref="ImageTransform"/> to locate in the collection.</param>
-        /// <returns>true if the <see cref="ImageTransform"/> is found in the collection; otherwise, false.</returns>
-        /// <since_tizen> 4 </since_tizen>
-        public bool Contains(ImageTransform item) => _list.Contains(item);
-
-        /// <summary>
-        /// Copies the items of the collection to an array, starting at the specified array index.
-        /// </summary>
-        /// <param name="array">The one-dimensional array that is the destination of the items copied from the collection.</param>
-        /// <param name="arrayIndex">The zero-based index in array at which copying begins.</param>
-        /// <exception cref="ArgumentNullException"><paramref name="array"/> is null.</exception>
-        /// <exception cref="ArgumentOutOfRangeException"><paramref name="arrayIndex"/> is less than 0.</exception>
-        /// <exception cref="ArgumentException">
-        /// The number of elements in the source collection is greater than the available space from arrayIndex to the end of the destination array.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public void CopyTo(ImageTransform[] array, int arrayIndex) => _list.CopyTo(array, arrayIndex);
-
-        /// <summary>
-        /// Determines the index of the specified item in the collection.
-        /// </summary>
-        /// <param name="item">The <see cref="ImageTransform"/> to locate in the collection.</param>
-        /// <returns>The index of value if found in the <see cref="ImageTransformCollection"/>; otherwise, -1.</returns>
-        /// <since_tizen> 4 </since_tizen>
-        public int IndexOf(ImageTransform item) => _list.IndexOf(item);
-
-        /// <summary>
-        /// Inserts a <see cref="ImageTransform"/> into the collection at the specified index.
-        /// </summary>
-        /// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
-        /// <param name="item">The <see cref="ImageTransform"/> to insert into the collection.</param>
-        /// <exception cref="ArgumentNullException"><paramref name="item"/> is null.</exception>
-        /// <exception cref="ArgumentOutOfRangeException">
-        ///     index is less than 0.<br/>
-        ///     -or-<br/>
-        ///     index is greater than <see cref="Count"/>.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public void Insert(int index, ImageTransform item)
-        {
-            if (item == null)
-            {
-                throw new ArgumentNullException(nameof(item));
-            }
-            _list.Insert(index, item);
-        }
-
-        /// <summary>
-        /// Removes the first occurrence of the specified <see cref="ImageTransform"/> from the collection.
-        /// </summary>
-        /// <param name="item">The <see cref="ImageTransform"/> to remove.</param>
-        /// <returns>true if <paramref name="item"/> was removed from the collection; otherwise, false.</returns>
-        /// <since_tizen> 4 </since_tizen>
-        public bool Remove(ImageTransform item) => _list.Remove(item);
-
-        /// <summary>
-        /// Removes the <see cref="ImageTransform"/> at the specified index.
-        /// </summary>
-        /// <param name="index">The zero-based index to remove.</param>
-        /// <exception cref="ArgumentOutOfRangeException">
-        ///     index is less than 0.<br/>
-        ///     -or-<br/>
-        ///     index is equal to or greater than <see cref="Count"/>.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public void RemoveAt(int index) => _list.RemoveAt(index);
-
-        /// <summary>
-        /// Returns an enumerator that can iterate through the collection.
-        /// </summary>
-        /// <returns>An enumerator that can be used to iterate through the collection.</returns>
-        /// <since_tizen> 4 </since_tizen>
-        public IEnumerator<ImageTransform> GetEnumerator() => _list.GetEnumerator();
-
-        IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator();
-    }
-
-    // TODO need to improve performance
-    /// <summary>
-    /// Represents a <see cref="ImageTransform"/> that is a composite of the transforms.
-    /// </summary>
-    /// <since_tizen> 4 </since_tizen>
-    public class ImageTransformGroup : ImageTransform
-    {
-        /// <summary>
-        /// Gets or sets the <see cref="ImageTransformCollection"/>.
-        /// </summary>
-        /// <since_tizen> 4 </since_tizen>
-        public ImageTransformCollection Children { get; set; }
-
-        /// <summary>
-        /// Initializes a new instance of the ImageTransformGroup class.
-        /// </summary>
-        /// <since_tizen> 4 </since_tizen>
-        public ImageTransformGroup()
-        {
-            Children = new ImageTransformCollection();
-        }
-
-        internal override void Configure(TransformHandle handle)
-        {
-            // intended blank
-        }
-
-        internal override async Task<MediaPacket> ApplyAsync(MediaPacket source)
-        {
-            if (Children.Count == 0)
-            {
-                return source;
-            }
-
-            var items = Children;
-
-            MediaPacket curPacket = await items[0].ApplyAsync(source);
-
-            for (int i = 1; i < items.Count; ++i)
-            {
-                var oldPacket = curPacket;
-                try
-                {
-                    curPacket = await items[i].ApplyAsync(curPacket);
-                }
-                finally
-                {
-                    oldPacket.Dispose();
-                }
-            }
-
-            return curPacket;
-        }
-    }
-
-    /// <summary>
-    /// Rotates an image.
-    /// </summary>
-    /// <seealso cref="Rotation"/>
-    /// <since_tizen> 4 </since_tizen>
-    public class RotateTransform : ImageTransform
-    {
-        private Rotation _rotation;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="RotateTransform"/> class.
-        /// </summary>
-        /// <param name="rotation">The value how to rotate an image.</param>
-        /// <exception cref="ArgumentException"><paramref name="rotation"/> is invalid.</exception>
-        /// <exception cref="ArgumentOutOfRangeException"><paramref name="rotation"/> is <see cref="Rotation.Rotate90"/>.</exception>
-        /// <since_tizen> 4 </since_tizen>
-        public RotateTransform(Rotation rotation)
-        {
-            Rotation = rotation;
-
-        }
-
-        /// <summary>
-        /// Gets or sets the value how to rotate an image.
-        /// </summary>
-        /// <exception cref="ArgumentException"><paramref name="value"/> is invalid.</exception>
-        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is <see cref="Rotation.Rotate90"/>.</exception>
-        /// <since_tizen> 4 </since_tizen>
-        public Rotation Rotation
-        {
-            get { return _rotation; }
-            set
-            {
-                ValidationUtil.ValidateEnum(typeof(Rotation), value, nameof(Rotation));
-
-                if (value == Rotation.Rotate0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(value), "Rotation can't be Rotate0.");
-                }
-
-                _rotation = value;
-            }
-        }
-
-        internal override void Configure(TransformHandle handle)
-        {
-            SetRotation(handle, GetImageRotation());
-        }
-
-        private ImageRotation GetImageRotation()
-        {
-            switch (Rotation)
-            {
-                case Rotation.Rotate90: return ImageRotation.Rotate90;
-                case Rotation.Rotate180: return ImageRotation.Rotate180;
-                case Rotation.Rotate270: return ImageRotation.Rotate270;
-            }
-
-            Debug.Fail("Rotation is invalid value!");
-            return ImageRotation.Rotate0;
-        }
-    }
-
+        internal abstract string GenerateNotSupportedErrorMessage(VideoMediaFormat format);
 
-    /// <summary>
-    /// Flips an image.
-    /// </summary>
-    /// <seealso cref="Rotation"/>
-    /// <since_tizen> 4 </since_tizen>
-    public class FlipTransform : ImageTransform
-    {
-        private Flips _flip;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="FlipTransform"/> class.
-        /// </summary>
-        /// <param name="flip">The value how to flip an image.</param>
-        /// <exception cref="ArgumentException"><paramref name="flip"/> is invalid.</exception>
-        /// <exception cref="ArgumentOutOfRangeException"><paramref name="flip"/> is <see cref="Flips.None"/>.</exception>
-        /// <since_tizen> 4 </since_tizen>
-        public FlipTransform(Flips flip)
-        {
-            Flip = flip;
-        }
-
-        /// <summary>
-        /// Gets or sets the value how to flip an image.
-        /// </summary>
-        /// <exception cref="ArgumentException"><paramref name="value"/> is invalid.</exception>
-        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is <see cref="Flips.None"/>.</exception>
-        /// <since_tizen> 4 </since_tizen>
-        public Flips Flip
-        {
-            get { return _flip; }
-            set
-            {
-                ValidationUtil.ValidateFlagsEnum(value, Flips.Horizontal | Flips.Vertical, nameof(Flips));
-
-                if (value == Flips.None)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(value), "Flip can't be None.");
-                }
-
-                _flip = value;
-            }
-        }
-
-        internal override void Configure(TransformHandle handle)
-        {
-            // intended blank
-        }
+        internal abstract void Configure(TransformHandle handle);
 
-        private async Task<MediaPacket> ApplyAsync(TransformHandle handle, MediaPacket source,
-            ImageRotation rotation)
+        internal virtual void ValidateFormat(VideoMediaFormat format)
         {
-            SetRotation(handle, rotation);
-            return await RunAsync(handle, source);
         }
 
-        internal override async Task<MediaPacket> ApplyAsync(MediaPacket source)
+        internal virtual async Task<MediaPacket> ApplyAsync(MediaPacket source)
         {
             using (TransformHandle handle = CreateHandle())
             {
-                if (Flip.HasFlag(Flips.Vertical | Flips.Horizontal))
-                {
-                    var flipped = await ApplyAsync(handle, source, ImageRotation.FlipHorizontal);
-                    try
-                    {
-                        return await ApplyAsync(handle, flipped, ImageRotation.FlipVertical);
-                    }
-                    finally
-                    {
-                        flipped.Dispose();
-                    }
-                }
-
-                return await ApplyAsync(handle, source, Flip.HasFlag(Flips.Horizontal) ?
-                    ImageRotation.FlipHorizontal : ImageRotation.FlipVertical);
-            }
-        }
-    }
-
-    /// <summary>
-    /// Changes the colorspace of an image.
-    /// </summary>
-    /// <seealso cref="ColorSpace"/>
-    /// <since_tizen> 4 </since_tizen>
-    public class ColorSpaceTransform : ImageTransform
-    {
-        private ImageColorSpace _imageColorSpace;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="ColorSpaceTransform"/> class.
-        /// </summary>
-        /// <param name="colorSpace">The colorspace of output image.</param>
-        /// <exception cref="ArgumentException"><paramref name="colorSpace"/> is invalid.</exception>
-        /// <exception cref="NotSupportedException"><paramref name="colorSpace"/> is not supported.</exception>
-        /// <seealso cref="SupportedColorSpaces"/>
-        /// <since_tizen> 4 </since_tizen>
-        public ColorSpaceTransform(ColorSpace colorSpace)
-        {
-            ColorSpace = colorSpace;
-        }
-
-        /// <summary>
-        /// Gets or sets the colorspace of the result image.
-        /// </summary>
-        /// <exception cref="ArgumentException"><paramref name="value"/> is invalid.</exception>
-        /// <exception cref="NotSupportedException"><paramref name="value"/> is not supported.</exception>
-        /// <seealso cref="SupportedColorSpaces"/>
-        /// <since_tizen> 4 </since_tizen>
-        public ColorSpace ColorSpace
-        {
-            get { return _imageColorSpace.ToCommonColorSpace(); }
-            set
-            {
-                ValidationUtil.ValidateEnum(typeof(ColorSpace), value, nameof(ColorSpace));
-
-                _imageColorSpace = value.ToImageColorSpace();
-            }
-        }
-
-        internal override void Configure(TransformHandle handle)
-        {
-            SetColorspace(handle, _imageColorSpace);
-        }
-
-        /// <summary>
-        /// Gets the supported colorspaces for <see cref="ColorSpaceTransform"/>.
-        /// </summary>
-        /// <since_tizen> 4 </since_tizen>
-        public static IEnumerable<ColorSpace> SupportedColorSpaces
-        {
-            get
-            {
-                foreach (ImageColorSpace value in Enum.GetValues(typeof(ImageColorSpace)))
-                {
-                    yield return value.ToCommonColorSpace();
-                }
-            }
-        }
-    }
-
-    /// <summary>
-    /// Crops an image.
-    /// </summary>
-    /// <since_tizen> 4 </since_tizen>
-    public class CropTransform : ImageTransform
-    {
-        private Rectangle _region;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="CropTransform"/> class.
-        /// </summary>
-        /// <param name="region">The crop region.</param>
-        /// <exception cref="ArgumentOutOfRangeException">
-        ///     The X-position of <paramref name="region"/> is less than zero.<br/>
-        ///     -or-<br/>
-        ///     The Y-position of <paramref name="region"/> is less than zero.<br/>
-        ///     -or-<br/>
-        ///     The width of <paramref name="region"/> is less than or equal to zero.<br/>
-        ///     -or-<br/>
-        ///     The height of <paramref name="region"/> is less than or equal to zero.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public CropTransform(Rectangle region)
-        {
-            Region = region;
-        }
-
-        /// <summary>
-        /// Gets or sets the crop region.
-        /// </summary>
-        /// <exception cref="ArgumentOutOfRangeException">
-        ///     The X-position of <paramref name="value"/> is less than zero.<br/>
-        ///     -or-<br/>
-        ///     The Y-position of <paramref name="value"/> is less than zero.<br/>
-        ///     -or-<br/>
-        ///     The width of <paramref name="value"/> is less than or equal to zero.<br/>
-        ///     -or-<br/>
-        ///     The height of <paramref name="value"/> is less than or equal to zero.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public Rectangle Region
-        {
-            get { return _region; }
-            set
-            {
-
-                if (value.X < 0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(Region), value,
-                        "X position of the region can't be less than zero.");
-                }
-
-                if (value.Y < 0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(Region), value,
-                        "Y position of the region can't be less than zero.");
-                }
-
-                if (value.Width <= 0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(Region), value,
-                        "Width of the region can't be less than or equal zero.");
-                }
-
-                if (value.Height < 0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(Region), value,
-                        "Height of the region can't be less than or equal to zero.");
-                }
-
-                _region = value;
-            }
-        }
-
-        internal override void Configure(TransformHandle handle)
-        {
-            SetCropArea(handle, Region.Left, Region.Top, Region.Right, Region.Bottom);
-        }
-    }
-
-    /// <summary>
-    /// Resizes an image.
-    /// </summary>
-    /// <since_tizen> 4 </since_tizen>
-    public class ResizeTransform : ImageTransform
-    {
-        private Size _size;
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="ResizeTransform"/> class.
-        /// </summary>
-        /// <param name="size">The size that an image is resized to.</param>
-        /// <exception cref="ArgumentOutOfRangeException">
-        ///     The width of <paramref name="size"/> is less than or equal to zero.<br/>
-        ///     -or-<br/>
-        ///     The height of <paramref name="size"/> is less than or equal to zero.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public ResizeTransform(Size size)
-        {
-            Size = size;
-        }
-
-        /// <summary>
-        /// Gets or sets the size that an image is resized to.
-        /// </summary>
-        /// <exception cref="ArgumentOutOfRangeException">
-        ///     The width of <paramref name="value"/> is less than or equal to zero.<br/>
-        ///     -or-<br/>
-        ///     The height of <paramref name="value"/> is less than or equal to zero.
-        /// </exception>
-        /// <since_tizen> 4 </since_tizen>
-        public Size Size
-        {
-            get { return _size; }
-            set
-            {
-                if (value.Width <= 0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(Size), value,
-                        "Width of the size can't be less than or equal to zero.");
-                }
-
-                if (value.Height <= 0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(Size), value,
-                        "Height of the size can't be less than or equal to zero.");
-                }
+                Configure(handle);
 
-                _size = value;
+                return await RunAsync(handle, source);
             }
         }
-
-        internal override void Configure(TransformHandle handle)
-        {
-            SetResolution(handle, (uint)Size.Width, (uint)Size.Height);
-        }
     }
 }
diff --git a/src/Tizen.Multimedia.Util/ImageUtil/ImageTransformCollection.cs b/src/Tizen.Multimedia.Util/ImageUtil/ImageTransformCollection.cs
new file mode 100644 (file)
index 0000000..9406044
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace Tizen.Multimedia.Util
+{
+    /// <summary>
+    /// Represents a collection of <see cref="ImageTransform"/> objects that can be individually accessed by index.
+    /// </summary>
+    /// <since_tizen> 4 </since_tizen>
+    public class ImageTransformCollection : IEnumerable<ImageTransform>, IList<ImageTransform>
+    {
+        private List<ImageTransform> _list = new List<ImageTransform>();
+
+        /// <summary>
+        /// Initializes a new instance of the ImageTransformCollection class.
+        /// </summary>
+        /// <since_tizen> 4 </since_tizen>
+        public ImageTransformCollection()
+        {
+        }
+
+        /// <summary>
+        /// Gets or sets the <see cref="ImageTransform"/> at the specified index.
+        /// </summary>
+        /// <param name="index">The zero-based index of the <see cref="ImageTransform"/> to get or set.</param>
+        /// <value>The <see cref="ImageTransform"/> at the specified index.</value>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     index is less than 0.<br/>
+        ///     -or-<br/>
+        ///     index is equal to or greater than <see cref="Count"/>.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public ImageTransform this[int index]
+        {
+            get { return _list[index]; }
+            set { _list[index] = value; }
+        }
+
+        /// <summary>
+        /// Gets the number of items contained in the TransformCollection.
+        /// </summary>
+        /// <since_tizen> 4 </since_tizen>
+        public int Count => _list.Count;
+
+        bool ICollection<ImageTransform>.IsReadOnly => false;
+
+        /// <summary>
+        /// Adds a <see cref="ImageTransform"/> to the end of the collection.
+        /// </summary>
+        /// <param name="item">The <see cref="ImageTransform"/> to add.</param>
+        /// <remarks>
+        /// <see cref="ImageTransformCollection"/> accepts null as a valid value for reference types and allows duplicate elements.
+        /// </remarks>
+        /// <since_tizen> 4 </since_tizen>
+        public void Add(ImageTransform item)
+        {
+            if (item == null)
+            {
+                throw new ArgumentNullException(nameof(item));
+            }
+            _list.Add(item);
+        }
+
+        /// <summary>
+        /// Removes all items.
+        /// </summary>
+        /// <since_tizen> 4 </since_tizen>
+        public void Clear() => _list.Clear();
+
+        /// <summary>
+        /// Determines whether the <see cref="ImageTransformCollection"/> contains the specified item.
+        /// </summary>
+        /// <param name="item">The <see cref="ImageTransform"/> to locate in the collection.</param>
+        /// <returns>true if the <see cref="ImageTransform"/> is found in the collection; otherwise, false.</returns>
+        /// <since_tizen> 4 </since_tizen>
+        public bool Contains(ImageTransform item) => _list.Contains(item);
+
+        /// <summary>
+        /// Copies the items of the collection to an array, starting at the specified array index.
+        /// </summary>
+        /// <param name="array">The one-dimensional array that is the destination of the items copied from the collection.</param>
+        /// <param name="arrayIndex">The zero-based index in array at which copying begins.</param>
+        /// <exception cref="ArgumentNullException"><paramref name="array"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="arrayIndex"/> is less than 0.</exception>
+        /// <exception cref="ArgumentException">
+        /// The number of elements in the source collection is greater than the available space from arrayIndex to the end of the destination array.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public void CopyTo(ImageTransform[] array, int arrayIndex) => _list.CopyTo(array, arrayIndex);
+
+        /// <summary>
+        /// Determines the index of the specified item in the collection.
+        /// </summary>
+        /// <param name="item">The <see cref="ImageTransform"/> to locate in the collection.</param>
+        /// <returns>The index of value if found in the <see cref="ImageTransformCollection"/>; otherwise, -1.</returns>
+        /// <since_tizen> 4 </since_tizen>
+        public int IndexOf(ImageTransform item) => _list.IndexOf(item);
+
+        /// <summary>
+        /// Inserts a <see cref="ImageTransform"/> into the collection at the specified index.
+        /// </summary>
+        /// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+        /// <param name="item">The <see cref="ImageTransform"/> to insert into the collection.</param>
+        /// <exception cref="ArgumentNullException"><paramref name="item"/> is null.</exception>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     index is less than 0.<br/>
+        ///     -or-<br/>
+        ///     index is greater than <see cref="Count"/>.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public void Insert(int index, ImageTransform item)
+        {
+            if (item == null)
+            {
+                throw new ArgumentNullException(nameof(item));
+            }
+            _list.Insert(index, item);
+        }
+
+        /// <summary>
+        /// Removes the first occurrence of the specified <see cref="ImageTransform"/> from the collection.
+        /// </summary>
+        /// <param name="item">The <see cref="ImageTransform"/> to remove.</param>
+        /// <returns>true if <paramref name="item"/> was removed from the collection; otherwise, false.</returns>
+        /// <since_tizen> 4 </since_tizen>
+        public bool Remove(ImageTransform item) => _list.Remove(item);
+
+        /// <summary>
+        /// Removes the <see cref="ImageTransform"/> at the specified index.
+        /// </summary>
+        /// <param name="index">The zero-based index to remove.</param>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     index is less than 0.<br/>
+        ///     -or-<br/>
+        ///     index is equal to or greater than <see cref="Count"/>.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public void RemoveAt(int index) => _list.RemoveAt(index);
+
+        /// <summary>
+        /// Returns an enumerator that can iterate through the collection.
+        /// </summary>
+        /// <returns>An enumerator that can be used to iterate through the collection.</returns>
+        /// <since_tizen> 4 </since_tizen>
+        public IEnumerator<ImageTransform> GetEnumerator() => _list.GetEnumerator();
+
+        IEnumerator IEnumerable.GetEnumerator() => _list.GetEnumerator();
+    }
+}
diff --git a/src/Tizen.Multimedia.Util/ImageUtil/ImageTransformGroup.cs b/src/Tizen.Multimedia.Util/ImageUtil/ImageTransformGroup.cs
new file mode 100644 (file)
index 0000000..e445d09
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+using System.Threading.Tasks;
+using static Interop.ImageUtil;
+
+namespace Tizen.Multimedia.Util
+{
+    // TODO need to improve performance
+    /// <summary>
+    /// Represents a <see cref="ImageTransform"/> that is a composite of the transforms.
+    /// </summary>
+    /// <since_tizen> 4 </since_tizen>
+    public class ImageTransformGroup : ImageTransform
+    {
+        /// <summary>
+        /// Gets or sets the <see cref="ImageTransformCollection"/>.
+        /// </summary>
+        /// <since_tizen> 4 </since_tizen>
+        public ImageTransformCollection Children { get; set; }
+
+        /// <summary>
+        /// Initializes a new instance of the ImageTransformGroup class.
+        /// </summary>
+        /// <since_tizen> 4 </since_tizen>
+        public ImageTransformGroup()
+        {
+            Children = new ImageTransformCollection();
+        }
+
+        internal override void Configure(TransformHandle handle)
+        {
+            // intended blank
+        }
+
+        internal override async Task<MediaPacket> ApplyAsync(MediaPacket source)
+        {
+            if (Children.Count == 0)
+            {
+                return source;
+            }
+
+            var items = Children;
+
+            MediaPacket curPacket = await items[0].ApplyAsync(source);
+
+            for (int i = 1; i < items.Count; ++i)
+            {
+                var oldPacket = curPacket;
+                try
+                {
+                    curPacket = await items[i].ApplyAsync(curPacket);
+                }
+                finally
+                {
+                    oldPacket.Dispose();
+                }
+            }
+
+            return curPacket;
+        }
+
+        internal override string GenerateNotSupportedErrorMessage(VideoMediaFormat format)
+        {
+            return null;
+        }
+    }
+}
index aa22ae7..dda3600 100644 (file)
@@ -44,8 +44,10 @@ namespace Tizen.Multimedia.Util
         ///     -or-<br/>
         ///     <paramref name="item"/> is null.
         /// </exception>
+        /// <exception cref="ArgumentException"><paramref name="source"/> is not video format.</exception>
         /// <exception cref="ObjectDisposedException">The <see cref="ImageTransformer"/> has already been disposed of.</exception>
         /// <exception cref="InvalidOperationException">Failed to apply <see cref="ImageTransform"/>.</exception>
+        /// <exception cref="NotSupportedException">Specified transformation is not supported.</exception>
         /// <since_tizen> 4 </since_tizen>
         public Task<MediaPacket> TransformAsync(MediaPacket source, ImageTransform item)
         {
@@ -64,6 +66,11 @@ namespace Tizen.Multimedia.Util
                 throw new ArgumentNullException(nameof(item));
             }
 
+            if (source.Format is VideoMediaFormat == false)
+            {
+                throw new ArgumentException("source is not video format.", nameof(source));
+            }
+
             return item.ApplyAsync(source);
         }
 
index 1c30321..ecb1ce3 100644 (file)
@@ -122,9 +122,7 @@ namespace Tizen.Multimedia.Util
                     "height can't be less than or equal to zero.");
             }
 
-
-            byte r, g, b;
-            ExtractColorFromMemory(buffer, size.Width, size.Height, out r, out g, out b)
+            ExtractColorFromMemory(buffer, size.Width, size.Height, out var r, out var g, out var b)
                 .ThrowIfFailed("Failed to extract color from buffer");
 
             return Color.FromRgb(r, g, b);
diff --git a/src/Tizen.Multimedia.Util/ImageUtil/ResizeTransform.cs b/src/Tizen.Multimedia.Util/ImageUtil/ResizeTransform.cs
new file mode 100644 (file)
index 0000000..8489134
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+using System;
+using static Interop.ImageUtil;
+using static Interop.ImageUtil.Transform;
+
+namespace Tizen.Multimedia.Util
+{
+    /// <summary>
+    /// Resizes an image.
+    /// </summary>
+    /// <since_tizen> 4 </since_tizen>
+    public class ResizeTransform : ImageTransform
+    {
+        private Size _size;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="ResizeTransform"/> class.
+        /// </summary>
+        /// <param name="size">The size that an image is resized to.</param>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     The width of <paramref name="size"/> is less than or equal to zero.<br/>
+        ///     -or-<br/>
+        ///     The height of <paramref name="size"/> is less than or equal to zero.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public ResizeTransform(Size size)
+        {
+            Size = size;
+        }
+
+        internal override string GenerateNotSupportedErrorMessage(VideoMediaFormat format)
+            => $"'{format.MimeType}' is not supported by ResizeTransform.";
+
+        /// <summary>
+        /// Gets or sets the size that an image is resized to.
+        /// </summary>
+        /// <exception cref="ArgumentOutOfRangeException">
+        ///     The width of <paramref name="value"/> is less than or equal to zero.<br/>
+        ///     -or-<br/>
+        ///     The height of <paramref name="value"/> is less than or equal to zero.
+        /// </exception>
+        /// <since_tizen> 4 </since_tizen>
+        public Size Size
+        {
+            get { return _size; }
+            set
+            {
+                if (value.Width <= 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(Size), value,
+                        "Width of the size can't be less than or equal to zero.");
+                }
+
+                if (value.Height <= 0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(Size), value,
+                        "Height of the size can't be less than or equal to zero.");
+                }
+
+                _size = value;
+            }
+        }
+
+        internal override void Configure(TransformHandle handle)
+        {
+            SetResolution(handle, (uint)Size.Width, (uint)Size.Height);
+        }
+    }
+}
diff --git a/src/Tizen.Multimedia.Util/ImageUtil/RotateTransform.cs b/src/Tizen.Multimedia.Util/ImageUtil/RotateTransform.cs
new file mode 100644 (file)
index 0000000..0470be0
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * 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.
+ */
+
+using System;
+using System.Diagnostics;
+using static Interop.ImageUtil;
+using static Interop.ImageUtil.Transform;
+
+namespace Tizen.Multimedia.Util
+{
+    /// <summary>
+    /// Rotates an image.
+    /// </summary>
+    /// <seealso cref="Rotation"/>
+    /// <since_tizen> 4 </since_tizen>
+    public class RotateTransform : ImageTransform
+    {
+        private Rotation _rotation;
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="RotateTransform"/> class.
+        /// </summary>
+        /// <param name="rotation">The value how to rotate an image.</param>
+        /// <exception cref="ArgumentException"><paramref name="rotation"/> is invalid.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="rotation"/> is <see cref="Rotation.Rotate90"/>.</exception>
+        /// <since_tizen> 4 </since_tizen>
+        public RotateTransform(Rotation rotation)
+        {
+            Rotation = rotation;
+        }
+
+        /// <summary>
+        /// Gets or sets the value how to rotate an image.
+        /// </summary>
+        /// <exception cref="ArgumentException"><paramref name="value"/> is invalid.</exception>
+        /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is <see cref="Rotation.Rotate90"/>.</exception>
+        /// <since_tizen> 4 </since_tizen>
+        public Rotation Rotation
+        {
+            get { return _rotation; }
+            set
+            {
+                ValidationUtil.ValidateEnum(typeof(Rotation), value, nameof(Rotation));
+
+                if (value == Rotation.Rotate0)
+                {
+                    throw new ArgumentOutOfRangeException(nameof(value), "Rotation can't be Rotate0.");
+                }
+
+                _rotation = value;
+            }
+        }
+
+        internal override string GenerateNotSupportedErrorMessage(VideoMediaFormat format)
+            => $"'{format.MimeType}' is not supported by RotateTransform.";
+
+        internal override void Configure(TransformHandle handle)
+        {
+            SetRotation(handle, GetImageRotation());
+        }
+
+        private ImageRotation GetImageRotation()
+        {
+            switch (Rotation)
+            {
+                case Rotation.Rotate90: return ImageRotation.Rotate90;
+                case Rotation.Rotate180: return ImageRotation.Rotate180;
+                case Rotation.Rotate270: return ImageRotation.Rotate270;
+            }
+
+            Debug.Fail("Rotation is invalid value!");
+            return ImageRotation.Rotate0;
+        }
+    }
+}