public static void Initialize(string[] sequenceFiles) { cursors = new Dictionary <string, CursorSequence>(); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); int[] ShadowIndex = { }; if (sequences.NodesDict.ContainsKey("ShadowIndex")) { Array.Resize(ref ShadowIndex, ShadowIndex.Length + 1); int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]); } Palette = new HardwarePalette(); foreach (var p in sequences.NodesDict["Palettes"].Nodes) { Palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false); } foreach (var s in sequences.NodesDict["Cursors"].Nodes) { LoadSequencesForCursor(s.Key, s.Value); } Palette.Initialize(); }
public CursorProvider(ModData modData) { var sequenceFiles = modData.Manifest.Cursors; cursors = new Dictionary<string, CursorSequence>(); palettes = new Cache<string, PaletteReference>(CreatePaletteReference); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); var shadowIndex = new int[] { }; if (sequences.NodesDict.ContainsKey("ShadowIndex")) { Array.Resize(ref shadowIndex, shadowIndex.Length + 1); Exts.TryParseIntegerInvariant(sequences.NodesDict["ShadowIndex"].Value, out shadowIndex[shadowIndex.Length - 1]); } palette = new HardwarePalette(); foreach (var p in sequences.NodesDict["Palettes"].Nodes) palette.AddPalette(p.Key, new Palette(GlobalFileSystem.Open(p.Value.Value), shadowIndex), false); var spriteLoader = new SpriteLoader(new string[0], new SheetBuilder(SheetType.Indexed)); foreach (var s in sequences.NodesDict["Cursors"].Nodes) LoadSequencesForCursor(spriteLoader, s.Key, s.Value); palette.Initialize(); }
public CursorProvider(ModData modData) { var sequenceFiles = modData.Manifest.Cursors; cursors = new Dictionary <string, CursorSequence>(); palettes = new Cache <string, PaletteReference>(CreatePaletteReference); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); var shadowIndex = new int[] { }; var nodesDict = sequences.ToDictionary(); if (nodesDict.ContainsKey("ShadowIndex")) { Array.Resize(ref shadowIndex, shadowIndex.Length + 1); Exts.TryParseIntegerInvariant(nodesDict["ShadowIndex"].Value, out shadowIndex[shadowIndex.Length - 1]); } palette = new HardwarePalette(); foreach (var p in nodesDict["Palettes"].Nodes) { palette.AddPalette(p.Key, new ImmutablePalette(GlobalFileSystem.Open(p.Value.Value), shadowIndex), false); } var spriteLoader = new SpriteLoader(new string[0], new SheetBuilder(SheetType.Indexed)); foreach (var s in nodesDict["Cursors"].Nodes) { LoadSequencesForCursor(spriteLoader, s.Key, s.Value); } spriteLoader.SheetBuilder.Current.ReleaseBuffer(); palette.Initialize(); }
public HardwareCursor(CursorProvider cursorProvider) { this.cursorProvider = cursorProvider; paletteReferences = new Cache <string, PaletteReference>(CreatePaletteReference); foreach (var p in cursorProvider.Palettes) { hardwarePalette.AddPalette(p.Key, p.Value, false); } hardwarePalette.Initialize(); sheetBuilder = new SheetBuilder(SheetType.Indexed); foreach (var kv in cursorProvider.Cursors) { var palette = cursorProvider.Palettes[kv.Value.Palette]; var hc = kv.Value.Frames .Select(f => CreateCursor(f, palette, kv.Key, kv.Value)) .ToArray(); hardwareCursors.Add(kv.Key, hc); var s = kv.Value.Frames.Select(a => sheetBuilder.Add(a)).ToArray(); sprites.Add(kv.Key, s); } sheetBuilder.Current.ReleaseBuffer(); Update(); }
public HardwareCursor(CursorProvider cursorProvider) { this.cursorProvider = cursorProvider; paletteReferences = new Cache <string, PaletteReference>(CreatePaletteReference); foreach (var p in cursorProvider.Palettes) { hardwarePalette.AddPalette(p.Key, p.Value, false); } hardwarePalette.Initialize(); sheetBuilder = new SheetBuilder(SheetType.Indexed); foreach (var kv in cursorProvider.Cursors) { var frames = kv.Value.Frames; var palette = cursorProvider.Palettes[kv.Value.Palette]; // Hardware cursors have a number of odd platform-specific bugs/limitations. // Reduce the number of edge cases by padding the individual frames such that: // - the hotspot is inside the frame bounds (enforced by SDL) // - all frames within a sequence have the same size (needed for macOS 10.15) // - the frame size is a multiple of 8 (needed for Windows) var sequenceBounds = Rectangle.FromLTRB(0, 0, 1, 1); var frameHotspots = new int2[frames.Length]; for (var i = 0; i < frames.Length; i++) { // Hotspot relative to the center of the frame frameHotspots[i] = kv.Value.Hotspot - frames[i].Offset.ToInt2() + new int2(frames[i].Size) / 2; // Bounds relative to the hotspot sequenceBounds = Rectangle.Union(sequenceBounds, new Rectangle(-frameHotspots[i], frames[i].Size)); } // Pad bottom-right edge to make the frame size a multiple of 8 var paddedSize = 8 * new int2((sequenceBounds.Width + 7) / 8, (sequenceBounds.Height + 7) / 8); var cursors = new IHardwareCursor[frames.Length]; var frameSprites = new Sprite[frames.Length]; for (var i = 0; i < frames.Length; i++) { // Software rendering is used when the cursor is locked frameSprites[i] = sheetBuilder.Add(frames[i].Data, frames[i].Size, 0, frames[i].Offset); // Calculate the padding to position the frame within sequenceBounds var paddingTL = -(sequenceBounds.Location + frameHotspots[i]); var paddingBR = paddedSize - new int2(frames[i].Size) - paddingTL; cursors[i] = CreateCursor(kv.Key, frames[i], palette, paddingTL, paddingBR, -sequenceBounds.Location); } hardwareCursors.Add(kv.Key, cursors); sprites.Add(kv.Key, frameSprites); } sheetBuilder.Current.ReleaseBuffer(); Update(); }
public void AddPalette(string name, ImmutablePalette pal, bool allowModifiers = false, bool allowOverwrite = false) { if (allowOverwrite && palette.Contains(name)) ReplacePalette(name, pal); else { var oldHeight = palette.Height; palette.AddPalette(name, pal, allowModifiers); if (oldHeight != palette.Height && PaletteInvalidated != null) PaletteInvalidated(); } }
public static void Initialize(string[] sequenceFiles) { cursors = new Dictionary<string, CursorSequence>(); var sequences = new MiniYaml(null, sequenceFiles.Select(s => MiniYaml.FromFile(s)).Aggregate(MiniYaml.MergeLiberal)); int[] ShadowIndex = { }; if (sequences.NodesDict.ContainsKey("ShadowIndex")) { Array.Resize(ref ShadowIndex, ShadowIndex.Length + 1); int.TryParse(sequences.NodesDict["ShadowIndex"].Value, out ShadowIndex[ShadowIndex.Length - 1]); } Palette = new HardwarePalette(); foreach (var p in sequences.NodesDict["Palettes"].Nodes) Palette.AddPalette(p.Key, new Palette(FileSystem.Open(p.Value.Value), ShadowIndex), false); foreach (var s in sequences.NodesDict["Cursors"].Nodes) LoadSequencesForCursor(s.Key, s.Value); Palette.Initialize(); }
public SoftwareCursor(CursorProvider cursorProvider) { this.cursorProvider = cursorProvider; paletteReferences = new Cache <string, PaletteReference>(CreatePaletteReference); foreach (var p in cursorProvider.Palettes) { palette.AddPalette(p.Key, p.Value, false); } palette.Initialize(); sheetBuilder = new SheetBuilder(SheetType.Indexed); foreach (var kv in cursorProvider.Cursors) { var s = kv.Value.Frames.Select(a => sheetBuilder.Add(a)).ToArray(); sprites.Add(kv.Key, s); } sheetBuilder.Current.ReleaseBuffer(); Game.Renderer.Window.SetHardwareCursor(null); }
public void AddPalette(string name, ImmutablePalette pal) { palette.AddPalette(name, pal, false); }
public void AddPalette(string name, Palette pal) { palette.AddPalette(name, pal); }
public void AddPalette(string name, Palette pal, bool allowModifiers) { palette.AddPalette(name, pal, allowModifiers); }
public override void Init(ModData modData, Dictionary<string, string> info) { // Avoid standard loading mechanisms so we // can display the loadscreen as early as possible r = Game.Renderer; if (r == null) return; if (info.ContainsKey("Text")) messages = info["Text"].Split(','); if (info.ContainsKey("Palette")) { using (var stream = modData.DefaultFileSystem.Open(info["Palette"])) { palette = new ImmutablePalette(stream, new int[] { }); } hardwarePalette = new HardwarePalette(); hardwarePalette.AddPalette("loadscreen", palette, false); hardwarePalette.Initialize(); r.SetPalette(hardwarePalette); } if (info.ContainsKey("Image")) { using (var stream = modData.DefaultFileSystem.Open(info["Image"])) { CpsD2Loader loader = new CpsD2Loader(); if (!loader.TryParseSprite(stream, out frames)) return; } if (frames.Length == 0) return; sheetBuilder = new SheetBuilder(SheetType.Indexed, 512); logo = sheetBuilder.Add(frames[0]); logoPos = new float2((r.Resolution.Width - logo.Size.X) / 2, (r.Resolution.Height - logo.Size.Y) / 2); } }