From 51964a4caf3befe2a4694873a8b25a9ded4b99db Mon Sep 17 00:00:00 2001 From: Timothy Risi Date: Tue, 18 Jul 2017 08:51:27 -0800 Subject: [PATCH 1/5] [ImageIO] Update to Xcode 9 --- src/ImageIO/CGImageDestination.cs | 37 ++++++++++++++++- src/ImageIO/CGImageSource.cs | 37 +++++++++++++++++ src/imageio.cs | 66 +++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 1 deletion(-) diff --git a/src/ImageIO/CGImageDestination.cs b/src/ImageIO/CGImageDestination.cs index ee76b3c0bc4c..e1ca97724496 100644 --- a/src/ImageIO/CGImageDestination.cs +++ b/src/ImageIO/CGImageDestination.cs @@ -188,6 +188,31 @@ internal NSMutableDictionary ToDictionary () } #endif + [Watch (4,0), TV (11,0), Mac (10,13), iOS (11,0)] + public partial class CGImageAuxiliaryDataInfo { + public NSData DepthData { get; set; } + + public NSDictionary DepthDataDescription { get; set; } + + public CGImageMetadata Metadata { get; set; } + + internal NSMutableDictionary ToDictionary () + { + var dict = new NSMutableDictionary (); + + if (Metadata != null) + dict.LowlevelSetObject (Metadata.Handle, kMetadata.Handle); + + if (DepthDataDescription != null) + dict.LowlevelSetObject (DepthDataDescription.Handle, DataDescription.Handle); + + if (DepthData != null) + dict.LowlevelSetObject (DepthDataDescription.Handle, Data.Handle); + + return dict; + } + } + public class CGImageDestination : INativeObject, IDisposable { internal IntPtr handle; @@ -470,5 +495,15 @@ public bool CopyImageSource (CGImageSource image, CGImageDestinationOptions opti o.Dispose (); } } + + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] + [DllImport (Constants.ImageIOLibrary)] + static extern void CGImageDestinationAddAuxiliaryDataInfo (IntPtr /* CGImageDestinationRef* */ idst, IntPtr /* CFStringRef* */ auxiliaryImageDataType, IntPtr /* CFDictionaryRef* */ auxiliaryDataInfoDictionary); + + public void AddAuxiliaryDataInfo (CGImageDestination dest, CGImageAuxiliaryDataType auxiliaryImageDataType, CGImageAuxiliaryDataInfo auxiliaryDataInfo) + { + var dict = auxiliaryDataInfo == null ? null : auxiliaryDataInfo.ToDictionary (); + CGImageDestinationAddAuxiliaryDataInfo (dest.Handle, auxiliaryImageDataType.GetConstant ().Handle, dict == null ? IntPtr.Zero : dict.Handle); + } } -} +} \ No newline at end of file diff --git a/src/ImageIO/CGImageSource.cs b/src/ImageIO/CGImageSource.cs index d782b38dc83d..9e61ca04c0ae 100644 --- a/src/ImageIO/CGImageSource.cs +++ b/src/ImageIO/CGImageSource.cs @@ -376,5 +376,42 @@ public CGImageSourceStatus GetStatus (int index) { return CGImageSourceGetStatusAtIndex (handle, index); } + + [iOS(11,0)][Mac (10,13)][Watch(4,0)][TV(11,0)] + [DllImport (Constants.ImageIOLibrary)] + static extern IntPtr /* CFDictionaryRef* */ CGImageSourceCopyAuxiliaryDataInfoAtIndex (IntPtr /* CGImageSourceRef* */ isrc, nuint index, IntPtr /* CFStringRef* */ auxiliaryImageDataType); + + public CGImageAuxiliaryDataInfo CopyAuxiliaryDataInfo (CGImageSource imageSource, nuint index, CGImageAuxiliaryDataType auxiliaryImageDataType) + { + var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource.Handle, index, auxiliaryImageDataType.GetConstant ().Handle); + if (ptr == IntPtr.Zero) + return null; + + var dictionary = new NSDictionary (ptr); + + var info = new CGImageAuxiliaryDataInfo (); + + bool success; + + NSData data; + success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.Data, out data); + + if (success) + info.DepthData = data; + + NSDictionary dict; + success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.DataDescription, out dict); + + if (success) + info.DepthDataDescription = dict; + + CGImageMetadata metadata; + success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.kMetadata, out metadata); + + if (success) + info.Metadata = metadata; + + return info; + } } } diff --git a/src/imageio.cs b/src/imageio.cs index 6f4ee0134ede..37e0ed00193c 100644 --- a/src/imageio.cs +++ b/src/imageio.cs @@ -857,6 +857,50 @@ interface CGImageProperties { [Field ("kCGImagePropertyMakerAppleDictionary")] NSString MakerAppleDictionary { get; } #endif + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyImageCount")] + NSString ImageCount { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyWidth")] + NSString Width { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyHeight")] + NSString Height { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyBytesPerRow")] + NSString BytesPerRow { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyNamedColorSpace")] + NSString NamedColorSpace { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyPixelFormat")] + NSString PixelFormat { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyImages")] + NSString Images { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyThumbnailImages")] + NSString ThumbnailImages { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyAuxiliaryData")] + NSString AuxiliaryData { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyAuxiliaryDataType")] + NSString AuxiliaryDataType { get; } + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + [Field ("kCGImagePropertyFileContentsDictionary")] + NSString FileContentsDictionary { get; } } [Since (7,0), MountainLion] @@ -1169,4 +1213,26 @@ interface CGCopyImageSourceOptions { IntPtr kOrientation { get; } } #endif + + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + public enum CGImageAuxiliaryDataType { + [Field ("kCGImageAuxiliaryDataTypeDepth")] + Depth, + + [Field ("kCGImageAuxiliaryDataTypeDisparity")] + Disparity, + } + + [Partial] + [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] + public interface CGImageAuxiliaryDataInfo { + [Field ("kCGImageAuxiliaryDataInfoData")] + NSString Data { get; } + + [Field ("kCGImageAuxiliaryDataInfoDataDescription")] + NSString DataDescription { get; } + + [Field ("kCGImageAuxiliaryDataInfoMetadata")] + NSString kMetadata { get; } + } } From 3b95a186b915b37b4d6fa3f8fb883d324ea6f6f3 Mon Sep 17 00:00:00 2001 From: Timothy Risi Date: Fri, 21 Jul 2017 16:16:24 -0800 Subject: [PATCH 2/5] Fix PR comments --- src/ImageIO/CGImageDestination.cs | 5 +++-- src/ImageIO/CGImageSource.cs | 33 ++++++++++++++++--------------- src/imageio.cs | 4 ++-- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/ImageIO/CGImageDestination.cs b/src/ImageIO/CGImageDestination.cs index e1ca97724496..997857df2210 100644 --- a/src/ImageIO/CGImageDestination.cs +++ b/src/ImageIO/CGImageDestination.cs @@ -502,8 +502,9 @@ public bool CopyImageSource (CGImageSource image, CGImageDestinationOptions opti public void AddAuxiliaryDataInfo (CGImageDestination dest, CGImageAuxiliaryDataType auxiliaryImageDataType, CGImageAuxiliaryDataInfo auxiliaryDataInfo) { - var dict = auxiliaryDataInfo == null ? null : auxiliaryDataInfo.ToDictionary (); - CGImageDestinationAddAuxiliaryDataInfo (dest.Handle, auxiliaryImageDataType.GetConstant ().Handle, dict == null ? IntPtr.Zero : dict.Handle); + using (var dict = auxiliaryDataInfo?.ToDictionary ()) { + CGImageDestinationAddAuxiliaryDataInfo (NativeObjectHelper.GetHandle (dest), auxiliaryImageDataType.GetConstant ().Handle, dict == null ? IntPtr.Zero : dict.Handle); + } } } } \ No newline at end of file diff --git a/src/ImageIO/CGImageSource.cs b/src/ImageIO/CGImageSource.cs index 9e61ca04c0ae..9d0e04c53a07 100644 --- a/src/ImageIO/CGImageSource.cs +++ b/src/ImageIO/CGImageSource.cs @@ -383,35 +383,36 @@ public CGImageSourceStatus GetStatus (int index) public CGImageAuxiliaryDataInfo CopyAuxiliaryDataInfo (CGImageSource imageSource, nuint index, CGImageAuxiliaryDataType auxiliaryImageDataType) { - var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource.Handle, index, auxiliaryImageDataType.GetConstant ().Handle); + var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource?.Handle ?? IntPtr.Zero, index, auxiliaryImageDataType.GetConstant ().Handle); if (ptr == IntPtr.Zero) return null; - - var dictionary = new NSDictionary (ptr); var info = new CGImageAuxiliaryDataInfo (); - bool success; + using (var dictionary = Runtime.GetNSObject (ptr)) { + bool success; - NSData data; - success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.Data, out data); + NSData data; + success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.Data, out data); - if (success) - info.DepthData = data; + if (success) + info.DepthData = data; - NSDictionary dict; - success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.DataDescription, out dict); + NSDictionary dict; + success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.DataDescription, out dict); - if (success) - info.DepthDataDescription = dict; + if (success) + info.DepthDataDescription = dict; - CGImageMetadata metadata; - success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.kMetadata, out metadata); + CGImageMetadata metadata; + success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.kMetadata, out metadata); - if (success) - info.Metadata = metadata; + if (success) + info.Metadata = metadata; + } return info; + } } } diff --git a/src/imageio.cs b/src/imageio.cs index 37e0ed00193c..a0025177288e 100644 --- a/src/imageio.cs +++ b/src/imageio.cs @@ -1215,7 +1215,7 @@ interface CGCopyImageSourceOptions { #endif [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] - public enum CGImageAuxiliaryDataType { + enum CGImageAuxiliaryDataType { [Field ("kCGImageAuxiliaryDataTypeDepth")] Depth, @@ -1225,7 +1225,7 @@ public enum CGImageAuxiliaryDataType { [Partial] [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] - public interface CGImageAuxiliaryDataInfo { + interface CGImageAuxiliaryDataInfo { [Field ("kCGImageAuxiliaryDataInfoData")] NSString Data { get; } From 2bacb0ce5529e7aa973025d49f4720c78878a069 Mon Sep 17 00:00:00 2001 From: Timothy Risi Date: Tue, 25 Jul 2017 16:42:20 -0800 Subject: [PATCH 3/5] Mark fields internal and use IntPtrs. GetHandle instead of ?.Handle --- src/ImageIO/CGImageDestination.cs | 8 ++++---- src/ImageIO/CGImageSource.cs | 2 +- src/imageio.cs | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ImageIO/CGImageDestination.cs b/src/ImageIO/CGImageDestination.cs index 997857df2210..86452088202b 100644 --- a/src/ImageIO/CGImageDestination.cs +++ b/src/ImageIO/CGImageDestination.cs @@ -201,13 +201,13 @@ internal NSMutableDictionary ToDictionary () var dict = new NSMutableDictionary (); if (Metadata != null) - dict.LowlevelSetObject (Metadata.Handle, kMetadata.Handle); + dict.LowlevelSetObject (Metadata.Handle, kMetadata); if (DepthDataDescription != null) - dict.LowlevelSetObject (DepthDataDescription.Handle, DataDescription.Handle); + dict.LowlevelSetObject (DepthDataDescription.Handle, DataDescription); if (DepthData != null) - dict.LowlevelSetObject (DepthDataDescription.Handle, Data.Handle); + dict.LowlevelSetObject (DepthDataDescription.Handle, Data); return dict; } @@ -503,7 +503,7 @@ public bool CopyImageSource (CGImageSource image, CGImageDestinationOptions opti public void AddAuxiliaryDataInfo (CGImageDestination dest, CGImageAuxiliaryDataType auxiliaryImageDataType, CGImageAuxiliaryDataInfo auxiliaryDataInfo) { using (var dict = auxiliaryDataInfo?.ToDictionary ()) { - CGImageDestinationAddAuxiliaryDataInfo (NativeObjectHelper.GetHandle (dest), auxiliaryImageDataType.GetConstant ().Handle, dict == null ? IntPtr.Zero : dict.Handle); + CGImageDestinationAddAuxiliaryDataInfo (dest.GetHandle (), auxiliaryImageDataType.GetConstant ().GetHandle (), dict == null ? IntPtr.Zero : dict.GetHandle ()); } } } diff --git a/src/ImageIO/CGImageSource.cs b/src/ImageIO/CGImageSource.cs index 9d0e04c53a07..035aea6adf03 100644 --- a/src/ImageIO/CGImageSource.cs +++ b/src/ImageIO/CGImageSource.cs @@ -383,7 +383,7 @@ public CGImageSourceStatus GetStatus (int index) public CGImageAuxiliaryDataInfo CopyAuxiliaryDataInfo (CGImageSource imageSource, nuint index, CGImageAuxiliaryDataType auxiliaryImageDataType) { - var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource?.Handle ?? IntPtr.Zero, index, auxiliaryImageDataType.GetConstant ().Handle); + var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource.GetHandle () ?? IntPtr.Zero, index, auxiliaryImageDataType.GetConstant ().GetHandle ()); if (ptr == IntPtr.Zero) return null; diff --git a/src/imageio.cs b/src/imageio.cs index a0025177288e..5b0ffb2be6ed 100644 --- a/src/imageio.cs +++ b/src/imageio.cs @@ -1226,13 +1226,13 @@ enum CGImageAuxiliaryDataType { [Partial] [Mac (10, 13), iOS (11,0), TV (11,0), Watch (4,0)] interface CGImageAuxiliaryDataInfo { - [Field ("kCGImageAuxiliaryDataInfoData")] - NSString Data { get; } + [Internal, Field ("kCGImageAuxiliaryDataInfoData")] + IntPtr Data { get; } - [Field ("kCGImageAuxiliaryDataInfoDataDescription")] - NSString DataDescription { get; } + [Internal, Field ("kCGImageAuxiliaryDataInfoDataDescription")] + IntPtr DataDescription { get; } - [Field ("kCGImageAuxiliaryDataInfoMetadata")] - NSString kMetadata { get; } + [Internal, Field ("kCGImageAuxiliaryDataInfoMetadata")] + IntPtr kMetadata { get; } } } From 4cc16ecfdda643c736f6529edfffeb407081964a Mon Sep 17 00:00:00 2001 From: Timothy Risi Date: Tue, 25 Jul 2017 16:51:32 -0800 Subject: [PATCH 4/5] Fix build issues --- src/ImageIO/CGImageDestination.cs | 2 +- src/ImageIO/CGImageSource.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ImageIO/CGImageDestination.cs b/src/ImageIO/CGImageDestination.cs index 86452088202b..4e02ab13d518 100644 --- a/src/ImageIO/CGImageDestination.cs +++ b/src/ImageIO/CGImageDestination.cs @@ -503,7 +503,7 @@ public bool CopyImageSource (CGImageSource image, CGImageDestinationOptions opti public void AddAuxiliaryDataInfo (CGImageDestination dest, CGImageAuxiliaryDataType auxiliaryImageDataType, CGImageAuxiliaryDataInfo auxiliaryDataInfo) { using (var dict = auxiliaryDataInfo?.ToDictionary ()) { - CGImageDestinationAddAuxiliaryDataInfo (dest.GetHandle (), auxiliaryImageDataType.GetConstant ().GetHandle (), dict == null ? IntPtr.Zero : dict.GetHandle ()); + CGImageDestinationAddAuxiliaryDataInfo (dest.GetHandle (), auxiliaryImageDataType.GetConstant ().GetHandle (), dict.GetHandle ()); } } } diff --git a/src/ImageIO/CGImageSource.cs b/src/ImageIO/CGImageSource.cs index 035aea6adf03..5064918a6595 100644 --- a/src/ImageIO/CGImageSource.cs +++ b/src/ImageIO/CGImageSource.cs @@ -383,7 +383,7 @@ public CGImageSourceStatus GetStatus (int index) public CGImageAuxiliaryDataInfo CopyAuxiliaryDataInfo (CGImageSource imageSource, nuint index, CGImageAuxiliaryDataType auxiliaryImageDataType) { - var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource.GetHandle () ?? IntPtr.Zero, index, auxiliaryImageDataType.GetConstant ().GetHandle ()); + var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource.GetHandle (), index, auxiliaryImageDataType.GetConstant ().GetHandle ()); if (ptr == IntPtr.Zero) return null; @@ -393,19 +393,19 @@ public CGImageAuxiliaryDataInfo CopyAuxiliaryDataInfo (CGImageSource imageSource bool success; NSData data; - success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.Data, out data); + success = dictionary.TryGetValue (new NSString (CGImageAuxiliaryDataInfo.Data), out data); if (success) info.DepthData = data; NSDictionary dict; - success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.DataDescription, out dict); + success = dictionary.TryGetValue (new NSString (CGImageAuxiliaryDataInfo.DataDescription), out dict); if (success) info.DepthDataDescription = dict; CGImageMetadata metadata; - success = dictionary.TryGetValue (CGImageAuxiliaryDataInfo.kMetadata, out metadata); + success = dictionary.TryGetValue (new NSString (CGImageAuxiliaryDataInfo.kMetadata), out metadata); if (success) info.Metadata = metadata; From e8ab921ca5d2e8adcc2df6922edd9825778eec5c Mon Sep 17 00:00:00 2001 From: Timothy Risi Date: Wed, 26 Jul 2017 11:51:32 -0800 Subject: [PATCH 5/5] Add missing availability attributes --- src/ImageIO/CGImageDestination.cs | 1 + src/ImageIO/CGImageSource.cs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ImageIO/CGImageDestination.cs b/src/ImageIO/CGImageDestination.cs index 4e02ab13d518..39a1edb738df 100644 --- a/src/ImageIO/CGImageDestination.cs +++ b/src/ImageIO/CGImageDestination.cs @@ -500,6 +500,7 @@ public bool CopyImageSource (CGImageSource image, CGImageDestinationOptions opti [DllImport (Constants.ImageIOLibrary)] static extern void CGImageDestinationAddAuxiliaryDataInfo (IntPtr /* CGImageDestinationRef* */ idst, IntPtr /* CFStringRef* */ auxiliaryImageDataType, IntPtr /* CFDictionaryRef* */ auxiliaryDataInfoDictionary); + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] public void AddAuxiliaryDataInfo (CGImageDestination dest, CGImageAuxiliaryDataType auxiliaryImageDataType, CGImageAuxiliaryDataInfo auxiliaryDataInfo) { using (var dict = auxiliaryDataInfo?.ToDictionary ()) { diff --git a/src/ImageIO/CGImageSource.cs b/src/ImageIO/CGImageSource.cs index 5064918a6595..290cc5e0285c 100644 --- a/src/ImageIO/CGImageSource.cs +++ b/src/ImageIO/CGImageSource.cs @@ -377,10 +377,11 @@ public CGImageSourceStatus GetStatus (int index) return CGImageSourceGetStatusAtIndex (handle, index); } - [iOS(11,0)][Mac (10,13)][Watch(4,0)][TV(11,0)] + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] [DllImport (Constants.ImageIOLibrary)] static extern IntPtr /* CFDictionaryRef* */ CGImageSourceCopyAuxiliaryDataInfoAtIndex (IntPtr /* CGImageSourceRef* */ isrc, nuint index, IntPtr /* CFStringRef* */ auxiliaryImageDataType); + [Watch (4, 0), TV (11, 0), Mac (10, 13), iOS (11, 0)] public CGImageAuxiliaryDataInfo CopyAuxiliaryDataInfo (CGImageSource imageSource, nuint index, CGImageAuxiliaryDataType auxiliaryImageDataType) { var ptr = CGImageSourceCopyAuxiliaryDataInfoAtIndex (imageSource.GetHandle (), index, auxiliaryImageDataType.GetConstant ().GetHandle ());