Cluts.cs 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Microsoft.Xna.Framework;
  2. using Microsoft.Xna.Framework.Graphics;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. namespace OpenVIII
  8. {
  9. public class Cluts : IDictionary<byte, Color[]>
  10. {
  11. #region Fields
  12. private Dictionary<byte, Color[]> Clut;
  13. #endregion Fields
  14. #region Constructors
  15. public Cluts(Dictionary<byte, Color[]> clut, bool clone = true)
  16. {
  17. if (clone)
  18. Clut = clut.ToDictionary(id => id.Key, colors => (Color[])colors.Value.Clone());
  19. else
  20. Clut = clut;
  21. }
  22. public Cluts(Cluts clut) : this(clut.Clut)
  23. { }
  24. public Cluts() => Clut = new Dictionary<byte, Color[]>();
  25. #endregion Constructors
  26. #region Properties
  27. public IReadOnlyList<byte> ClutIDs => Clut.Keys.OrderBy(x => x).ToList();
  28. public int Count => ((IDictionary<byte, Color[]>)Clut).Count;
  29. public bool IsReadOnly => ((IDictionary<byte, Color[]>)Clut).IsReadOnly;
  30. public ICollection<byte> Keys => ((IDictionary<byte, Color[]>)Clut).Keys;
  31. public int MaxColors => Clut.Values.Max(x => x.Length);
  32. public ICollection<Color[]> Values => ((IDictionary<byte, Color[]>)Clut).Values;
  33. private byte MaxClut => Keys.Max(x => x);
  34. #endregion Properties
  35. #region Indexers
  36. public Color[] this[byte key] { get => ((IDictionary<byte, Color[]>)Clut)[key]; set => ((IDictionary<byte, Color[]>)Clut)[key] = value; }
  37. #endregion Indexers
  38. #region Methods
  39. public void Add(byte key, Color[] value) => ((IDictionary<byte, Color[]>)Clut).Add(key, value);
  40. public void Add(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Add(item);
  41. public void Clear() => ((IDictionary<byte, Color[]>)Clut).Clear();
  42. public bool Contains(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Contains(item);
  43. public bool ContainsKey(byte key) => ((IDictionary<byte, Color[]>)Clut).ContainsKey(key);
  44. public void CopyTo(KeyValuePair<byte, Color[]>[] array, int arrayIndex) => ((IDictionary<byte, Color[]>)Clut).CopyTo(array, arrayIndex);
  45. public IEnumerator<KeyValuePair<byte, Color[]>> GetEnumerator() => ((IDictionary<byte, Color[]>)Clut).GetEnumerator();
  46. IEnumerator IEnumerable.GetEnumerator() => ((IDictionary<byte, Color[]>)Clut).GetEnumerator();
  47. public bool Remove(byte key) => ((IDictionary<byte, Color[]>)Clut).Remove(key);
  48. public bool Remove(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Remove(item);
  49. public void Save(string path)
  50. {
  51. using (var clutTexture = new Texture2D(Memory.Graphics.GraphicsDevice, MaxColors, MaxClut + 1))
  52. {
  53. foreach (var _Y_Colors in Clut.OrderBy(x => x.Key))
  54. {
  55. var colors = _Y_Colors.Value;
  56. var y = _Y_Colors.Key;
  57. clutTexture.SetData(0, new Rectangle(0, y, colors.Length, 1), colors, 0, colors.Length);
  58. }
  59. Extended.Save_As_PNG(clutTexture, path, clutTexture.Width, clutTexture.Height);
  60. }
  61. }
  62. public bool TryGetValue(byte key, out Color[] value) => ((IDictionary<byte, Color[]>)Clut).TryGetValue(key, out value);
  63. #endregion Methods
  64. }
  65. }