@@ -98,7 +98,7 @@ public MainForm()
98
98
//model = new MainFormModel(logger, SettingsFile, palette);
99
99
100
100
var paletteBitmap = SixLabors . ImageSharp . Image . Load < Rgb24 > ( stream ! ) ;
101
- var palette = PaletteHelpers . PaletteFromBitmapIS ( paletteBitmap ) ;
101
+ var palette = new PaletteMap ( paletteBitmap ) ;
102
102
model = new MainFormModel ( logger , SettingsFile , palette ) ;
103
103
}
104
104
@@ -204,7 +204,7 @@ static ImageList MakeImageList(MainFormModel model, ILogger? logger = null)
204
204
var objectTypes = Enum . GetValues < ObjectType > ( ) . Length ;
205
205
var g1TabElements = model . G1 . G1Elements . Skip ( Constants . G1ObjectTabsOffset ) . Take ( objectTypes ) . ToList ( ) ;
206
206
207
- var images = CreateImages ( g1TabElements , model . Palette , true , logger ) . ToArray ( ) ;
207
+ var images = CreateImages ( g1TabElements , model . PaletteMap , true , logger ) . ToArray ( ) ;
208
208
imageList . Images . AddRange ( images ) ;
209
209
}
210
210
@@ -633,16 +633,32 @@ public void ImportImages()
633
633
634
634
if ( fbDialog . ShowDialog ( ) == DialogResult . OK )
635
635
{
636
- currentUIObjectImages . Clear ( ) ;
637
636
var files = Directory . GetFiles ( fbDialog . SelectedPath ) ;
638
- var sorted = files . OrderBy ( f => int . Parse ( Path . GetFileNameWithoutExtension ( f ) [ 5 ..] ) ) ;
639
- foreach ( var file in sorted )
637
+ var sorted = files . OrderBy ( f => int . Parse ( Path . GetFileNameWithoutExtension ( f ) . Split ( '-' ) [ 0 ] ) ) ;
638
+
639
+ if ( CurrentUIObject is IUiObjectWithGraphics uiObjHasGraphics )
640
640
{
641
- var img = ( Bitmap ) Image . FromFile ( file ) ;
642
- currentUIObjectImages . Add ( img ) ;
641
+ //var g1Elements = new List<G1Element32>();
642
+ var i = 0 ;
643
+ foreach ( var file in sorted )
644
+ {
645
+ var img = SixLabors . ImageSharp . Image . Load < Rgb24 > ( file ) ;
646
+ var data = model . PaletteMap . ConvertRgb24ImageToG1Data ( img ) ;
647
+ var hasTransparency = data . Any ( b => b == 0 ) ;
648
+ var oldImage = uiObjHasGraphics . G1Elements [ i ++ ] ;
649
+ oldImage . ImageData = model . PaletteMap . ConvertRgb24ImageToG1Data ( img ) ;
650
+ //var g1Element = new G1Element32(0, (short)img.Width, (short)img.Height, oldImage.XOffset, oldImage.YOffset, hasTransparency ? G1ElementFlags.HasTransparency : G1ElementFlags.None, oldImage.ZoomOffset)
651
+ //{
652
+ // ImageData = model.PaletteMap.ConvertRgb24ImageToG1Data(img)
653
+ //};
654
+ //g1Elements.Add(g1Element);
655
+ }
656
+
657
+ //uiObjHasGraphics.G1Elements = g1Elements;
658
+ currentUIObjectImages = CreateImages ( uiObjHasGraphics . G1Elements , model . PaletteMap ) . ToList ( ) ;
659
+ RefreshImageControls ( ) ;
643
660
}
644
661
645
- RefreshImageControls ( ) ;
646
662
}
647
663
}
648
664
}
@@ -979,8 +995,12 @@ IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images)
979
995
// todo: on these controls we could add a right_click handler to replace image with user-created one
980
996
var count = 0 ;
981
997
998
+ var uiObjHasGraphics = CurrentUIObject as IUiObjectWithGraphics ;
999
+
1000
+ int counter = 0 ;
982
1001
foreach ( var img in images )
983
1002
{
1003
+ var ele = uiObjHasGraphics . G1Elements [ counter ++ ] ;
984
1004
var panel = new FlowLayoutPanel
985
1005
{
986
1006
AutoSize = true ,
@@ -1002,8 +1022,8 @@ IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images)
1002
1022
var text = GetImageName ( CurrentUIObject , count ) ;
1003
1023
var tb = new TextBox
1004
1024
{
1005
- Text = GetImageName ( CurrentUIObject , count ) ,
1006
- Dock = DockStyle . Top
1025
+ Text = GetImageName ( CurrentUIObject , count ) + $ " - { ele } " ,
1026
+ Dock = DockStyle . Top ,
1007
1027
} ;
1008
1028
var size = TextRenderer . MeasureText ( text , tb . Font ) ;
1009
1029
tb . MinimumSize = new Size ( size . Width , 16 ) ;
@@ -1017,11 +1037,11 @@ IEnumerable<Control> CreateImageControls(IEnumerable<Bitmap> images)
1017
1037
}
1018
1038
}
1019
1039
1020
- static IEnumerable < Bitmap > CreateImages ( List < G1Element32 > G1Elements , SixLabors . ImageSharp . Color [ ] palette , bool useTransparency = false , ILogger ? logger = null )
1040
+ static IEnumerable < Bitmap > CreateImages ( List < G1Element32 > G1Elements , PaletteMap paletteMap , bool useTransparency = false , ILogger ? logger = null )
1021
1041
{
1022
- if ( palette is null )
1042
+ if ( paletteMap is null )
1023
1043
{
1024
- logger . Error ( "Palette was empty; please load a valid palette file" ) ;
1044
+ logger ? . Error ( "Palette was empty; please load a valid palette file" ) ;
1025
1045
yield break ;
1026
1046
}
1027
1047
@@ -1036,35 +1056,38 @@ static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, SixLabors.
1036
1056
1037
1057
if ( currElement . Flags . HasFlag ( G1ElementFlags . IsR8G8B8Palette ) )
1038
1058
{
1039
- var imageData = currElement . ImageData ;
1040
- var dstImg = new Bitmap ( currElement . Width , currElement . Height ) ;
1041
- var rect = new Rectangle ( 0 , 0 , currElement . Width , currElement . Height ) ;
1042
- var dstImgData = dstImg . LockBits ( rect , ImageLockMode . WriteOnly , PixelFormat . Format32bppArgb ) ;
1043
-
1044
- var k = 0 ;
1045
- for ( var j = 0 ; j < currElement . Width ; ++ j ) // += 4 for a 32-bit ptr++
1046
- {
1047
- var b = imageData [ k ++ ] ;
1048
- var g = imageData [ k ++ ] ;
1049
- var r = imageData [ k ++ ] ;
1050
- ImageHelpers . SetPixel ( dstImgData , j , 1 , Color . FromArgb ( r , g , b ) ) ;
1051
- }
1052
-
1053
- dstImg . UnlockBits ( dstImgData ) ;
1054
- yield return dstImg ;
1059
+ var bmp = G1RGBToBitmap ( currElement ) ;
1060
+ yield return bmp ;
1055
1061
}
1056
1062
else
1057
1063
{
1058
- var bmp = G1ElementToBitmap ( currElement , palette , useTransparency ) ;
1059
- if ( bmp != null )
1060
- {
1061
- yield return bmp ;
1062
- }
1064
+ var bmp = G1IndexedToBitmap ( currElement , paletteMap , useTransparency ) ;
1065
+ yield return bmp ;
1063
1066
}
1064
1067
}
1065
1068
}
1066
1069
1067
- static Bitmap ? G1ElementToBitmap ( G1Element32 currElement , SixLabors . ImageSharp . Color [ ] palette , bool useTransparency = false )
1070
+ static Bitmap G1RGBToBitmap ( G1Element32 currElement )
1071
+ {
1072
+ var imageData = currElement . ImageData ;
1073
+ var bmp = new Bitmap ( currElement . Width , currElement . Height ) ;
1074
+ var rect = new Rectangle ( 0 , 0 , currElement . Width , currElement . Height ) ;
1075
+ var dstImgData = bmp . LockBits ( rect , ImageLockMode . WriteOnly , PixelFormat . Format32bppArgb ) ;
1076
+
1077
+ var k = 0 ;
1078
+ for ( var j = 0 ; j < currElement . Width ; ++ j ) // += 4 for a 32-bit ptr++
1079
+ {
1080
+ var b = imageData [ k ++ ] ;
1081
+ var g = imageData [ k ++ ] ;
1082
+ var r = imageData [ k ++ ] ;
1083
+ ImageHelpers . SetPixel ( dstImgData , j , 1 , Color . FromArgb ( r , g , b ) ) ;
1084
+ }
1085
+
1086
+ bmp . UnlockBits ( dstImgData ) ;
1087
+ return bmp ;
1088
+ }
1089
+
1090
+ static Bitmap G1IndexedToBitmap ( G1Element32 currElement , PaletteMap paletteMap , bool useTransparency = false )
1068
1091
{
1069
1092
var imageData = currElement . ImageData ;
1070
1093
var dstImg = new Bitmap ( currElement . Width , currElement . Height ) ;
@@ -1088,7 +1111,7 @@ static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, SixLabors.
1088
1111
//{
1089
1112
// //Debugger.Break();
1090
1113
//}
1091
- var colour = palette [ paletteIndex ] ;
1114
+ var colour = paletteMap . Palette [ paletteIndex ] . Color ;
1092
1115
var pixel = colour . ToPixel < Rgb24 > ( ) ;
1093
1116
ImageHelpers . SetPixel ( dstImgData , x , y , Color . FromArgb ( pixel . R , pixel . G , pixel . B ) ) ;
1094
1117
}
@@ -1099,22 +1122,25 @@ static IEnumerable<Bitmap> CreateImages(List<G1Element32> G1Elements, SixLabors.
1099
1122
return dstImg ;
1100
1123
}
1101
1124
1125
+ string lastPaletteDirectory = Directory . GetCurrentDirectory ( ) ;
1126
+
1102
1127
void SelectNewPalette ( )
1103
1128
{
1104
1129
using ( var openFileDialog = new OpenFileDialog ( ) )
1105
1130
{
1106
- openFileDialog . InitialDirectory = Directory . GetCurrentDirectory ( ) ;
1131
+ openFileDialog . InitialDirectory = lastPaletteDirectory ;
1107
1132
openFileDialog . Filter = "Palette Image Files(*.png)|*.png|All files (*.*)|*.*" ;
1108
1133
openFileDialog . FilterIndex = 1 ;
1109
1134
openFileDialog . RestoreDirectory = true ;
1110
1135
1111
1136
if ( openFileDialog . ShowDialog ( ) == DialogResult . OK && File . Exists ( openFileDialog . FileName ) )
1112
1137
{
1113
1138
//model.PaletteFile = openFileDialog.FileName;
1114
- var paletteBitmap = ( Bitmap ) Image . FromFile ( openFileDialog . FileName ) ;
1115
- model . Palette = PaletteHelpers . PaletteFromBitmap ( paletteBitmap ) ;
1139
+ var paletteBitmap = SixLabors . ImageSharp . Image . Load < Rgb24 > ( openFileDialog . FileName ) ;
1140
+ model . PaletteMap = new PaletteMap ( paletteBitmap ) ;
1116
1141
1117
1142
RefreshObjectUI ( ) ;
1143
+ lastPaletteDirectory = Path . GetDirectoryName ( openFileDialog . FileName ) ?? lastPaletteDirectory ;
1118
1144
}
1119
1145
}
1120
1146
}
@@ -1166,7 +1192,7 @@ void RefreshObjectUI()
1166
1192
// return;
1167
1193
//}
1168
1194
1169
- currentUIObjectImages = CreateImages ( uiLocoObj . LocoObject . G1Elements , model . Palette , logger : logger ) . ToList ( ) ;
1195
+ currentUIObjectImages = CreateImages ( uiLocoObj . LocoObject . G1Elements , model . PaletteMap , logger : logger ) . ToList ( ) ;
1170
1196
RefreshImageControls ( ) ;
1171
1197
}
1172
1198
@@ -1206,7 +1232,7 @@ void RefreshObjectUI()
1206
1232
if ( CurrentUIObject is UiG1 uiG1 )
1207
1233
{
1208
1234
pgS5Header . SelectedObject = uiG1 . G1 . G1Header ;
1209
- currentUIObjectImages = CreateImages ( uiG1 . G1 . G1Elements , model . Palette ) . ToList ( ) ;
1235
+ currentUIObjectImages = CreateImages ( uiG1 . G1 . G1Elements , model . PaletteMap ) . ToList ( ) ;
1210
1236
RefreshImageControls ( ) ;
1211
1237
}
1212
1238
0 commit comments