[csharp] Implement static methods for callbacks so they work on aot on iOS, use YogaRef to store pointer to managed YogaNode
This commit is contained in:
@@ -111,6 +111,13 @@ namespace Facebook.Yoga
|
||||
[return: MarshalAs(UnmanagedType.I1)]
|
||||
public static extern bool YGNodeGetHasNewLayout(YGNodeHandle node);
|
||||
|
||||
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern void YGNodeSetContext(YGNodeHandle node, IntPtr context);
|
||||
|
||||
[DllImport(DllName, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
|
||||
public static extern IntPtr YGNodeGetContext(IntPtr node);
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region YG_NODE_STYLE_PROPERTY
|
||||
|
@@ -37,9 +37,31 @@ namespace Facebook.Yoga
|
||||
throw new InvalidOperationException(message);
|
||||
}
|
||||
};
|
||||
#if __IOS__
|
||||
Native.YGInteropSetLogger(ManagedLogger);
|
||||
#else
|
||||
Native.YGInteropSetLogger(_managedLogger);
|
||||
#endif
|
||||
_initialized = true;
|
||||
}
|
||||
}
|
||||
|
||||
#if __IOS__
|
||||
delegate void ManagedLoggerCallback(YogaLogLevel level, string message);
|
||||
|
||||
[ObjCRuntime.MonoPInvokeCallback(typeof(ManagedLoggerCallback))]
|
||||
public static void ManagedLogger(YogaLogLevel level, string message)
|
||||
{
|
||||
if (Logger != null)
|
||||
{
|
||||
Logger(level, message);
|
||||
}
|
||||
|
||||
if (level == YogaLogLevel.Error)
|
||||
{
|
||||
throw new InvalidOperationException(message);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@@ -10,6 +10,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Facebook.Yoga
|
||||
@@ -546,6 +547,10 @@ namespace Facebook.Yoga
|
||||
{
|
||||
_measureFunction = measureFunction;
|
||||
_ygMeasureFunc = measureFunction != null ? MeasureInternal : (YogaMeasureFunc)null;
|
||||
|
||||
var handle = GCHandle.Alloc(this);
|
||||
Native.YGNodeSetContext(_ygNode, GCHandle.ToIntPtr(handle));
|
||||
|
||||
Native.YGNodeSetMeasureFunc(_ygNode, _ygMeasureFunc);
|
||||
}
|
||||
|
||||
@@ -553,6 +558,10 @@ namespace Facebook.Yoga
|
||||
{
|
||||
_baselineFunction = baselineFunction;
|
||||
_ygBaselineFunc = baselineFunction != null ? BaselineInternal : (YogaBaselineFunc)null;
|
||||
|
||||
var handle = GCHandle.Alloc(this);
|
||||
Native.YGNodeSetContext(_ygNode, GCHandle.ToIntPtr(handle));
|
||||
|
||||
Native.YGNodeSetBaselineFunc(_ygNode, _ygBaselineFunc);
|
||||
}
|
||||
|
||||
@@ -565,29 +574,47 @@ namespace Facebook.Yoga
|
||||
Native.YGNodeStyleGetDirection(_ygNode));
|
||||
}
|
||||
|
||||
private YogaSize MeasureInternal(
|
||||
#if __IOS__
|
||||
[ObjCRuntime.MonoPInvokeCallback(typeof(YogaMeasureFunc))]
|
||||
#endif
|
||||
private static YogaSize MeasureInternal(
|
||||
IntPtr node,
|
||||
float width,
|
||||
YogaMeasureMode widthMode,
|
||||
float height,
|
||||
YogaMeasureMode heightMode)
|
||||
{
|
||||
if (_measureFunction == null)
|
||||
|
||||
var yogaNodePointer = Native.YGNodeGetContext(node);
|
||||
|
||||
YogaNode yogaNode = GCHandle.FromIntPtr(yogaNodePointer).Target as YogaNode;
|
||||
|
||||
var measureFunction = yogaNode._measureFunction;
|
||||
if (measureFunction == null)
|
||||
{
|
||||
throw new InvalidOperationException("Measure function is not defined.");
|
||||
}
|
||||
|
||||
return _measureFunction(this, width, widthMode, height, heightMode);
|
||||
return measureFunction(yogaNode, width, widthMode, height, heightMode);
|
||||
}
|
||||
|
||||
private float BaselineInternal(IntPtr node, float width, float height)
|
||||
|
||||
#if __IOS__
|
||||
[ObjCRuntime.MonoPInvokeCallback(typeof(YogaBaselineFunc))]
|
||||
#endif
|
||||
private static float BaselineInternal(IntPtr node, float width, float height)
|
||||
{
|
||||
if (_baselineFunction == null)
|
||||
var yogaNodePointer = Native.YGNodeGetContext(node);
|
||||
|
||||
YogaNode yogaNode = GCHandle.FromIntPtr(yogaNodePointer).Target as YogaNode;
|
||||
|
||||
var baselineFunction = yogaNode._baselineFunction;
|
||||
if (baselineFunction == null)
|
||||
{
|
||||
throw new InvalidOperationException("Baseline function is not defined.");
|
||||
}
|
||||
|
||||
return _baselineFunction(this, width, height);
|
||||
return baselineFunction(yogaNode, width, height);
|
||||
}
|
||||
|
||||
public string Print(YogaPrintOptions options =
|
||||
|
Reference in New Issue
Block a user