21 #include "freeimage/buffer.h"
24 using namespace mondschein;
27 void FreeImageErrorHandler(FREE_IMAGE_FORMAT fif,
const char *message)
29 std::cerr<<
"FreeImage ERROR: "<<message<<std::endl;
33 FI_Buffer::FI_Buffer() :
Buffer(), format(FIF_UNKNOWN)
38 FI_Buffer::FI_Buffer(FI_Buffer_c _b) :
Buffer(_b), format(_b->format)
40 FreeImage_SetOutputMessage(FreeImageErrorHandler);
44 FI_Buffer::FI_Buffer(FREE_IMAGE_FORMAT _format) :
Buffer(), format(_format)
46 FreeImage_SetOutputMessage(FreeImageErrorHandler);
50 FI_Buffer::~FI_Buffer()
55 FI_Buffer &FI_Buffer::operator=(FI_Buffer_c _b)
57 Buffer::operator=(_b);
69 if (content.empty())
return;
76 std::string err(*boost::get_error_info<exception_error>(e));
77 err+=
", called in function\n\tvoid mondschein::io::FI_Buffer::parse_istream(const std::istream& _in)";
87 std::cout<<
"Mondschein Engine DEBUG: Loading image \"FI_Texture\"...\nParameter info:\nLength: "<<_in.size()<<std::endl;
89 std::cout<<
"Data: "<<_in<<std::endl;
91 std::cout<<
"Data: <shorted out>"<<std::endl;
94 BYTE *str=
new BYTE[_in.size()];
95 for (uint i=0;i<_in.size();++i) str[i]=_in.at(i);
96 FIMEMORY *buffer=FreeImage_OpenMemory(str,_in.size());
99 std::string err(
"Mondschein Engine ERROR: Error while opening memory buffer. Exception raised in function\n\t");
100 err+=
"void mondschein::io::FI_Buffer::parse_string(const std::string& _in)";
103 FIBITMAP *image=
nullptr;
104 if (format == FIF_UNKNOWN) format=FreeImage_GetFileTypeFromMemory(buffer,_in.size());
105 if (format == FIF_UNKNOWN)
107 std::string err(
"Mondschein Engine ERROR: Could not detect any valid file format. ");
108 err+=
"Exception raised in function\n\t";
109 err+=
"void mondschein::io::FI_Buffer::parse_string(const std::string& _in)";
112 if (FreeImage_FIFSupportsReading(format))
114 image=FreeImage_LoadFromMemory(format,buffer);
117 std::string err(
"Mondschein Engine ERROR: Error while loading image. Exception raised in function\n\t");
118 err+=
"void mondschein::io::FI_Buffer::parse_string(const std::string& _in)";
124 std::string err(
"Mondschein Engine ERROR: File format plugin <");
125 err+=FreeImage_GetFormatFromFIF(format);
126 err+=
"> does not support reading. ";
127 err+=
"Exception raised in function\n\t";
128 err+=
"void mondschein::io::FI_Buffer::parse_string(const std::string& _in)";
131 FreeImage_CloseMemory(buffer);
135 if (FreeImage_GetImageType(image)!=FIT_BITMAP) image=FreeImage_ConvertToStandardType(image,
true);
136 uint8 *tmp=
static_cast<uint8 *
>(FreeImage_GetBits(image));
137 uint32 s=FreeImage_GetWidth(image)*FreeImage_GetHeight(image)*FreeImage_GetBPP(image)/8;
138 std::vector<uint8> data(s);
139 for (
uint32 i=0; i<s; ++i)
144 !FreeImage_IsLittleEndian(),ONN,0,0,data);
147 std::cout<<
"Mondschein Engine DEBUG: Loaded texture \"FI_Texture\":\nWidth: "<<texture.
width;
148 std::cout<<
"\nHeight: "<<texture.
height<<
"\nBPP: "<<(int)texture.
bpp<<
"\nRGB: "<<texture.
rgb<<
"\nTexture filter: ";
152 for (uint i=0;i<texture.
data.size();++i) std::cout<<texture.
data.at(i);
153 std::cout<<std::endl;
155 std::cout<<
"<shorted out>"<<std::endl;
159 FreeImage_Unload(image);
161 result.
nodes.insert(std::make_pair(
"ID_FI_TEXTURE",scene::Texture_p(
new scene::Texture(
"ID_FI_TEXTURE",texture))));
175 std::string err(*boost::get_error_info<exception_error>(e));
176 err+=
", called in function\n\tvoid mondschein::io::FI_Buffer::parse_istream(const std::istream& _in)";
189 std::string err(
"Mondschein Engine ERROR: No Element \"FI_Texture\" or \"FI_Texture\" is not a texture node. ");
190 err+=
"Exception raised in function\n\t";
191 err+=
"void mondschein::io::FI_Buffer::serialize_string(std::string &_out) const";
195 FIBITMAP *image=FreeImage_Allocate(texture.
width,texture.
height,texture.
bpp);
196 uint8 *data=
static_cast<uint8 *
>(FreeImage_GetBits(image));
198 for (
uint32 i=0; i<s; ++i)
200 data[i]=texture.
data.at(i);
204 char str[FreeImage_GetDIBSize(image)];
205 FIMEMORY *buffer=FreeImage_OpenMemory(reinterpret_cast<BYTE *>(data),FreeImage_GetDIBSize(image));
206 if (format == FIF_UNKNOWN)
208 if (FreeImage_FIFSupportsWriting(FIF_JPEG)) FreeImage_SaveToMemory(FIF_JPEG,image,buffer);
212 if (FreeImage_FIFSupportsWriting(format)) FreeImage_SaveToMemory(format,image,buffer);
214 FreeImage_CloseMemory(buffer);
219 void FI_Buffer::set_format(FREE_IMAGE_FORMAT _format)
225 FREE_IMAGE_FORMAT FI_Buffer::get_format()
const