in debugger/debugger-worker/src/Evaluation/UnityTextureAdditionalPropertiesProvider.cs [136:213]
private UnityTextureAdditionalActionResult GetTextureInfo(
IEnumerable<IFieldValueReference<Value>> heightReferences,
IValueFetchOptions valueFetchOptions, Lifetime lifetime)
{
var width = -1;
var height = -1;
List<int>? pixels = null;
var originalWidth = -1;
var originalHeight = -1;
string? graphicsTextureFormat = null;
string? textureName = null;
var hasAlphaChannel = false;
var hasError = false;
foreach (var valueReference in heightReferences)
{
if (lifetime.IsNotAlive)
return new UnityTextureAdditionalActionResult(null, null, true);
switch (valueReference.DefaultName)
{
case nameof(UnityTextureInfo.Height):
height = (int)(valueReference.AsPrimitiveSafe(valueFetchOptions)?.GetPrimitive() ?? height);
break;
case nameof(UnityTextureInfo.Width):
width = (int)(valueReference.AsPrimitiveSafe(valueFetchOptions)?.GetPrimitive() ?? width);
break;
case nameof(UnityTextureInfo.OriginalHeight):
originalHeight = (int)(valueReference.AsPrimitiveSafe(valueFetchOptions)?.GetPrimitive() ??
originalHeight);
break;
case nameof(UnityTextureInfo.OriginalWidth):
originalWidth = (int)(valueReference.AsPrimitiveSafe(valueFetchOptions)?.GetPrimitive() ??
originalWidth);
break;
case nameof(UnityTextureInfo.HasAlphaChannel):
hasAlphaChannel = (bool)(valueReference.AsPrimitiveSafe(valueFetchOptions)?.GetPrimitive() ??
hasAlphaChannel);
break;
case nameof(UnityTextureInfo.Pixels):
var arrayValueRole = valueReference.AsArray(valueFetchOptions);
var length = arrayValueRole.Dimensions[0];
var values = (valueReference.GetValue(valueFetchOptions) as ArrayMirror)?.GetValues(0, length);
if (values == null)
{
hasError = true;
break;
}
pixels = new List<int>(length);
for (int i = 0; i < length; i++)
{
pixels.Add((int)((PrimitiveValue)values[i]).Value);
}
break;
case nameof(UnityTextureInfo.TextureName):
textureName = valueReference.AsStringSafe(valueFetchOptions)?.GetString();
break;
case nameof(UnityTextureInfo.GraphicsTextureFormat):
graphicsTextureFormat = valueReference.AsStringSafe(valueFetchOptions)?.GetString();
break;
}
}
if (hasError
|| width < 0 || height < 0 //value validation
|| pixels == null
|| originalHeight < 0 || originalWidth < 0
|| graphicsTextureFormat == null || textureName == null)
return Error(Strings.UnityTextureDubuggingCannotParseTextureInfo);
return new UnityTextureAdditionalActionResult(null, new UnityTextureInfo(width, height, pixels,
originalWidth, originalHeight, graphicsTextureFormat,
textureName, hasAlphaChannel), false);
}