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/GMSprite.cs

289 lines
5.4 KiB
C#

using System.Collections.Generic;
using System.IO;
namespace GMAssetCompiler
{
public class GMSprite
{
[Property("Width of the sprite", Category = "Extents")]
public int Width
{
get;
private set;
}
[Property("Height of the sprite", Category = "Extents")]
public int Height
{
get;
private set;
}
[Property("Left-most edge of the bounding box", Category = "Bounding Box")]
public int BBoxLeft
{
get;
private set;
}
[Property("Right-most edge of the bounding box", Category = "Bounding Box")]
public int BBoxRight
{
get;
private set;
}
[Property("Bottom-most edge of the bounding box", Category = "Bounding Box")]
public int BBoxBottom
{
get;
private set;
}
[Property("Top-most edge of the bounding box", Category = "Bounding Box")]
public int BBoxTop
{
get;
private set;
}
[Property("Transparent or not (use alpha blending while rendering??)", Category = "General")]
public bool Transparent
{
get;
private set;
}
[Property("Smooth or not (use smooth scalong while rendering??)", Category = "General")]
public bool Smooth
{
get;
private set;
}
[Property("Preload... or not...", Category = "General")]
public bool Preload
{
get;
private set;
}
[Property("Bounding Box Mode", Category = "General")]
public int BBoxMode
{
get;
private set;
}
[Property("true if collision checks will be performed for the sprite", Category = "General")]
public bool ColCheck
{
get;
private set;
}
[Property("X Origin of the sprite ", Category = "Extents")]
public int XOrig
{
get;
private set;
}
[Property("Y Origin of the sprite", Category = "Extents")]
public int YOrig
{
get;
private set;
}
[Property("blah blah", Disabled = true)]
public IList<GMBitmap32> Images
{
get;
private set;
}
[Property("Separate Masks?", Category = "GM8")]
public bool SepMasks
{
get;
private set;
}
[Property("masks", Disabled = true)]
public IList<byte[]> Masks
{
get;
private set;
}
public GMSprite(GMAssets _a, Stream _s)
{
int num = _s.ReadInteger();
switch (num)
{
case 542:
{
Width = _s.ReadInteger();
Height = _s.ReadInteger();
BBoxLeft = _s.ReadInteger();
BBoxRight = _s.ReadInteger();
BBoxBottom = _s.ReadInteger();
BBoxTop = _s.ReadInteger();
Transparent = _s.ReadBoolean();
Smooth = _s.ReadBoolean();
Preload = _s.ReadBoolean();
BBoxMode = _s.ReadInteger();
ColCheck = _s.ReadBoolean();
XOrig = _s.ReadInteger();
YOrig = _s.ReadInteger();
Images = new List<GMBitmap32>();
int num3 = _s.ReadInteger();
for (int k = 0; k < num3; k++)
{
Images.Add(new GMBitmap32(_s));
}
Masks = CreateMask();
break;
}
case 800:
case 810:
{
BBoxLeft = 99999999;
BBoxTop = 9999999;
BBoxRight = -9999999;
BBoxBottom = -9999999;
Transparent = true;
Preload = true;
ColCheck = true;
XOrig = _s.ReadInteger();
YOrig = _s.ReadInteger();
Images = new List<GMBitmap32>();
int num2 = _s.ReadInteger();
for (int i = 0; i < num2; i++)
{
GMBitmap32 gMBitmap = new GMBitmap32(_s);
Images.Add(gMBitmap);
Width = gMBitmap.Width;
Height = gMBitmap.Height;
}
if (num == 810)
{
switch (_s.ReadInteger())
{
case 0:
case 2:
case 3:
ColCheck = true;
break;
case 1:
ColCheck = false;
break;
}
}
Masks = new List<byte[]>();
SepMasks = _s.ReadBoolean();
if (num2 <= 0)
{
break;
}
if (SepMasks)
{
for (int j = 0; j < num2; j++)
{
Masks.Add(LoadMaskFromStream(_s));
}
}
else
{
Masks.Add(LoadMaskFromStream(_s));
}
break;
}
}
}
private byte[] LoadMaskFromStream(Stream _s)
{
byte[] array = null;
int num = _s.ReadInteger();
if (num == 800)
{
int num2 = _s.ReadInteger();
int num3 = _s.ReadInteger();
int num4 = _s.ReadInteger();
int num5 = _s.ReadInteger();
int num6 = _s.ReadInteger();
int num7 = _s.ReadInteger();
if (BBoxLeft > num4)
{
BBoxLeft = num4;
}
if (BBoxRight < num5)
{
BBoxRight = num5;
}
if (BBoxBottom < num6)
{
BBoxBottom = num6;
}
if (BBoxTop > num7)
{
BBoxTop = num7;
}
int num8 = (Width + 7) / 8;
array = new byte[num8 * Height];
for (int i = 0; i < num3; i++)
{
for (int j = 0; j < num2; j++)
{
array[i * num8 + j / 8] |= (byte)((_s.ReadBoolean() ? 1 : 0) << 7 - (j & 7));
}
}
}
return array;
}
public List<byte[]> CreateMask()
{
List<byte[]> result = null;
if (ColCheck && Transparent && Images.Count > 0)
{
result = new List<byte[]>();
{
foreach (GMBitmap32 image in Images)
{
int num = image.Width * 4;
int num2 = (image.Width + 7) / 8;
byte[] array = new byte[num2 * image.Height];
int num3 = 0;
int num4 = 0;
int num5 = 0;
while (num5 < image.Height)
{
int num6 = num3;
int num7 = 0;
while (num7 < image.Width)
{
int num8 = num7 / 8 + num4;
if (image.Data[num6 + 3] != 0)
{
array[num8] |= (byte)(1 << 7 - (num7 & 7));
}
num7++;
num6 += 4;
}
num5++;
num3 += num;
num4 += num2;
}
result.Add(array);
}
return result;
}
}
return result;
}
}
}