ResourceConverter.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * ResourceConverter.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "ResourceConverter.h"
  12. #include "../lib/JsonNode.h"
  13. #include "../lib/VCMIDirs.h"
  14. #include "../lib/filesystem/Filesystem.h"
  15. #include "BitmapHandler.h"
  16. #include "Animation.h"
  17. #include "boost/filesystem/path.hpp"
  18. #include "boost/locale.hpp"
  19. namespace bfs = boost::filesystem;
  20. // converts all pcx files from /Images into PNG
  21. void doConvertPcxToPng(bool deleteOriginals)
  22. {
  23. std::string filename;
  24. bfs::path imagesPath = VCMIDirs::get().userExtractedPath() / "IMAGES";
  25. bfs::directory_iterator end_iter;
  26. for(bfs::directory_iterator dir_itr(imagesPath); dir_itr != end_iter; ++dir_itr)
  27. {
  28. try
  29. {
  30. if (!bfs::is_regular_file(dir_itr->status()))
  31. return;
  32. std::string filePath = dir_itr->path().string();
  33. std::string fileStem = dir_itr->path().stem().string();
  34. filename = dir_itr->path().filename().string();
  35. std::string filenameLowerCase = boost::locale::to_lower(filename);
  36. if(bfs::extension(filenameLowerCase) == ".pcx")
  37. {
  38. auto img = BitmapHandler::loadBitmap(filenameLowerCase);
  39. bfs::path pngFilePath = imagesPath / (fileStem + ".png");
  40. img.save(pathToQString(pngFilePath), "PNG");
  41. if(deleteOriginals)
  42. bfs::remove(filePath);
  43. }
  44. }
  45. catch(const std::exception & ex)
  46. {
  47. logGlobal->info(filename + " " + ex.what() + "\n");
  48. }
  49. }
  50. }
  51. // splits a def file into individual parts and converts the output to PNG format
  52. void splitDefFile(const std::string & fileName, const bfs::path & spritesPath, bool deleteOriginals)
  53. {
  54. if(CResourceHandler::get()->existsResource(ResourceID("SPRITES/" + fileName)))
  55. {
  56. std::unique_ptr<Animation> anim = make_unique<Animation>(fileName);
  57. anim->preload();
  58. anim->exportBitmaps(pathToQString(VCMIDirs::get().userExtractedPath()));
  59. if(deleteOriginals)
  60. bfs::remove(spritesPath / fileName);
  61. }
  62. else
  63. logGlobal->error("Def File Split error! " + fileName);
  64. }
  65. // splits def files (TwCrPort, CPRSMALL, FlagPort, ITPA, ITPt, Un32 and Un44) so that faction resources are independent
  66. // (town creature portraits, hero army creature portraits, adventure map dwellings, small town icons, big town icons,
  67. // hero speciality small icons, hero speciality large icons)
  68. void splitDefFiles(bool deleteOriginals)
  69. {
  70. bfs::path spritesPath = VCMIDirs::get().userExtractedPath() / "SPRITES";
  71. for(std::string defFilename : {"TwCrPort.def", "CPRSMALL.def", "FlagPort.def", "ITPA.def", "ITPt.def", "Un32.def", "Un44.def"})
  72. splitDefFile(defFilename, spritesPath, deleteOriginals);
  73. }
  74. void convertExtractedResourceFiles(bool splitDefs, bool convertPcxToPng, bool deleteOriginals)
  75. {
  76. if(splitDefs)
  77. splitDefFiles(deleteOriginals);
  78. if(convertPcxToPng)
  79. doConvertPcxToPng(deleteOriginals);
  80. }