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

100 lines
2.0 KiB
C#

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
namespace GMAssetCompiler
{
public class GMBitmap32
{
public int Width
{
get;
private set;
}
public int Height
{
get;
private set;
}
public byte[] Data
{
get;
private set;
}
public Bitmap Bitmap
{
get
{
Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
Rectangle rect = new Rectangle(0, 0, Width, Height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
IntPtr intPtr = bitmapData.Scan0;
int num = 0;
int num2 = 0;
while (num2 < Height)
{
int num3 = num;
IntPtr ptr = intPtr;
int num4 = 0;
while (num4 < Width)
{
int val = Data[num3] + (Data[num3 + 1] << 8) + (Data[num3 + 2] << 16) + (Data[num3 + 3] << 24);
Marshal.WriteInt32(ptr, val);
num4++;
ptr = new IntPtr(ptr.ToInt64() + 4);
num3 += 4;
}
num2++;
intPtr = new IntPtr(intPtr.ToInt64() + bitmapData.Stride);
num += Width * 4;
}
bitmap.UnlockBits(bitmapData);
return bitmap;
}
}
public GMBitmap32(Stream _s)
{
switch (_s.ReadInteger())
{
case 540:
if (_s.ReadBoolean())
{
Width = _s.ReadInteger();
Height = _s.ReadInteger();
int width = Width;
int height = Height;
Data = _s.ReadCompressedStream();
}
break;
case 800:
Width = _s.ReadInteger();
Height = _s.ReadInteger();
Data = _s.ReadStream();
break;
}
}
public void SetAlphaFromBitmap(GMBitmap32 _other)
{
int num = Math.Min(Width, _other.Width);
int num2 = Math.Min(Height, _other.Height);
for (int i = 0; i < num2; i++)
{
for (int j = 0; j < num; j++)
{
int num3 = j * 4 + i * _other.Width * 4;
int num4 = j * 4 + i * Width * 4;
int val = (_other.Data[num4] + _other.Data[num4 + 1] + _other.Data[num4 + 2]) / 3;
Data[num3 + 3] = (byte)Math.Min(_other.Data[num4 + 3], val);
}
}
}
}
}