This repository has been archived on 2024-04-07. You can view files and clone it, but cannot push or open issues or pull requests.
chovy-gm/GMAssetCompiler/View.cs

151 lines
3.6 KiB
C#

using Flobbster.Windows.Forms;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Reflection;
using System.Runtime.InteropServices;
namespace GMAssetCompiler
{
public class View<T> : IPropertyGrid
{
protected T m_this;
protected PropertyInfo[] m_props;
public View(T _entry)
{
m_this = _entry;
Type typeFromHandle = typeof(T);
m_props = typeFromHandle.GetProperties();
}
public PropertyBag Prepare()
{
PropertyBag propertyBag = new PropertyBag();
propertyBag.GetValue += GetValue;
PropertyInfo[] props = m_props;
foreach (PropertyInfo propertyInfo in props)
{
string name = propertyInfo.Name;
string description = string.Empty;
string category = "default";
object defaultValue = null;
object[] customAttributes = propertyInfo.GetCustomAttributes(true);
PropertyAttribute propertyAttribute = null;
object[] array = customAttributes;
foreach (object obj in array)
{
propertyAttribute = (obj as PropertyAttribute);
if (propertyAttribute != null)
{
description = propertyAttribute.Description;
if (!string.IsNullOrEmpty(propertyAttribute.Category))
{
category = propertyAttribute.Category;
}
defaultValue = propertyAttribute.Default;
if (!string.IsNullOrEmpty(propertyAttribute.Name))
{
name = propertyAttribute.Name;
}
break;
}
}
if (propertyAttribute == null || !propertyAttribute.Disabled)
{
PropertySpec value = new PropertySpec(name, propertyInfo.PropertyType, category, description, defaultValue);
propertyBag.Properties.Add(value);
}
}
return propertyBag;
}
private void GetValue(object _sender, PropertySpecEventArgs _e)
{
PropertyInfo[] props = m_props;
int num = 0;
PropertyInfo propertyInfo;
while (true)
{
if (num < props.Length)
{
propertyInfo = props[num];
if (propertyInfo.Name == _e.Property.Name)
{
break;
}
num++;
continue;
}
return;
}
_e.Value = propertyInfo.GetGetMethod().Invoke(m_this, null);
}
public virtual Image PrepareImage()
{
return null;
}
protected void CopyBits(BitmapData _data, int _x, int _y, GMBitmap32 _bmp)
{
IntPtr intPtr = new IntPtr(_data.Scan0.ToInt64() + _y * _data.Stride + _x * 4);
int num = 0;
int num2 = 0;
while (num2 < _bmp.Height)
{
int num3 = num;
IntPtr ptr = intPtr;
int num4 = 0;
while (num4 < _bmp.Width)
{
int val = _bmp.Data[num3] + (_bmp.Data[num3 + 1] << 8) + (_bmp.Data[num3 + 2] << 16) + ((0xFF | _bmp.Data[num3 + 3]) << 24);
Marshal.WriteInt32(ptr, val);
num4++;
num3 += 4;
ptr = new IntPtr(ptr.ToInt64() + 4);
}
num2++;
intPtr = new IntPtr(intPtr.ToInt64() + _data.Stride);
num += _bmp.Width * 4;
}
}
protected void CopyBits(BitmapData _data, int _x, int _y, byte[] _mask, int _width, int _height)
{
IntPtr intPtr = new IntPtr(_data.Scan0.ToInt64() + _y * _data.Stride + _x * 4);
int num = (_width + 7) / 8;
int num2 = 0;
int num3 = 0;
while (num3 < _height)
{
int num4 = num2;
IntPtr ptr = intPtr;
byte b = 128;
int num5 = 0;
while (num5 < _width)
{
if (b == 0)
{
b = 128;
num4++;
}
int val = 16777215;
if ((_mask[num4] & b) != 0)
{
val = -16777216;
}
Marshal.WriteInt32(ptr, val);
num5++;
b = (byte)(b >> 1);
ptr = new IntPtr(ptr.ToInt64() + 4);
}
num3++;
intPtr = new IntPtr(intPtr.ToInt64() + _data.Stride);
num2 += num;
}
}
}
}