You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
5.7 KiB
C#

using NetMFAPatcher.Utils;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
namespace NetMFAPatcher.Chunks
{
class ImageBank:ChunkLoader
{
public override void Print()
{
}
public override void Read()
{
reader = new ByteIO(chunk.chunk_data);
var number_of_items = reader.ReadUInt32();
Console.WriteLine("Total images: "+number_of_items);
Console.WriteLine("OnImageBankStart: " + reader.Tell());
for (int i = 0; i < number_of_items; i++)
{
var item = new ImageItem();
item.reader = reader;
item.Read();
item.Save(i.ToString()+".raw");
}
}
}
class ImageItem:ChunkLoader
{
int handle;
int position;
int checksum;
int references;
int width;
int height;
int graphic_mode;
int x_hotspot;
int y_hotspot;
int action_x;
int action_y;
//tranparent,add later
int indexed;
byte[] image;
byte[] alpha;
private int currentSize;
private byte[] currentImage;
private byte[] curPoints;
private int currentN;
public void ReadRGB(byte[] data,int width,int heigth,TestPoint pointClass)
{
var n = 0;
var i = 0;
List<byte> points = new List<byte>();
var pad = GetPadding(width, 3);
for (int y = 0; y < heigth; y++)
{
for (int x = 0; x < width; x++)
{
points.AddRange(pointClass.Read(data, n));
n += 3;//pointClass.size;
i += 1;
}
n += 3;//(int)pad + pointClass.size;
}
curPoints = points.ToArray();
currentN = n;
}
public void ReadAlpha(byte[] data, int width, int heigth, int position)
{
var n = 0;
var i = 0;
List<byte> points = new List<byte>();
var pad = GetPadding(width, 1, 4);
for (int y = 0; y < heigth; y++)
{
for (int x = 0; x < heigth; x++)
{
points[i] = data[n + position];
n++;
i++;
}
n += (int)pad;
}
curPoints = points.ToArray();
}
public double GetPadding(int width,int classSize,int bytes=2)
{
var pad = bytes - ((width * classSize) % bytes);
if (pad == bytes) pad = 0;
var padding = Math.Ceiling((float)(pad / classSize));
return padding;//Correct
}
public override void Read()
{
handle = reader.ReadInt32();
position = (int)reader.Tell();
Load();
}
public void Load()
{
reader.Seek(position);
var decompressedImg = Decompressor.Decompress(reader);
var image_data = new ByteIO(decompressedImg);
var start = image_data.Tell();
checksum = image_data.ReadInt32();
references = image_data.ReadInt32();
var size = image_data.ReadUInt32();
width = image_data.ReadInt16();
height = image_data.ReadInt16();
graphic_mode = image_data.ReadByte();//Graphic mode is always 4 for SL
var flags = image_data.ReadSByte();
image_data.Skip(2);
x_hotspot = image_data.ReadInt16();
y_hotspot = image_data.ReadInt16();
action_x = image_data.ReadInt16();
action_y = image_data.ReadInt16();
Logger.Log($"Size: {width}x{height}");
for (int i = 0; i < 4; i++)
{
image_data.ReadByte();
//transparence
}
int alpha_size=0;
byte[] data;
if (false)//lzx flag
{
var decompressed_size = image_data.ReadUInt32();
image_data = Decompressor.decompress_asReader(image_data, (int)(image_data.Size() - image_data.Tell()), (int)decompressed_size);
}
else
{
//image_data = image_data.ReadBytes(-1)
data = image_data.ReadBytes((int)reader.Size());
var curPoint = new TestPoint();
ReadRGB(data,width,height,curPoint);
var image = curPoints;
var image_size = currentN;
this.image = image;
alpha_size = (int)(size - image_size);
}
var pad = (alpha_size - width * height) / height;
//ReadAlpha(data, width, height, (int)(size - alpha_size));
//alpha = curPoints;
}
public void Save(string filename)
{
File.WriteAllBytes(filename,image);
}
public override void Print()
{
}
}
public class TestPoint
{
public int size = 3;
public byte[] Read(byte[]data,int position)
{
byte r=0;
byte g=0;
byte b=0;
try
{
b = data[position];
g = data[position + 1];
r = data[position + 2];
}
catch
{
Console.WriteLine(position);
}
return (new List<byte>() { r, g, b }).ToArray();
}
}
}