2013-06-25 23:16:43 -07:00
|
|
|
/* SDL2# - C# Wrapper for SDL2
|
|
|
|
*
|
2016-01-04 11:55:36 -05:00
|
|
|
* Copyright (c) 2013-2016 Ethan Lee.
|
2013-06-25 23:16:43 -07:00
|
|
|
*
|
|
|
|
* This software is provided 'as-is', without any express or implied warranty.
|
|
|
|
* In no event will the authors be held liable for any damages arising from
|
|
|
|
* the use of this software.
|
|
|
|
*
|
|
|
|
* Permission is granted to anyone to use this software for any purpose,
|
|
|
|
* including commercial applications, and to alter it and redistribute it
|
|
|
|
* freely, subject to the following restrictions:
|
|
|
|
*
|
|
|
|
* 1. The origin of this software must not be misrepresented; you must not
|
|
|
|
* claim that you wrote the original software. If you use this software in a
|
|
|
|
* product, an acknowledgment in the product documentation would be
|
|
|
|
* appreciated but is not required.
|
|
|
|
*
|
|
|
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
|
|
* misrepresented as being the original software.
|
|
|
|
*
|
|
|
|
* 3. This notice may not be removed or altered from any source distribution.
|
|
|
|
*
|
|
|
|
* Ethan "flibitijibibo" Lee <flibitijibibo@flibitijibibo.com>
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2013-06-25 21:36:38 -07:00
|
|
|
using System;
|
|
|
|
using System.Text;
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
2013-06-25 23:16:43 -07:00
|
|
|
namespace SDL2
|
|
|
|
{
|
|
|
|
internal unsafe class LPUtf8StrMarshaler : ICustomMarshaler
|
|
|
|
{
|
2013-06-26 11:02:44 -07:00
|
|
|
public const string LeaveAllocated = "LeaveAllocated";
|
|
|
|
|
|
|
|
private static ICustomMarshaler
|
|
|
|
_leaveAllocatedInstance = new LPUtf8StrMarshaler(true),
|
|
|
|
_defaultInstance = new LPUtf8StrMarshaler(false);
|
2013-06-25 21:36:38 -07:00
|
|
|
|
2013-07-14 17:40:12 -07:00
|
|
|
public static ICustomMarshaler GetInstance(string cookie)
|
2013-06-25 23:16:43 -07:00
|
|
|
{
|
2013-06-26 11:02:44 -07:00
|
|
|
switch (cookie)
|
|
|
|
{
|
|
|
|
case "LeaveAllocated":
|
|
|
|
return _leaveAllocatedInstance;
|
|
|
|
default:
|
|
|
|
return _defaultInstance;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private bool _leaveAllocated;
|
|
|
|
|
|
|
|
public LPUtf8StrMarshaler(bool leaveAllocated)
|
|
|
|
{
|
|
|
|
_leaveAllocated = leaveAllocated;
|
2013-06-25 21:36:38 -07:00
|
|
|
}
|
|
|
|
|
2013-06-25 23:16:43 -07:00
|
|
|
public object MarshalNativeToManaged(IntPtr pNativeData)
|
|
|
|
{
|
2013-06-26 11:02:44 -07:00
|
|
|
if (pNativeData == IntPtr.Zero)
|
|
|
|
return null;
|
2013-06-25 21:36:38 -07:00
|
|
|
var ptr = (byte*)pNativeData;
|
|
|
|
while (*ptr != 0)
|
2013-06-25 23:16:43 -07:00
|
|
|
{
|
2013-06-25 21:36:38 -07:00
|
|
|
ptr++;
|
2013-06-25 23:16:43 -07:00
|
|
|
}
|
2013-06-25 21:36:38 -07:00
|
|
|
var bytes = new byte[ptr - (byte*)pNativeData];
|
|
|
|
Marshal.Copy(pNativeData, bytes, 0, bytes.Length);
|
|
|
|
return Encoding.UTF8.GetString(bytes);
|
|
|
|
}
|
|
|
|
|
2013-06-25 23:16:43 -07:00
|
|
|
public IntPtr MarshalManagedToNative(object ManagedObj)
|
|
|
|
{
|
2013-06-26 11:02:44 -07:00
|
|
|
if (ManagedObj == null)
|
|
|
|
return IntPtr.Zero;
|
2013-06-25 21:36:38 -07:00
|
|
|
var str = ManagedObj as string;
|
|
|
|
if (str == null)
|
2013-06-25 23:16:43 -07:00
|
|
|
{
|
2013-06-25 21:36:38 -07:00
|
|
|
throw new ArgumentException("ManagedObj must be a string.", "ManagedObj");
|
2013-06-25 23:16:43 -07:00
|
|
|
}
|
2013-06-25 21:36:38 -07:00
|
|
|
var bytes = Encoding.UTF8.GetBytes(str);
|
2015-12-30 19:14:29 -05:00
|
|
|
var mem = SDL.SDL_malloc((IntPtr) (bytes.Length + 1));
|
2013-06-25 21:36:38 -07:00
|
|
|
Marshal.Copy(bytes, 0, mem, bytes.Length);
|
|
|
|
((byte*)mem)[bytes.Length] = 0;
|
|
|
|
return mem;
|
|
|
|
}
|
|
|
|
|
2013-06-26 11:02:44 -07:00
|
|
|
public void CleanUpManagedData(object ManagedObj)
|
2013-06-25 23:16:43 -07:00
|
|
|
{
|
2013-06-25 21:36:38 -07:00
|
|
|
}
|
|
|
|
|
2013-06-26 11:02:44 -07:00
|
|
|
public void CleanUpNativeData(IntPtr pNativeData)
|
2013-06-25 23:16:43 -07:00
|
|
|
{
|
2013-06-26 11:02:44 -07:00
|
|
|
if (!_leaveAllocated)
|
|
|
|
{
|
2015-07-20 10:03:42 -04:00
|
|
|
SDL.SDL_free(pNativeData);
|
2013-06-26 11:02:44 -07:00
|
|
|
}
|
2013-06-25 21:36:38 -07:00
|
|
|
}
|
|
|
|
|
2013-06-26 11:02:44 -07:00
|
|
|
public int GetNativeDataSize ()
|
2013-06-25 23:16:43 -07:00
|
|
|
{
|
2013-06-25 21:36:38 -07:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|