public static int GetBitsPerPixel(this XLIMEncoding e) { if (_32.Contains(e)) { return(BPP_32); } if (_24.Contains(e)) { return(BPP_24); } if (_16.Contains(e)) { return(BPP_16); } if (_8.Contains(e)) { return(BPP_8); } return(BPP_4); }
public static IEnumerable <uint> GetPixels(byte[] raw, XLIMEncoding e) { int bpp = e.GetBitsPerPixel(); if (bpp == BPP_4) { foreach (byte b in raw) { byte _0 = (byte)(b & 0xF); byte _1 = (byte)(b >> 4); yield return(GetDecodedPixelValue(_0, e)); yield return(GetDecodedPixelValue(_1, e)); } yield break; } for (int i = 0; i < raw.Length; i += bpp / 8) { uint val = GetEncodedPixelValue(raw, i, bpp); yield return(GetDecodedPixelValue(val, e)); } }
internal static uint GetDecodedPixelValue(uint val, XLIMEncoding e) { byte a = byte.MaxValue, r, g, b; switch (e) { case XLIMEncoding.L4: case XLIMEncoding.L8: { r = g = b = (byte)val; break; } case XLIMEncoding.A4: case XLIMEncoding.A8: { r = g = b = 0xFF; a = (byte)val; break; } case XLIMEncoding.HILO8: { r = (byte)(val >> 8); g = (byte)(val & 0xFF); b = byte.MaxValue; break; } case XLIMEncoding.LA4: { r = g = b = (byte)(val >> 4); a = (byte)(val & 0x0F); break; } case XLIMEncoding.LA8: { r = g = b = (byte)(val >> 8); a = (byte)val; break; } case XLIMEncoding.RGBX8: { r = (byte)(val >> 16); g = (byte)(val >> 8); b = (byte)(val >> 0); break; } case XLIMEncoding.RGBA8: { r = (byte)(val >> 24); g = (byte)(val >> 16); b = (byte)(val >> 8); a = (byte)val; break; } case XLIMEncoding.RGBA4: { a = (byte)(0x11 * (val & 0xf)); r = (byte)(0x11 * ((val >> 12) & 0xf)); g = (byte)(0x11 * ((val >> 8) & 0xf)); b = (byte)(0x11 * ((val >> 4) & 0xf)); break; } case XLIMEncoding.RGB565: { r = Convert5To8[(val >> 11) & 0x1F]; g = (byte)(((val >> 5) & 0x3F) * 4); b = Convert5To8[val & 0x1F]; break; } case XLIMEncoding.RGB5A1: { r = Convert5To8[(val >> 11) & 0x1F]; g = Convert5To8[(val >> 6) & 0x1F]; b = Convert5To8[(val >> 1) & 0x1F]; a = (val & 1) == 1 ? byte.MaxValue : byte.MinValue; break; } default: throw new FormatException($"Unsupported {nameof(XLIMEncoding)} value = {e}"); } return((uint)((a << 24) | (r << 16) | (g << 8) | b)); }