From 4db4c52518c5b3bf1f7fd1a33d03bc9a6f69fd4b Mon Sep 17 00:00:00 2001 From: Ian C Date: Tue, 14 Jul 2020 20:14:55 +0000 Subject: Export code done. --- SpriteEd/AppDelegate.cs | 228 ++++++++++++++++++++++++++----- SpriteEd/Main.storyboard | 44 +++--- SpriteEd/SpriteSet.cs | 7 +- SpriteEd/SpriteSetController.cs | 21 +-- SpriteEd/SpriteSetController.designer.cs | 24 ++-- 5 files changed, 247 insertions(+), 77 deletions(-) diff --git a/SpriteEd/AppDelegate.cs b/SpriteEd/AppDelegate.cs index 3e51178..9c3aa73 100644 --- a/SpriteEd/AppDelegate.cs +++ b/SpriteEd/AppDelegate.cs @@ -276,28 +276,109 @@ namespace SpriteEd } /// - /// Convert a mono sprite into a byte. + /// Convert a sprite set into a stream of bytes. /// - /// The sprite. - /// The starting X co-ord. - /// The Y co-ord. - /// - private uint SpriteData(Sprite s, uint x, uint y) + /// The action to call with each byte. + /// The sprite set. + /// Export blank sprites. + private void StreamSpriteSet(Action write, SpriteSet set, bool export_blank) { - uint b = 0; - uint bit = 128; + int bits_per_pixel = 1; + + switch(set.Palette.Size) + { + case 4: + bits_per_pixel = 2; + break; + case 16: + bits_per_pixel = 4; + break; + case 256: + bits_per_pixel = 8; + break; + } - for(uint sx = 0; sx < 8; sx++) + for(uint f = 0; f < 256; f++) { - if (s[x + sx, y] == 1) + Sprite sprite = set[(byte)f]; + + if (export_blank || !IsSpriteBlank(sprite)) { - b |= bit; - } + for(uint y = 0; y < sprite.Height; y++) + { + switch(bits_per_pixel) + { + case 1: + for(uint x = 0; x < sprite.Width; x += 8) + { + uint bit = 128; + uint b = 0; + + for(uint sx = 0; sx < 8; sx++) + { + if ((x + sx) < sprite.Width) + { + if (sprite[x + sx,y] != 0) + { + b |= bit; + } + } + + bit /= 2; + } + + write((byte)b); + } + break; - bit = bit >> 1; - } + case 2: + for(uint x = 0; x < sprite.Width; x += 4) + { + uint b = sprite[x, y] << 6; + + if ((x + 1) < sprite.Width) + { + b |= sprite[x + 1, y] << 4; + } - return b; + if ((x + 2) < sprite.Width) + { + b |= sprite[x + 2, y] << 2; + } + + if ((x + 3) < sprite.Width) + { + b |= sprite[x + 3, y]; + } + + write((byte)b); + } + break; + + case 4: + for(uint x = 0; x < sprite.Width; x += 2) + { + uint b = sprite[x, y] << 4; + + if ((x + 1) < sprite.Width) + { + b |= sprite[x + 1, y]; + } + + write((byte)b); + } + break; + + case 8: + for(uint x = 0; x < sprite.Width; x++) + { + write((byte)sprite[x,y]); + } + break; + } + } + } + } } /// @@ -307,10 +388,12 @@ namespace SpriteEd [Export("exportBinary:")] private void ExportBinary(NSObject sender) { + if (NSApplication.SharedApplication.KeyWindow == null) + { + return; + } + NSSavePanel fsel = new NSSavePanel(); - ViewController view = ViewController; - bool export_blank = false; - bool export_mono = false; fsel.Title = "Export binary"; fsel.ShowsTagField = false; @@ -319,20 +402,19 @@ namespace SpriteEd { try { - export_blank = view.SpriteSet.Type == SpriteSet.SetType.C64CharacterSet; - export_mono = view.SpriteSet.Palette.Size == 2; + ViewController view = ViewController; + + bool export_blank = view.SpriteSet.Type == SpriteSet.SetType.C64CharacterSet || + view.SpriteSet.Type == SpriteSet.SetType.MonoCharacterSet; FileStream stream = File.Create(fsel.Url.Path); - if (export_mono) - { - for(byte f = 0; f < view.SpriteSet.Size; f++) + StreamSpriteSet + (delegate (byte b) { - if (export_blank || !IsSpriteBlank(view.SpriteSet[f])) - { - } - } - } + stream.WriteByte(b); + }, + view.SpriteSet, export_blank); stream.Close(); } @@ -350,8 +432,12 @@ namespace SpriteEd [Export("exportAssembly:")] private void ExportAssembly(NSObject sender) { + if (NSApplication.SharedApplication.KeyWindow == null) + { + return; + } + NSSavePanel fsel = new NSSavePanel(); - ViewController view = ViewController; fsel.Title = "Export assembly"; fsel.AllowedFileTypes = new string[] {"asm"}; @@ -361,7 +447,38 @@ namespace SpriteEd { try { - FileStream stream = File.Create(fsel.Url.Path); + ViewController view = ViewController; + + bool export_blank = view.SpriteSet.Type == SpriteSet.SetType.C64CharacterSet || + view.SpriteSet.Type == SpriteSet.SetType.MonoCharacterSet; + + StreamWriter stream = File.CreateText(fsel.Url.Path); + + stream.Write("sprite_data:"); + + int col = 0; + + StreamSpriteSet + (delegate (byte b) + { + if (col == 0) + { + stream.Write("\n\tbyte\t"); + } + else + { + stream.Write(","); + } + + stream.Write("{0}", b); + + if (++col == 8) + { + col = 0; + } + }, + view.SpriteSet, export_blank); + stream.Close(); } catch (Exception e) @@ -378,8 +495,12 @@ namespace SpriteEd [Export("exportC:")] private void ExportC(NSObject sender) { + if (NSApplication.SharedApplication.KeyWindow == null) + { + return; + } + NSSavePanel fsel = new NSSavePanel(); - ViewController view = ViewController; fsel.Title = "Export C"; fsel.AllowedFileTypes = new string[] {"c"}; @@ -389,7 +510,50 @@ namespace SpriteEd { try { - FileStream stream = File.Create(fsel.Url.Path); + ViewController view = ViewController; + + bool export_blank = view.SpriteSet.Type == SpriteSet.SetType.C64CharacterSet || + view.SpriteSet.Type == SpriteSet.SetType.MonoCharacterSet; + + StreamWriter stream = File.CreateText(fsel.Url.Path); + + stream.Write("unsigned char sprite_data[] =\n{"); + + int col = 0; + bool first_line = true; + + StreamSpriteSet + (delegate (byte b) + { + if (col == 0) + { + if (first_line) + { + stream.Write("\n\t"); + } + else + { + stream.Write(",\n\t"); + } + + first_line = false; + } + else + { + stream.Write(","); + } + + stream.Write("{0}", b); + + if (++col == 8) + { + col = 0; + } + }, + view.SpriteSet, export_blank); + + stream.Write("\n};"); + stream.Close(); } catch (Exception e) diff --git a/SpriteEd/Main.storyboard b/SpriteEd/Main.storyboard index e67a0aa..2130430 100644 --- a/SpriteEd/Main.storyboard +++ b/SpriteEd/Main.storyboard @@ -261,6 +261,9 @@ + + + @@ -334,15 +337,6 @@ DQ - - - - - - - - - @@ -421,14 +415,6 @@ Gw - - - - - - - - @@ -438,6 +424,27 @@ Gw + + + + + + + + + + + + + + + + + + + + + @@ -450,8 +457,7 @@ Gw - - + diff --git a/SpriteEd/SpriteSet.cs b/SpriteEd/SpriteSet.cs index 2f2c570..c472056 100644 --- a/SpriteEd/SpriteSet.cs +++ b/SpriteEd/SpriteSet.cs @@ -58,7 +58,12 @@ namespace SpriteEd /// /// Commodore 64 colour sprites. /// - C64ColourSprite + C64ColourSprite, + + /// + /// Generic mono character set. + /// + MonoCharacterSet } private const uint SET_SIZE = 256; diff --git a/SpriteEd/SpriteSetController.cs b/SpriteEd/SpriteSetController.cs index f8fed80..65f872d 100644 --- a/SpriteEd/SpriteSetController.cs +++ b/SpriteEd/SpriteSetController.cs @@ -35,7 +35,6 @@ namespace SpriteEd base.ViewDidLoad(); m_Width.IntValue = m_WidthStepper.IntValue; m_Height.IntValue = m_HeightStepper.IntValue; - m_PaletteSize.IntValue = m_PaletteSizeStepper.IntValue; m_palette = new Palette(2); m_palette[0] = new Colour(); m_palette[1] = new Colour(255, 255, 255); @@ -94,8 +93,7 @@ namespace SpriteEd m_palette = new Palette(2); m_palette[0] = new Colour(); m_palette[1] = new Colour(255, 255, 255); - m_PaletteSize.IntValue = (int)m_palette.Size; - m_PaletteSizeStepper.IntValue = m_PaletteSize.IntValue; + m_PaletteSize.SelectItemWithTag((nint)m_palette.Size); m_PaletteStepper.MaxValue = m_palette.Size - 1; OnPaletteStepper(m_PaletteStepper); } @@ -107,8 +105,7 @@ namespace SpriteEd m_palette[1] = new Colour(255, 0, 0); m_palette[2] = new Colour(0, 0, 255); m_palette[3] = new Colour(255, 255, 255); - m_PaletteSize.IntValue = (int)m_palette.Size; - m_PaletteSizeStepper.IntValue = m_PaletteSize.IntValue; + m_PaletteSize.SelectItemWithTag((nint)m_palette.Size); m_PaletteStepper.MaxValue = m_palette.Size - 1; OnPaletteStepper(m_PaletteStepper); } @@ -163,6 +160,14 @@ namespace SpriteEd m_DoubleWidth.State = NSCellStateValue.On; m_DoubleHeight.State = NSCellStateValue.Off; break; + + case SpriteSet.SetType.MonoCharacterSet: + SetSize(8, 8); + SetMonoPalette(); + m_CodePoints.SelectItem(0); + m_DoubleWidth.State = NSCellStateValue.Off; + m_DoubleHeight.State = NSCellStateValue.Off; + break; } } @@ -176,12 +181,10 @@ namespace SpriteEd m_Height.IntValue = m_HeightStepper.IntValue; } - partial void OnPaletteSizeStepper(NSObject sender) + partial void OnPaletteSize(NSObject sender) { - m_PaletteSize.IntValue = m_PaletteSizeStepper.IntValue; - Palette oldPalette = m_palette; - m_palette = new Palette((uint)m_PaletteSize.IntValue); + m_palette = new Palette((uint)m_PaletteSize.SelectedItem.Tag); for(uint f = 0; f < m_PaletteSize.IntValue; f++) { diff --git a/SpriteEd/SpriteSetController.designer.cs b/SpriteEd/SpriteSetController.designer.cs index 3a541f0..4b4ecf7 100644 --- a/SpriteEd/SpriteSetController.designer.cs +++ b/SpriteEd/SpriteSetController.designer.cs @@ -37,10 +37,7 @@ namespace SpriteEd AppKit.NSTextField m_PaletteNumber { get; set; } [Outlet] - AppKit.NSTextField m_PaletteSize { get; set; } - - [Outlet] - AppKit.NSStepper m_PaletteSizeStepper { get; set; } + AppKit.NSPopUpButtonCell m_PaletteSize { get; set; } [Outlet] AppKit.NSStepper m_PaletteStepper { get; set; } @@ -63,8 +60,8 @@ namespace SpriteEd [Action ("OnOK:")] partial void OnOK (Foundation.NSObject sender); - [Action ("OnPaletteSizeStepper:")] - partial void OnPaletteSizeStepper (Foundation.NSObject sender); + [Action ("OnPaletteSize:")] + partial void OnPaletteSize (Foundation.NSObject sender); [Action ("OnPaletteStepper:")] partial void OnPaletteStepper (Foundation.NSObject sender); @@ -117,16 +114,6 @@ namespace SpriteEd m_PaletteNumber = null; } - if (m_PaletteSize != null) { - m_PaletteSize.Dispose (); - m_PaletteSize = null; - } - - if (m_PaletteSizeStepper != null) { - m_PaletteSizeStepper.Dispose (); - m_PaletteSizeStepper = null; - } - if (m_PaletteStepper != null) { m_PaletteStepper.Dispose (); m_PaletteStepper = null; @@ -141,6 +128,11 @@ namespace SpriteEd m_WidthStepper.Dispose (); m_WidthStepper = null; } + + if (m_PaletteSize != null) { + m_PaletteSize.Dispose (); + m_PaletteSize = null; + } } } } -- cgit v1.2.3