1 #include "xr_image.h" 2 #include "xr_file_system.h" 3 4 using namespace xray_re; 5 save_bmp(xr_writer & w) const6void 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) const45bool 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) const54bool 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