1 #include "xr_image.h"
2 #include "xr_file_system.h"
3 
4 using namespace xray_re;
5 
save_bmp(xr_writer & w) const6 void xr_image::save_bmp(xr_writer& w) const
7 {
8 	unsigned row_length = (m_width*3 + 3) & ~3;
9 	unsigned pad = row_length - m_width*3;
10 
11 	w.w_u16(0x4d42);
12 	w.w_u32(m_height*row_length);
13 	w.w_u16(0);
14 	w.w_u16(0);
15 	w.w_u32(0x36);
16 
17 	// bmp v5
18 	w.w_u32(0x28);
19 	w.w_u32(m_width);
20 	w.w_u32(m_height);
21 	w.w_u16(1);
22 	w.w_u16(24);
23 	w.w_u32(0);
24 	w.w_u32(0);
25 	w.w_u32(0xb12);
26 	w.w_u32(0xb12);
27 	w.w_u32(0);
28 	w.w_u32(0);
29 
30 	unsigned column = m_width;
31 	for (const rgba32* p = m_data + m_width*(m_height - 1); p >= m_data; ++p) {
32 		rgba32 rgba = *p;
33 		w.w_u8(uint8_t(rgba & UINT8_MAX));
34 		w.w_u8(uint8_t((rgba >> 8) & UINT8_MAX));
35 		w.w_u8(uint8_t((rgba >> 16) & UINT8_MAX));
36 		if (--column == 0) {
37 			column = m_width;
38 			p -= 2*m_width;
39 			for (size_t k = pad; k != 0; --k)
40 				w.w_u8(0);
41 		}
42 	}
43 }
44 
save_bmp(const std::string & path) const45 bool xr_image::save_bmp(const std::string& path) const
46 {
47 	xr_memory_writer* w = new xr_memory_writer();
48 	save_bmp(*w);
49 	bool status = w->save_to(path);
50 	delete w;
51 	return status;
52 }
53 
save_bmp(const char * path,const char * name) const54 bool xr_image::save_bmp(const char* path, const char* name) const
55 {
56 	xr_memory_writer* w = new xr_memory_writer();
57 	save_bmp(*w);
58 	bool status = w->save_to(path, name);
59 	delete w;
60 	return status;
61 }
62