Cluts.cs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 MaxColors => Clut.Values.Max(x => x.Length);
  29. public int Count => ((IDictionary<byte, Color[]>)Clut).Count;
  30. public bool IsReadOnly => ((IDictionary<byte, Color[]>)Clut).IsReadOnly;
  31. public ICollection<byte> Keys => ((IDictionary<byte, Color[]>)Clut).Keys;
  32. public ICollection<Color[]> Values => ((IDictionary<byte, Color[]>)Clut).Values;
  33. #endregion Properties
  34. #region Indexers
  35. public Color[] this[byte key] { get => ((IDictionary<byte, Color[]>)Clut)[key]; set => ((IDictionary<byte, Color[]>)Clut)[key] = value; }
  36. #endregion Indexers
  37. #region Methods
  38. public void Add(byte key, Color[] value) => ((IDictionary<byte, Color[]>)Clut).Add(key, value);
  39. public void Add(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Add(item);
  40. public void Clear() => ((IDictionary<byte, Color[]>)Clut).Clear();
  41. public bool Contains(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Contains(item);
  42. public bool ContainsKey(byte key) => ((IDictionary<byte, Color[]>)Clut).ContainsKey(key);
  43. public void CopyTo(KeyValuePair<byte, Color[]>[] array, int arrayIndex) => ((IDictionary<byte, Color[]>)Clut).CopyTo(array, arrayIndex);
  44. public IEnumerator<KeyValuePair<byte, Color[]>> GetEnumerator() => ((IDictionary<byte, Color[]>)Clut).GetEnumerator();
  45. IEnumerator IEnumerable.GetEnumerator() => ((IDictionary<byte, Color[]>)Clut).GetEnumerator();
  46. public bool Remove(byte key) => ((IDictionary<byte, Color[]>)Clut).Remove(key);
  47. public bool Remove(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Remove(item);
  48. public bool TryGetValue(byte key, out Color[] value) => ((IDictionary<byte, Color[]>)Clut).TryGetValue(key, out value);
  49. byte MaxClut => Keys.Max(x => x);
  50. public void Save(string path)
  51. {
  52. using (Texture2D clutTexture = new Texture2D(Memory.graphics.GraphicsDevice, MaxColors, MaxClut+1))
  53. {
  54. foreach(var _Y_Colors in Clut.OrderBy(x=>x.Key))
  55. {
  56. Color[] colors = _Y_Colors.Value;
  57. byte y = _Y_Colors.Key;
  58. clutTexture.SetData(0, new Rectangle(0, y, colors.Length, 1), colors, 0, colors.Length);
  59. }
  60. using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
  61. clutTexture.SaveAsPng(fs, clutTexture.Width, clutTexture.Height);
  62. }
  63. }
  64. #endregion Methods
  65. }
  66. }