#region Copyright & License Information /* * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, * see COPYING. */ #endregion using System; using System.Collections.Generic; using System.Linq; using OpenRA.FileFormats; using OpenRA.FileFormats.Graphics; using OpenRA.Traits; namespace OpenRA.Graphics { public class HardwarePalette { public const int MaxPalettes = 256; int allocated = 0; ITexture texture; Dictionary palettes; Dictionary indices; public HardwarePalette() { palettes = new Dictionary(); indices = new Dictionary(); texture = Game.Renderer.Device.CreateTexture(); } public Palette GetPalette(string name) { Palette ret; if (!palettes.TryGetValue(name,out ret)) throw new InvalidOperationException("Palette `{0}` does not exist".F(name)); return ret; } public int GetPaletteIndex(string name) { int ret; if (!indices.TryGetValue(name,out ret)) throw new InvalidOperationException("Palette `{0}` does not exist".F(name)); return ret; } public void AddPalette(string name, Palette p) { if (palettes.ContainsKey(name)) throw new InvalidOperationException("Palette {0} has already been defined".F(name)); palettes.Add(name, p); indices.Add(name, allocated++); } uint[,] data = new uint[MaxPalettes, 256]; public void Update(IEnumerable paletteMods) { var copy = palettes.ToDictionary(p => p.Key, p => new Palette(p.Value)); foreach (var mod in paletteMods) mod.AdjustPalette(copy); foreach (var pal in copy) { var j = indices[pal.Key]; var c = pal.Value.Values; for (var i = 0; i < 256; i++) data[j,i] = c[i]; } // Doesn't work texture.SetData(data); Game.Renderer.PaletteTexture = texture; } } }