Skip to content

Commit

Permalink
Support TileA8L8_SW (and TileL8_SW TileRGBA5650_SW) for PS4, Fix
Browse files Browse the repository at this point in the history
  • Loading branch information
UlyssesWu committed Aug 14, 2021
1 parent 065c652 commit b106040
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 37 deletions.
64 changes: 50 additions & 14 deletions FreeMote/FreeMoteExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,40 @@ public static bool UsePalette(this PsbPixelFormat format)
}
}

/// <summary>
/// Whether the <see cref="PsbSpec"/> should use <see cref="PostProcessing.TileTexture"/>
/// </summary>
/// <param name="spec"></param>
/// <returns></returns>
public static bool UseTile(this PsbSpec spec)
{
switch (spec)
{
case PsbSpec.ps4:
return true;
default:
return false;
}
}

/// <summary>
/// Whether the <see cref="PsbSpec"/> should use BigEndian
/// </summary>
/// <param name="spec"></param>
/// <returns></returns>
public static bool UseBigEndian(this PsbSpec spec)
{
switch (spec)
{
case PsbSpec.common:
case PsbSpec.ems:
//case PsbSpec.vita: //TODO: is vita BigEndian?
return true;
default:
return false;
}
}

public static int? GetBitDepth(this PsbPixelFormat format) =>
format switch
{
Expand Down Expand Up @@ -146,7 +180,7 @@ public static PsbPixelFormat DefaultPixelFormat(this PsbSpec spec)
return PsbPixelFormat.None;
}
}

public static ImageFormat ToImageFormat(this PsbImageFormat imageFormat)
{
switch (imageFormat)
Expand Down Expand Up @@ -233,39 +267,41 @@ public static PsbPixelFormat ToPsbPixelFormat(this string typeStr, PsbSpec spec)
return PsbPixelFormat.None;
}

bool useTile = spec.UseTile();

switch (typeStr.ToUpperInvariant())
{
case "L8_SW":
return PsbPixelFormat.L8_SW;
case "CI4_SW":
return PsbPixelFormat.CI4_SW;
case "CI8_SW":
return PsbPixelFormat.CI8_SW;
case "DXT5":
return PsbPixelFormat.DXT5;
case "RGBA4444":
if (spec.UseBigEndian())
return PsbPixelFormat.BeRGBA4444;
return PsbPixelFormat.LeRGBA4444;
case "RGBA4444_SW":
return PsbPixelFormat.LeRGBA4444_SW;
case "RGBA8":
if (spec == PsbSpec.common || spec == PsbSpec.ems || spec == PsbSpec.vita)
if (spec.UseBigEndian() || spec == PsbSpec.vita)
return PsbPixelFormat.BeRGBA8;
else
return PsbPixelFormat.LeRGBA8;
case "RGBA8_SW":
return spec == PsbSpec.ps4 ? PsbPixelFormat.TileRGBA8_SW : PsbPixelFormat.RGBA8_SW;
return useTile ? PsbPixelFormat.TileRGBA8_SW : PsbPixelFormat.RGBA8_SW;
case "A8_SW":
return spec == PsbSpec.ps4 ? PsbPixelFormat.TileA8_SW : PsbPixelFormat.A8_SW;
case "RGBA4444":
if (spec == PsbSpec.common || spec == PsbSpec.ems)
return PsbPixelFormat.BeRGBA4444;
return PsbPixelFormat.LeRGBA4444;
case "RGBA4444_SW":
return PsbPixelFormat.LeRGBA4444_SW;
return useTile ? PsbPixelFormat.TileA8_SW : PsbPixelFormat.A8_SW;
case "L8_SW":
return useTile ? PsbPixelFormat.TileL8_SW : PsbPixelFormat.L8_SW;
case "A8L8":
return PsbPixelFormat.A8L8;
case "A8L8_SW":
return PsbPixelFormat.A8L8_SW;
return useTile ? PsbPixelFormat.TileA8L8_SW : PsbPixelFormat.A8L8_SW;
case "RGBA5650":
return PsbPixelFormat.RGBA5650;
case "RGBA5650_SW":
return PsbPixelFormat.RGBA5650_SW;
return useTile ? PsbPixelFormat.TileRGBA5650_SW : PsbPixelFormat.RGBA5650_SW;
case "ASTC_8BPP":
return PsbPixelFormat.ASTC_8BPP;
default:
Expand Down
58 changes: 38 additions & 20 deletions FreeMote/PsbEnums.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,9 +178,9 @@ public enum PsbPixelFormat
/// </summary>
BeRGBA4444,
/// <summary>
/// Big Endian DXT5
/// RGBA5650
/// </summary>
DXT5,
RGBA5650,
/// <summary>
/// A8L8
/// </summary>
Expand All @@ -193,19 +193,46 @@ public enum PsbPixelFormat
/// A8
/// </summary>
A8,

//SW and Tile

/// <summary>
/// RGBA8_SW (Swizzle) for vita
/// BeRGBA8_SW (Swizzle) for vita
/// </summary>
RGBA8_SW,
/// <summary>
/// RGBA8_SW (Tile) for PS4
/// LeRGBA8_SW (Tile) for PS4
/// </summary>
TileRGBA8_SW,
/// <summary>
/// Little Endian RGBA4444 with Swizzle for vita
/// </summary>
LeRGBA4444_SW,
/// <summary>
/// RGBA5650 with Swizzle for vita
/// </summary>
RGBA5650_SW,
/// <summary>
/// RGBA5650 with Tile for PS4
/// </summary>
TileRGBA5650_SW,
/// <summary>
/// A8L8 with Swizzle for vita
/// </summary>
A8L8_SW,
/// <summary>
/// A8L8_SW (Tile) for PS4
/// </summary>
TileA8L8_SW,
/// <summary>
/// L8 with Swizzle for vita
/// </summary>
L8_SW,
/// <summary>
/// L8_SW (Tile) for PS4
/// </summary>
TileL8_SW,
/// <summary>
/// A8_SW (Swizzle)
/// </summary>
A8_SW,
Expand All @@ -219,25 +246,16 @@ public enum PsbPixelFormat
/// REF: http://wiki.tockdom.com/wiki/Image_Formats#C8_.28CI8.29
CI8_SW,
/// <summary>
/// Little Endian RGBA4444 with Swizzle for vita
/// </summary>
LeRGBA4444_SW,
/// <summary>
/// RGBA5650
/// </summary>
RGBA5650,
/// <summary>
/// RGBA5650 with Swizzle for vita
/// </summary>
RGBA5650_SW,
/// <summary>
/// A8L8 with Swizzle for vita
/// </summary>
A8L8_SW,
/// <summary>
/// CI4 with Swizzle for vita
/// </summary>
CI4_SW,

//Special

/// <summary>
/// Big Endian DXT5
/// </summary>
DXT5,
/// <summary>
/// ASTC with block 4x4 for nx
/// </summary>
Expand Down
31 changes: 28 additions & 3 deletions FreeMote/RL.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,20 @@ public static Bitmap ConvertToImage(byte[] data, int height, int width,
case PsbPixelFormat.BeRGBA8:
Switch_0_2(ref data);
break;
case PsbPixelFormat.DXT5:
data = DxtUtil.DecompressDxt5(data, width, height);
Switch_0_2(ref data); //DXT5(for win) need conversion
break;
case PsbPixelFormat.A8L8:
data = ReadA8L8(data, width, height);
break;
case PsbPixelFormat.A8L8_SW:
data = ReadA8L8(data, width, height);
data = PostProcessing.UnswizzleTexture(data, width, height, PixelFormat.Format32bppArgb);
break;
case PsbPixelFormat.DXT5:
data = DxtUtil.DecompressDxt5(data, width, height);
Switch_0_2(ref data); //DXT5(for win) need conversion
case PsbPixelFormat.TileA8L8_SW:
data = ReadA8L8(data, width, height);
data = PostProcessing.UntileTexture(data, width, height, PixelFormat.Format32bppArgb);
break;
case PsbPixelFormat.RGBA8_SW:
data = PostProcessing.UnswizzleTexture(data, bmp.Width, bmp.Height, bmp.PixelFormat);
Expand Down Expand Up @@ -92,13 +96,21 @@ public static Bitmap ConvertToImage(byte[] data, int height, int width,
data = ReadL8(data, height, width);
data = PostProcessing.UnswizzleTexture(data, width, height, PixelFormat.Format32bppArgb);
break;
case PsbPixelFormat.TileL8_SW:
data = ReadL8(data, height, width);
data = PostProcessing.UntileTexture(data, width, height, PixelFormat.Format32bppArgb);
break;
case PsbPixelFormat.RGBA5650:
data = ReadRgba5650(data);
break;
case PsbPixelFormat.RGBA5650_SW:
data = ReadRgba5650(data);
data = PostProcessing.UnswizzleTexture(data, width, height, PixelFormat.Format32bppArgb);
break;
case PsbPixelFormat.TileRGBA5650_SW:
data = ReadRgba5650(data);
data = PostProcessing.UntileTexture(data, width, height, PixelFormat.Format32bppArgb);
break;
case PsbPixelFormat.ASTC_8BPP:
data = AstcDecoder.DecodeASTC(data, width, height, 4, 4);
break;
Expand Down Expand Up @@ -127,6 +139,7 @@ public static Bitmap ConvertToImage(byte[] data, int height, int width,
/// <returns></returns>
private static byte[] PixelBytesFromImage(Bitmap bmp, PsbPixelFormat pixelFormat = PsbPixelFormat.None)
{
//var bitsPerPixel = Image.GetPixelFormatSize(bmp.PixelFormat); //TODO: Check input bpp and convert?
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadOnly, bmp.PixelFormat);

Expand Down Expand Up @@ -158,6 +171,10 @@ private static byte[] PixelBytesFromImage(Bitmap bmp, PsbPixelFormat pixelFormat
result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat);
result = Argb2A8L8(result);
break;
case PsbPixelFormat.TileA8L8_SW:
result = PostProcessing.TileTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat);
result = Argb2A8L8(result);
break;
case PsbPixelFormat.DXT5:
//Switch_0_2(ref result);
result = DxtUtil.Dxt5Encode(result, bmp.Width, bmp.Height);
Expand Down Expand Up @@ -193,6 +210,10 @@ private static byte[] PixelBytesFromImage(Bitmap bmp, PsbPixelFormat pixelFormat
result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat);
result = Argb2L8(result);
break;
case PsbPixelFormat.TileL8_SW:
result = PostProcessing.TileTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat);
result = Argb2L8(result);
break;
case PsbPixelFormat.LeRGBA4444_SW:
result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat);
result = Argb428(result, false);
Expand All @@ -204,6 +225,10 @@ private static byte[] PixelBytesFromImage(Bitmap bmp, PsbPixelFormat pixelFormat
result = PostProcessing.SwizzleTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat);
result = Argb2Rgba5650(result);
break;
case PsbPixelFormat.TileRGBA5650_SW:
result = PostProcessing.TileTexture(result, bmp.Width, bmp.Height, bmp.PixelFormat);
result = Argb2Rgba5650(result);
break;
}

return result;
Expand Down

0 comments on commit b106040

Please sign in to comment.