]> git.sesse.net Git - casparcg/blob - modules/image/util/image_loader.cpp
2.0.0.2: Mayor solution reconfiguration.
[casparcg] / modules / image / util / image_loader.cpp
1 #include "image_loader.h"\r
2 \r
3 #include <common/exception/Exceptions.h>\r
4 #include <common/utility/string.h>\r
5 \r
6 #if defined(_MSC_VER)\r
7 #pragma warning (disable : 4714) // marked as __forceinline not inlined\r
8 #endif\r
9 \r
10 #include <boost/filesystem.hpp>\r
11 #include <boost/exception/errinfo_file_name.hpp>\r
12 #include <boost/thread/once.hpp>\r
13 \r
14 namespace caspar { \r
15 \r
16 std::shared_ptr<FIBITMAP> load_image(const std::string& filename)\r
17 {\r
18         struct FreeImage_initializer\r
19         {\r
20                 FreeImage_initializer(){FreeImage_Initialise(true);}\r
21                 ~FreeImage_initializer(){FreeImage_DeInitialise();}\r
22         } static init;\r
23 \r
24         if(!boost::filesystem::exists(filename))\r
25                 BOOST_THROW_EXCEPTION(file_not_found() << boost::errinfo_file_name(filename));\r
26 \r
27         FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;\r
28         fif = FreeImage_GetFileType(filename.c_str(), 0);\r
29         if(fif == FIF_UNKNOWN) \r
30                 fif = FreeImage_GetFIFFromFilename(filename.c_str());\r
31                 \r
32         if(fif == FIF_UNKNOWN || !FreeImage_FIFSupportsReading(fif)) \r
33                 BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));\r
34                 \r
35         auto bitmap = std::shared_ptr<FIBITMAP>(FreeImage_Load(fif, filename.c_str(), 0), FreeImage_Unload);\r
36                   \r
37         if(FreeImage_GetBPP(bitmap.get()) != 32)\r
38         {\r
39                 bitmap = std::shared_ptr<FIBITMAP>(FreeImage_ConvertTo32Bits(bitmap.get()), FreeImage_Unload);\r
40                 if(!bitmap)\r
41                         BOOST_THROW_EXCEPTION(invalid_argument() << msg_info("Unsupported image format."));                     \r
42         }\r
43         \r
44         return bitmap;\r
45 }\r
46 \r
47 std::shared_ptr<FIBITMAP> load_image(const std::wstring& filename)\r
48 {\r
49         return load_image(narrow(filename));\r
50 }\r
51 \r
52 }