55using System . Windows . Media ;
66using System . Windows . Media . Imaging ;
77using System . Windows . Shapes ;
8+ using Path = System . IO . Path ;
89
910namespace SPRTYL2PNG
1011{
@@ -14,7 +15,7 @@ namespace SPRTYL2PNG
1415 public partial class MainWindow : Window
1516 {
1617 string lastOpenedFile ;
17- Sprite loadedSprite ;
18+ Graphics loadedGraphics ;
1819 Color [ ] transparencyColor = new Color [ ] { Colors . Magenta , Colors . Black , Colors . White } ;
1920
2021 public MainWindow ( )
@@ -25,12 +26,13 @@ public MainWindow()
2526 private void UpdatePreviewPanel ( )
2627 {
2728 previewPanel . Children . Clear ( ) ;
29+ previewTilePanel . Children . Clear ( ) ;
2830
2931 if ( zoomCombo . SelectedIndex > 0 )
3032 RenderOptions . SetBitmapScalingMode ( this , BitmapScalingMode . NearestNeighbor ) ;
3133 else RenderOptions . SetBitmapScalingMode ( this , BitmapScalingMode . Fant ) ;
3234
33- var spriteImage = new Image [ loadedSprite . Count ] ;
35+ var spriteImage = new Image [ loadedGraphics . Quantity ] ;
3436 for ( int i = 0 ; i < spriteImage . Length ; i ++ )
3537 {
3638 spriteImage [ i ] = new Image ( ) ;
@@ -41,17 +43,48 @@ private void UpdatePreviewPanel()
4143 spriteImage [ i ] . Tag = i ;
4244 spriteImage [ i ] . MouseDown += ( sender , args ) =>
4345 {
44- selectedFrame . Source = ( ( Image ) sender ) . Source ;
45- selectedFrameIndex . Content = ( ( Image ) sender ) . Tag ;
46- selectedFrameSize . Content = selectedFrame . Source . Width . ToString ( ) + ";" + selectedFrame . Source . Height . ToString ( ) ;
46+ selectedTile . Source = ( ( Image ) sender ) . Source ;
47+ selectedSpriteIndex . Content = ( ( Image ) sender ) . Tag ;
48+ selectedSpriteSize . Content = selectedTile . Source . Width . ToString ( ) + ", " + selectedTile . Source . Height . ToString ( ) ;
49+ selectedSpriteUnknow . Content = loadedGraphics . GetUnknowByIndex ( ( int ) ( ( Image ) sender ) . Tag ) ;
4750 bottomBar . IsEnabled = true ;
51+ replaceButton . IsEnabled = true ;
4852 } ;
4953 spriteImage [ i ] . SnapsToDevicePixels = true ;
5054 spriteImage [ i ] . LayoutTransform = new ScaleTransform ( zoomCombo . SelectedIndex + 1 , zoomCombo . SelectedIndex + 1 ) ;
51- spriteImage [ i ] . Source = loadedSprite . ToBitmap ( i , GamePalettes . ByIndex ( palettePicker . SelectedIndex ) , transparencyColor [ transparencyColorPicker . SelectedIndex ] ) ;
55+ spriteImage [ i ] . Source = loadedGraphics . ExtractBitmap ( i , GamePalettes . ByIndex ( palettePicker . SelectedIndex ) , transparencyColor [ transparencyColorPicker . SelectedIndex ] ) ;
5256 previewPanel . Children . Add ( spriteImage [ i ] ) ;
5357 }
54-
58+
59+ var tg = ( TileSet ) loadedGraphics ;
60+ if ( tg . TileSetGroupInformation != null )
61+ {
62+ tileColumnDef . Width = new GridLength ( 250 ) ;
63+ var spriteTileImage = new Image [ tg . TileSetGroupInformation . Length ] ;
64+ for ( int i = 0 ; i < spriteTileImage . Length ; i ++ )
65+ {
66+ spriteTileImage [ i ] = new Image ( ) ;
67+
68+ spriteTileImage [ i ] . Margin = new Thickness ( marginsStroke . SelectedIndex * 4 ) ;
69+
70+ spriteTileImage [ i ] . Stretch = Stretch . None ;
71+ spriteTileImage [ i ] . Tag = i ;
72+ spriteTileImage [ i ] . MouseDown += ( sender , args ) =>
73+ {
74+ selectedTile . Source = ( ( Image ) sender ) . Source ;
75+ selectedSpriteIndex . Content = ( ( Image ) sender ) . Tag ;
76+ selectedSpriteSize . Content = selectedTile . Source . Width . ToString ( ) + ", " + selectedTile . Source . Height . ToString ( ) ;
77+ selectedSpriteUnknow . Content = tg . GetUnknowByIndex ( ( int ) ( ( Image ) sender ) . Tag ) ;
78+ bottomBar . IsEnabled = true ;
79+ replaceButton . IsEnabled = false ;
80+ } ;
81+ spriteTileImage [ i ] . SnapsToDevicePixels = true ;
82+ spriteTileImage [ i ] . LayoutTransform = new ScaleTransform ( zoomCombo . SelectedIndex + 1 , zoomCombo . SelectedIndex + 1 ) ;
83+ spriteTileImage [ i ] . Source = tg . ExtractTileGroupBitmap ( i , GamePalettes . ByIndex ( palettePicker . SelectedIndex ) , transparencyColor [ transparencyColorPicker . SelectedIndex ] ) ;
84+ previewTilePanel . Children . Add ( spriteTileImage [ i ] ) ;
85+ }
86+ }
87+ else tileColumnDef . Width = new GridLength ( 0 ) ;
5588 }
5689
5790 private void Open ( object sender , RoutedEventArgs e )
@@ -60,12 +93,64 @@ private void Open(object sender, RoutedEventArgs e)
6093 openFileDialog . Filter = "Sprite or Tileset Files|*.spr;*.tyl|Sprite Files|*.spr|Tileset Files|*.tyl" ;
6194 if ( openFileDialog . ShowDialog ( ) == true )
6295 {
96+ var fileName = Path . GetFileName ( openFileDialog . FileName . ToLower ( ) ) ;
6397 bottomBar . IsEnabled = false ;
6498 previewOptionsMenu . IsEnabled = true ;
65- lastOpenedFile = openFileDialog . FileName ;
99+ exportButton . IsEnabled = true ;
100+ lastOpenedFile = openFileDialog . FileName . ToLower ( ) ;
66101 this . Title = openFileDialog . FileName + " - SPRTYL2PNG" ;
67- bool header = System . IO . Path . GetExtension ( openFileDialog . FileName ) . ToUpper ( ) == ".SPR" ;
68- loadedSprite = new Sprite ( File . OpenRead ( openFileDialog . FileName ) , header ) ;
102+
103+ if ( fileName . EndsWith ( ".spr" ) )
104+ loadedGraphics = new SpriteSheet ( File . ReadAllBytes ( openFileDialog . FileName ) ) ;
105+
106+ else if ( fileName . EndsWith ( ".tyl" ) )
107+ {
108+ int size = 32 ;
109+ bool hasHeader = false , hasUnknowTail = false ;
110+
111+ switch ( fileName )
112+ {
113+ case "medborders.tyl" :
114+ size = 20 ; hasHeader = true ;
115+ break ;
116+ case "mediumroofs.tyl" :
117+ size = 20 ;
118+ break ;
119+ case "lowborders.tyl" :
120+ hasHeader = true ;
121+ break ;
122+ case "locations.tyl" :
123+ hasUnknowTail = true ;
124+ break ;
125+ }
126+
127+ loadedGraphics = new TileSet ( hasHeader , hasUnknowTail , size , File . ReadAllBytes ( openFileDialog . FileName ) ) ;
128+
129+ if ( fileName == "locations.tyl" ) // If true, load locations.dat
130+ {
131+ string path = openFileDialog . FileName . ToLower ( ) . Replace ( ".tyl" , ".dat" ) ;
132+ using ( BinaryReader br = new BinaryReader ( File . OpenRead ( path ) ) )
133+ {
134+ br . BaseStream . Position = 60 ;
135+ int groupCount = ( int ) br . ReadInt16 ( ) * 4 ;
136+ TileSetGroupInformation [ ] tsgi = new TileSetGroupInformation [ groupCount ] ;
137+
138+ for ( int i = 0 ; i < groupCount ; i ++ )
139+ {
140+ if ( i != 0 && ( i & 3 ) == 0 ) //Mulltiple of 4, not zero
141+ br . BaseStream . Position ++ ;
142+
143+ tsgi [ i ] = new TileSetGroupInformation ( br ) ;
144+ }
145+
146+ ( ( TileSet ) loadedGraphics ) . TileSetGroupInformation = tsgi ;
147+ }
148+
149+
150+ }
151+
152+ }
153+
69154 UpdatePreviewPanel ( ) ;
70155 }
71156 }
@@ -76,9 +161,10 @@ private void SaveAs(object sender, RoutedEventArgs e)
76161 saveFileDialog . FileName = lastOpenedFile ;
77162 saveFileDialog . Filter = "Sprite Files|*.spr|Tileset Files|*.tyl" ;
78163 saveFileDialog . InitialDirectory = System . IO . Path . GetDirectoryName ( lastOpenedFile ) ;
164+ if ( lastOpenedFile . EndsWith ( ".tyl" ) ) saveFileDialog . FilterIndex = 1 ;
79165 if ( saveFileDialog . ShowDialog ( ) == true )
80166 {
81- File . WriteAllBytes ( saveFileDialog . FileName , loadedSprite . RawData ) ;
167+ File . WriteAllBytes ( saveFileDialog . FileName , loadedGraphics . RawData ) ;
82168 this . Title = this . Title . Remove ( this . Title . Length - 1 ) ;
83169 }
84170 }
@@ -88,24 +174,26 @@ private void previewOptionsChanged(object sender, SelectionChangedEventArgs e)
88174 UpdatePreviewPanel ( ) ;
89175 }
90176
91- private void ExportPNGFrame ( object sender , RoutedEventArgs e )
177+ private void ExportPNGSprite ( object sender , RoutedEventArgs e )
92178 {
93179 Microsoft . Win32 . SaveFileDialog exportFileDialog = new Microsoft . Win32 . SaveFileDialog ( ) ;
94180 exportFileDialog . Filter = "PNG-8|*.png" ;
95181 if ( exportFileDialog . ShowDialog ( ) == true )
96182 {
97183 //Create a 8bit PNG with transparency
98- var bitmap = loadedSprite . ToBitmap ( int . Parse ( selectedFrameIndex . Content . ToString ( ) ) , GamePalettes . ByIndex ( palettePicker . SelectedIndex ) , Color . FromArgb ( 0 , 0 , 0 , 0 ) ) ;
184+
185+ //var bitmap = loadedGraphics.ExtractBitmap(int.Parse(selectedSpriteIndex.Content.ToString()), GamePalettes.ByIndex(palettePicker.SelectedIndex), Color.FromArgb(0,0,0,0));
186+ var bitmap = selectedTile . Source ;
99187 using ( var fileStream = new FileStream ( exportFileDialog . FileName , FileMode . Create ) )
100188 {
101189 BitmapEncoder encoder = new PngBitmapEncoder ( ) ;
102- encoder . Frames . Add ( BitmapFrame . Create ( bitmap ) ) ;
190+ encoder . Frames . Add ( BitmapFrame . Create ( bitmap as BitmapSource ) ) ;
103191 encoder . Save ( fileStream ) ;
104192 }
105193 }
106194 }
107195
108- private void ImportPNGFrame ( object sender , RoutedEventArgs e )
196+ private void ImportPNGSprite ( object sender , RoutedEventArgs e )
109197 {
110198 Microsoft . Win32 . OpenFileDialog openFileDialog = new Microsoft . Win32 . OpenFileDialog ( ) ;
111199 openFileDialog . Filter = "PNG-8|*.png" ;
@@ -119,7 +207,7 @@ private void ImportPNGFrame(object sender, RoutedEventArgs e)
119207
120208 try
121209 {
122- loadedSprite . Replace ( int . Parse ( selectedFrameIndex . Content . ToString ( ) ) , bs , GamePalettes . ByIndex ( palettePicker . SelectedIndex ) ) ;
210+ loadedGraphics . OverwriteBitmap ( int . Parse ( selectedSpriteIndex . Content . ToString ( ) ) , bs , GamePalettes . ByIndex ( palettePicker . SelectedIndex ) ) ;
123211 }
124212 catch ( NotImplementedException )
125213 {
@@ -148,5 +236,29 @@ private void ImportPNGFrame(object sender, RoutedEventArgs e)
148236 }
149237
150238 }
239+
240+ private void ExportAll ( object sender , RoutedEventArgs e )
241+ {
242+ Microsoft . Win32 . SaveFileDialog exportFileDialog = new Microsoft . Win32 . SaveFileDialog ( ) ;
243+ exportFileDialog . Filter = "PNG-8|*.png" ;
244+ exportFileDialog . Title = "All frames will be exported" ;
245+ exportFileDialog . FileName = "X.png" ;
246+ if ( exportFileDialog . ShowDialog ( ) == true )
247+ {
248+ for ( int i = 0 ; i < loadedGraphics . Quantity ; i ++ )
249+ {
250+ string exportName = System . IO . Path . GetDirectoryName ( exportFileDialog . FileName ) + "\\ " + i . ToString ( ) + ".PNG" ;
251+ //Create a 8bit PNG with transparency
252+ var bitmap = loadedGraphics . ExtractBitmap ( i , GamePalettes . ByIndex ( palettePicker . SelectedIndex ) , Color . FromArgb ( 0 , 0 , 0 , 0 ) ) ;
253+ using ( var fileStream = new FileStream ( exportName , FileMode . Create ) )
254+ {
255+ BitmapEncoder encoder = new PngBitmapEncoder ( ) ;
256+ encoder . Frames . Add ( BitmapFrame . Create ( bitmap ) ) ;
257+ encoder . Save ( fileStream ) ;
258+ }
259+
260+ }
261+ }
262+ }
151263 }
152264}
0 commit comments