Add disassembly of GradientTool

This commit is contained in:
2026-04-21 10:40:12 +02:00
commit 1ef84fd132
55 changed files with 8994 additions and 0 deletions

281
BitmapCalc.cs Normal file
View File

@@ -0,0 +1,281 @@
// Decompiled with JetBrains decompiler
// Type: SFXProductions.GradientTool.BitmapCalc
// Assembly: GradientTool, Version=0.8.2.1, Culture=neutral, PublicKeyToken=null
// MVID: 818AB9B3-796A-4A49-8B90-C00D066A321B
// Assembly location: C:\Users\aless\Downloads\gradient-tool-v0.8.2.1\GradientTool.exe
using SFXProductions.GradientTool.HDMA;
using System;
using System.Drawing;
using System.Drawing.Imaging;
#nullable disable
namespace SFXProductions.GradientTool;
internal static class BitmapCalc
{
public static unsafe void Fill48BppBitmap(
this Bitmap bmp,
double[] r,
double[] g,
double[] b,
bool addPadding = true)
{
BitmapData bitmapdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format48bppRgb);
try
{
ushort* scan0 = (ushort*) (void*) bitmapdata.Scan0;
ushort* numPtr1 = scan0 + (addPadding ? (IntPtr) bitmapdata.Stride : IntPtr.Zero).ToInt64();
ushort num1 = 0;
ushort num2 = 0;
ushort num3 = 0;
for (int index1 = 0; index1 < r.Length; ++index1)
{
ushort* numPtr2 = numPtr1;
for (int index2 = 0; index2 < bitmapdata.Width; ++index2)
{
ushort* numPtr3 = numPtr2;
ushort* numPtr4 = (ushort*) ((IntPtr) numPtr3 + new IntPtr(2));
int word1;
ushort num4 = (ushort) (word1 = (int) Utils.RoundToWord(b[index1].Clamp() * (double) ushort.MaxValue));
*numPtr3 = (ushort) word1;
num3 = num4;
ushort* numPtr5 = numPtr4;
ushort* numPtr6 = (ushort*) ((IntPtr) numPtr5 + new IntPtr(2));
int word2;
ushort num5 = (ushort) (word2 = (int) Utils.RoundToWord(g[index1].Clamp() * (double) ushort.MaxValue));
*numPtr5 = (ushort) word2;
num2 = num5;
ushort* numPtr7 = numPtr6;
numPtr2 = (ushort*) ((IntPtr) numPtr7 + new IntPtr(2));
int word3;
ushort num6 = (ushort) (word3 = (int) Utils.RoundToWord(r[index1].Clamp() * (double) ushort.MaxValue));
*numPtr7 = (ushort) word3;
num1 = num6;
}
numPtr1 += bitmapdata.Stride;
}
if (!addPadding)
return;
*numPtr1 = (ushort) (*(short*) (numPtr1 + 3) = (short) num3);
numPtr1[1] = (ushort) (*(short*) (numPtr1 + 4) = (short) num2);
numPtr1[2] = (ushort) (*(short*) (numPtr1 + 5) = (short) num1);
ushort* numPtr8 = scan0 + bitmapdata.Stride;
*scan0 = (ushort) (*(short*) (scan0 + 3) = (short) *numPtr8);
scan0[1] = (ushort) (*(short*) (scan0 + 4) = (short) numPtr8[1]);
scan0[2] = (ushort) (*(short*) (scan0 + 5) = (short) numPtr8[2]);
}
finally
{
bmp.UnlockBits(bitmapdata);
}
}
public static unsafe void Fill24BppBitmap(
this Bitmap bmp,
double[] r,
double[] g,
double[] b,
bool addPadding = true)
{
BitmapData bitmapdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
try
{
byte* scan0 = (byte*) (void*) bitmapdata.Scan0;
byte* numPtr1 = scan0 + (addPadding ? bitmapdata.Stride : 0);
byte num1 = 0;
byte num2 = 0;
byte num3 = 0;
for (int index1 = 0; index1 < r.Length; ++index1)
{
byte* numPtr2 = numPtr1;
for (int index2 = 0; index2 < bitmapdata.Width; ++index2)
{
byte* numPtr3 = numPtr2;
byte* numPtr4 = numPtr3 + 1;
int num4;
byte num5 = (byte) (num4 = (int) Utils.RoundToByte(b[index1].Clamp() * (double) byte.MaxValue));
*numPtr3 = (byte) num4;
num3 = num5;
byte* numPtr5 = numPtr4;
byte* numPtr6 = numPtr5 + 1;
int num6;
byte num7 = (byte) (num6 = (int) Utils.RoundToByte(g[index1].Clamp() * (double) byte.MaxValue));
*numPtr5 = (byte) num6;
num2 = num7;
byte* numPtr7 = numPtr6;
numPtr2 = numPtr7 + 1;
int num8;
byte num9 = (byte) (num8 = (int) Utils.RoundToByte(r[index1].Clamp() * (double) byte.MaxValue));
*numPtr7 = (byte) num8;
num1 = num9;
}
numPtr1 += bitmapdata.Stride;
}
if (!addPadding)
return;
*numPtr1 = (byte) (*(sbyte*) (numPtr1 + 3) = (sbyte) num3);
numPtr1[1] = (byte) (*(sbyte*) (numPtr1 + 4) = (sbyte) num2);
numPtr1[2] = (byte) (*(sbyte*) (numPtr1 + 5) = (sbyte) num1);
byte* numPtr8 = scan0 + bitmapdata.Stride;
*scan0 = (byte) (*(sbyte*) (scan0 + 3) = (sbyte) *numPtr8);
scan0[1] = (byte) (*(sbyte*) (scan0 + 4) = (sbyte) numPtr8[1]);
scan0[2] = (byte) (*(sbyte*) (scan0 + 5) = (sbyte) numPtr8[2]);
}
finally
{
bmp.UnlockBits(bitmapdata);
}
}
private static double Combine(double v, double x, double y, Combiner combiner)
{
switch (combiner)
{
case Combiner.Normal:
return v;
case Combiner.AverageWithX:
return (v + x) / 2.0;
case Combiner.AverageWithY:
return (v + y) / 2.0;
default:
return 0.0;
}
}
public static void Fill15BppBitmap(
this Bitmap bmp,
double[] r,
double[] g,
double[] b,
GradientChannels channels)
{
switch (channels)
{
case GradientChannels.RedGreenBlue:
bmp.Fill15BppBitmap(r, g, b, Combiner.Normal, Combiner.Normal, Combiner.Normal);
break;
case GradientChannels.RedGreen:
bmp.Fill15BppBitmap(r, g, b, Combiner.Normal, Combiner.Normal, Combiner.Drop);
break;
case GradientChannels.GreenBlue:
bmp.Fill15BppBitmap(r, g, b, Combiner.Drop, Combiner.Normal, Combiner.Normal);
break;
case GradientChannels.RedBlue:
bmp.Fill15BppBitmap(r, g, b, Combiner.Normal, Combiner.Drop, Combiner.Normal);
break;
case GradientChannels.CyanRed:
bmp.Fill15BppBitmap(r, g, b, Combiner.Normal, Combiner.AverageWithY, Combiner.AverageWithY);
break;
case GradientChannels.YellowBlue:
bmp.Fill15BppBitmap(r, g, b, Combiner.AverageWithX, Combiner.AverageWithX, Combiner.Normal);
break;
case GradientChannels.MagentaGreen:
bmp.Fill15BppBitmap(r, g, b, Combiner.AverageWithY, Combiner.Normal, Combiner.AverageWithX);
break;
case GradientChannels.Red:
bmp.Fill15BppBitmap(r, g, b, Combiner.Normal, Combiner.Drop, Combiner.Drop);
break;
case GradientChannels.Green:
bmp.Fill15BppBitmap(r, g, b, Combiner.Drop, Combiner.Normal, Combiner.Drop);
break;
case GradientChannels.Blue:
bmp.Fill15BppBitmap(r, g, b, Combiner.Drop, Combiner.Drop, Combiner.Normal);
break;
case GradientChannels.Cyan:
bmp.Fill15BppBitmap(r, g, b, Combiner.Drop, Combiner.AverageWithY, Combiner.AverageWithY);
break;
case GradientChannels.Yellow:
bmp.Fill15BppBitmap(r, g, b, Combiner.AverageWithX, Combiner.AverageWithX, Combiner.Drop);
break;
case GradientChannels.Magenta:
bmp.Fill15BppBitmap(r, g, b, Combiner.AverageWithY, Combiner.Drop, Combiner.AverageWithX);
break;
case GradientChannels.Grey:
bmp.Fill15BppBitmapGreyscale(r, g, b);
break;
case GradientChannels.Brightness:
break;
default:
throw new ArgumentException("Invalid gradient channels.");
}
}
public static unsafe void Fill15BppBitmap(
this Bitmap bmp,
double[] r,
double[] g,
double[] b,
Combiner redCombiner,
Combiner greenCombiner,
Combiner blueCombiner)
{
BitmapData bitmapdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format16bppRgb555);
try
{
byte* scan0 = (byte*) (void*) bitmapdata.Scan0;
for (int index1 = 0; index1 < r.Length; ++index1)
{
double num1 = BitmapCalc.Combine(r[index1], g[index1], b[index1], redCombiner).Clamp();
double num2 = BitmapCalc.Combine(g[index1], r[index1], b[index1], greenCombiner).Clamp();
double num3 = BitmapCalc.Combine(b[index1], r[index1], g[index1], blueCombiner).Clamp();
ushort* numPtr = (ushort*) scan0;
for (int index2 = 0; index2 < bitmapdata.Width; ++index2)
*numPtr++ = (ushort) ((int) Utils.RoundToByte(num3 * 31.0) | (int) Utils.RoundToByte(num2 * 31.0) << 5 | (int) Utils.RoundToByte(num1 * 31.0) << 10);
scan0 += bitmapdata.Stride;
}
}
finally
{
bmp.UnlockBits(bitmapdata);
}
}
public static unsafe void Fill15BppBitmapGreyscale(
this Bitmap bmp,
double[] r,
double[] g,
double[] b)
{
BitmapData bitmapdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format16bppRgb555);
try
{
byte* scan0 = (byte*) (void*) bitmapdata.Scan0;
for (int index1 = 0; index1 < r.Length; ++index1)
{
double max = 3.0;
byte num = Utils.RoundToByte((r[index1] + g[index1] + b[index1]).Clamp(max) * (31.0 / 3.0));
ushort* numPtr = (ushort*) scan0;
for (int index2 = 0; index2 < bitmapdata.Width; ++index2)
*numPtr++ = (ushort) ((int) num | (int) num << 5 | (int) num << 10);
scan0 += bitmapdata.Stride;
}
}
finally
{
bmp.UnlockBits(bitmapdata);
}
}
public static unsafe void Fill4BppBitmap(this Bitmap bmp, double[] r, double[] g, double[] b)
{
BitmapData bitmapdata = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format4bppIndexed);
try
{
byte* scan0 = (byte*) (void*) bitmapdata.Scan0;
for (int index1 = 0; index1 < r.Length; ++index1)
{
double max = 3.0;
byte num = Utils.RoundToByte((r[index1] + g[index1] + b[index1]).Clamp(max) * 5.0);
byte* numPtr = scan0;
for (int index2 = 0; index2 < bitmapdata.Stride; ++index2)
*numPtr++ = (byte) ((uint) num | (uint) num << 4);
scan0 += bitmapdata.Stride;
}
}
finally
{
bmp.UnlockBits(bitmapdata);
}
}
}