11#include " ../components/settings/settings.h"
2+ #include < cel/celfile.h>
23#include < chrono>
34#include < faio/fafileobject.h>
45#include < fmt/format.h>
56#include < input/inputmanager.h>
7+ #include < misc/stringops.h>
68#include < nfd.h>
79#include < nuklearmisc/inputfwd.h>
810#include < nuklearmisc/standaloneguispritehandler.h>
@@ -16,7 +18,9 @@ int main(int argc, char** argv)
1618 if (argc > 2 )
1719 message_and_abort_fmt (" Usage: %s [filename]" , argv[0 ]);
1820
19- Render::RenderSettings renderSettings;
21+ Cel::CelDecoder::loadConfigFiles ();
22+
23+ Render::RenderSettings renderSettings = {};
2024 renderSettings.windowWidth = 800 ;
2125 renderSettings.windowHeight = 600 ;
2226 renderSettings.fullscreen = false ;
@@ -29,12 +33,12 @@ int main(int argc, char** argv)
2933 settings.loadFromFile (Misc::getResourcesPath ().str () + " /celview.ini" );
3034
3135 bool faioInitDone = false ;
32- std::string listFile = settings.get <std::string>(" celview" , " listFile" , " Diablo I.txt" );
33- std::string mpqFile = settings.get <std::string>(" celview" , " mpqFile" , " DIABDAT.MPQ" );
36+ auto listFile = settings.get <std::string>(" celview" , " listFile" , " Diablo I.txt" );
37+ auto mpqFile = settings.get <std::string>(" celview" , " mpqFile" , " DIABDAT.MPQ" );
3438
3539 std::vector<std::string> celFiles;
3640
37- std::string selectedImage = " " ;
41+ std::string selectedImage;
3842 std::unique_ptr<NuklearMisc::GuiSprite> image;
3943
4044 std::unique_ptr<NuklearMisc::GuiSprite> nextImage;
@@ -67,7 +71,7 @@ int main(int argc, char** argv)
6771
6872 std::string label = selectedImage;
6973
70- if (selectedImage == " " )
74+ if (selectedImage. empty () )
7175 label = " No image selected" ;
7276
7377 nk_label (ctx, label.c_str (), NK_TEXT_CENTERED);
@@ -76,31 +80,53 @@ int main(int argc, char** argv)
7680
7781 if (image)
7882 {
79- nk_label (ctx, fmt::format (" Number of Frames: {}" , image. get ()-> getSprite () ->size ()).c_str (), NK_TEXT_LEFT);
80- nk_label (ctx, fmt::format (" Width: {}" , image->getSprite ()-> getWidth () ).c_str (), NK_TEXT_LEFT);
81- nk_label (ctx, fmt::format (" Height: {}" , image->getSprite ()-> getHeight () ).c_str (), NK_TEXT_LEFT);
82- frame = nk_propertyi (ctx, " Frame" , 0 , frame, image->getSprite ()-> size (), 1 , 0 .2f );
83+ nk_label (ctx, fmt::format (" Number of Frames: {}" , image->size ()).c_str (), NK_TEXT_LEFT);
84+ nk_label (ctx, fmt::format (" Width: {}" , image->getNkImage (frame). w ).c_str (), NK_TEXT_LEFT);
85+ nk_label (ctx, fmt::format (" Height: {}" , image->getNkImage (frame). h ).c_str (), NK_TEXT_LEFT);
86+ frame = nk_propertyi (ctx, " Frame" , 0 , frame, image->size (), 1 , 0 .2f );
8387
8488 if (nk_button_label (ctx, " save as png" ))
8589 {
86- nfdchar_t * outPath = NULL ;
87- nfdresult_t result = NFD_SaveDialog (" png" , NULL , &outPath);
90+ nfdchar_t * outPath = nullptr ;
91+ nfdresult_t result = NFD_SaveDialog (" png" , nullptr , &outPath);
8892 if (result == NFD_OKAY)
8993 {
90- Render::SpriteGroup::toPng (selectedImage, outPath);
91- free (outPath);
94+ Cel::CelFile cel (selectedImage);
95+ std::vector<Image> images = cel.decode ();
96+
97+ int32_t sumWidth = 0 ;
98+ int32_t maxHeight = 0 ;
99+ for (int32_t i = 0 ; i < int32_t (images.size ()); i++)
100+ {
101+ sumWidth += images[i].width ();
102+ if (images[i].height () > maxHeight)
103+ maxHeight = images[i].height ();
104+ }
105+
106+ Image tmp (sumWidth, maxHeight);
107+
108+ int32_t x = 0 ;
109+ for (int32_t i = 0 ; i < int32_t (images.size ()); i++)
110+ {
111+ images[i].blitTo (tmp, x, 0 );
112+ x += images[i].width ();
113+ }
114+
115+ Image::saveToPng (tmp, outPath);
92116 }
117+ free (outPath);
93118 }
94119
95120 if (nk_button_label (ctx, " save as gif" ))
96121 {
97- nfdchar_t * outPath = NULL ;
98- nfdresult_t result = NFD_SaveDialog (" gif" , NULL , &outPath);
122+ nfdchar_t * outPath = nullptr ;
123+ nfdresult_t result = NFD_SaveDialog (" gif" , nullptr , &outPath);
99124 if (result == NFD_OKAY)
100125 {
101- Render::SpriteGroup::toGif (selectedImage, outPath );
102- free ( outPath);
126+ Cel::CelDecoder cel (selectedImage);
127+ Image::saveToGif (cel. decode (), outPath);
103128 }
129+ free (outPath);
104130 }
105131
106132 auto msSinceLastFrame = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastFrame).count ();
@@ -110,25 +136,23 @@ int main(int argc, char** argv)
110136 frame++;
111137 }
112138
113- if (frame >= (int32_t )image. get ()-> getSprite () ->size ())
139+ if (frame >= (int32_t )image->size ())
114140 frame = 0 ;
115141
116- Render::Sprite sprite = image.get ()->getSprite ()->operator [](frame);
117-
118- int32_t w, h;
119- Render::spriteSize (sprite, w, h);
142+ int32_t w = image->getNkImage (frame).w ;
143+ int32_t h = image->getNkImage (frame).h ;
120144
121145 nk_layout_space_begin (ctx, NK_STATIC, h, 1 );
122146 {
123147 nk_layout_space_push (ctx, nk_rect (0 , 0 , w, h));
124148
125149 auto canvas = nk_window_get_canvas (ctx);
126150
127- struct nk_rect imageRect;
151+ struct nk_rect imageRect = {} ;
128152 nk_widget (&imageRect, ctx);
129153 nk_fill_rect (canvas, imageRect, 0.0 , nk_rgb (0 , 255 , 0 ));
130154
131- auto img = image. get () ->getNkImage (frame);
155+ auto img = image->getNkImage (frame);
132156 nk_draw_image (canvas, imageRect, &img, nk_rgb (255 , 255 , 255 ));
133157 }
134158 nk_layout_space_end (ctx);
@@ -153,7 +177,9 @@ int main(int argc, char** argv)
153177 auto tmp = FAIO::listMpqFiles (" *.cl2" );
154178 celFiles.insert (celFiles.end (), tmp.begin (), tmp.end ());
155179
156- std::sort (celFiles.begin (), celFiles.end ());
180+ std::sort (celFiles.begin (), celFiles.end (), [](const std::string& l, const std::string& r) {
181+ return Misc::StringUtils::toLower (l) < Misc::StringUtils::toLower (r);
182+ });
157183
158184 settings.set <std::string>(" celview" , " listFile" , listFile);
159185 settings.set <std::string>(" celview" , " mpqFile" , mpqFile);
@@ -165,25 +191,29 @@ int main(int argc, char** argv)
165191 {
166192 selectedImage = argv[1 ];
167193 frame = 0 ;
168- nextImage = std::unique_ptr<NuklearMisc::GuiSprite>(guiHandler.getSprite (new Render::SpriteGroup (selectedImage, false )));
194+
195+ Cel::CelFile cel (selectedImage);
196+ nextImage = std::make_unique<NuklearMisc::GuiSprite>(cel.decode ());
169197 }
170198 }
171199 }
172200
173201 nk_layout_row_dynamic (ctx, rowHeight, 1 );
174202
175- for (size_t i = 0 ; i < celFiles. size (); i++ )
203+ for (auto & celFile : celFiles)
176204 {
177205 auto buttonStyle = ctx->style .button ;
178206
179- if (selectedImage == celFiles[i] )
207+ if (selectedImage == celFile )
180208 buttonStyle.normal = buttonStyle.hover ;
181209
182- if (nk_button_label_styled (ctx, &buttonStyle, celFiles[i] .c_str ()))
210+ if (nk_button_label_styled (ctx, &buttonStyle, celFile .c_str ()))
183211 {
184- selectedImage = celFiles[i] ;
212+ selectedImage = celFile ;
185213 frame = 0 ;
186- nextImage = std::unique_ptr<NuklearMisc::GuiSprite>(guiHandler.getSprite (new Render::SpriteGroup (selectedImage, false )));
214+
215+ Cel::CelFile cel (selectedImage);
216+ nextImage = std::make_unique<NuklearMisc::GuiSprite>(cel.decode ());
187217 }
188218 }
189219
0 commit comments