| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Graphics;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- namespace OpenVIII
- {
- public class Cluts : IDictionary<byte, Color[]>
- {
- #region Fields
- private Dictionary<byte, Color[]> Clut;
- #endregion Fields
- #region Constructors
- public Cluts(Dictionary<byte, Color[]> clut, bool clone = true)
- {
- if (clone)
- Clut = clut.ToDictionary(id => id.Key, colors => (Color[])colors.Value.Clone());
- else
- Clut = clut;
- }
- public Cluts(Cluts clut) : this(clut.Clut)
- { }
- public Cluts() => Clut = new Dictionary<byte, Color[]>();
- #endregion Constructors
- #region Properties
- public IReadOnlyList<byte> ClutIDs => Clut.Keys.OrderBy(x => x).ToList();
- public int MaxColors => Clut.Values.Max(x => x.Length);
- public int Count => ((IDictionary<byte, Color[]>)Clut).Count;
- public bool IsReadOnly => ((IDictionary<byte, Color[]>)Clut).IsReadOnly;
- public ICollection<byte> Keys => ((IDictionary<byte, Color[]>)Clut).Keys;
- public ICollection<Color[]> Values => ((IDictionary<byte, Color[]>)Clut).Values;
- #endregion Properties
- #region Indexers
- public Color[] this[byte key] { get => ((IDictionary<byte, Color[]>)Clut)[key]; set => ((IDictionary<byte, Color[]>)Clut)[key] = value; }
- #endregion Indexers
- #region Methods
- public void Add(byte key, Color[] value) => ((IDictionary<byte, Color[]>)Clut).Add(key, value);
- public void Add(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Add(item);
- public void Clear() => ((IDictionary<byte, Color[]>)Clut).Clear();
- public bool Contains(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Contains(item);
- public bool ContainsKey(byte key) => ((IDictionary<byte, Color[]>)Clut).ContainsKey(key);
- public void CopyTo(KeyValuePair<byte, Color[]>[] array, int arrayIndex) => ((IDictionary<byte, Color[]>)Clut).CopyTo(array, arrayIndex);
- public IEnumerator<KeyValuePair<byte, Color[]>> GetEnumerator() => ((IDictionary<byte, Color[]>)Clut).GetEnumerator();
- IEnumerator IEnumerable.GetEnumerator() => ((IDictionary<byte, Color[]>)Clut).GetEnumerator();
- public bool Remove(byte key) => ((IDictionary<byte, Color[]>)Clut).Remove(key);
- public bool Remove(KeyValuePair<byte, Color[]> item) => ((IDictionary<byte, Color[]>)Clut).Remove(item);
- public bool TryGetValue(byte key, out Color[] value) => ((IDictionary<byte, Color[]>)Clut).TryGetValue(key, out value);
- byte MaxClut => Keys.Max(x => x);
- public void Save(string path)
- {
- using (Texture2D clutTexture = new Texture2D(Memory.graphics.GraphicsDevice, MaxColors, MaxClut+1))
- {
- foreach(var _Y_Colors in Clut.OrderBy(x=>x.Key))
- {
- Color[] colors = _Y_Colors.Value;
- byte y = _Y_Colors.Key;
- clutTexture.SetData(0, new Rectangle(0, y, colors.Length, 1), colors, 0, colors.Length);
- }
- using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
- clutTexture.SaveAsPng(fs, clutTexture.Width, clutTexture.Height);
- }
- }
- #endregion Methods
- }
- }
|