NSHelper.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132
  1. using SharpMetal.Foundation;
  2. using SharpMetal.ObjectiveCCore;
  3. using System.Runtime.Versioning;
  4. // ReSharper disable InconsistentNaming
  5. namespace Ryujinx.Graphics.Metal.SharpMetalExtensions
  6. {
  7. [SupportedOSPlatform("macOS")]
  8. public static class NSHelper
  9. {
  10. private static readonly Selector sel_getCStringMaxLengthEncoding = "getCString:maxLength:encoding:";
  11. private static readonly Selector sel_stringWithUTF8String = "stringWithUTF8String:";
  12. public static unsafe string ToDotNetString(this NSString source)
  13. {
  14. char[] sourceBuffer = new char[source.Length];
  15. fixed (char* pSourceBuffer = sourceBuffer)
  16. {
  17. ObjectiveC.bool_objc_msgSend(source,
  18. sel_getCStringMaxLengthEncoding,
  19. pSourceBuffer,
  20. source.MaximumLengthOfBytes(NSStringEncoding.UTF16) + 1,
  21. (ulong)NSStringEncoding.UTF16);
  22. }
  23. return new string(sourceBuffer);
  24. }
  25. public static NSString ToNSString(this string source)
  26. => new(ObjectiveC.IntPtr_objc_msgSend(new ObjectiveCClass(nameof(NSString)), sel_stringWithUTF8String, source));
  27. }
  28. }