diff --git a/cs677/pa3/BMP.cc b/cs677/pa3/BMP.cc index 8bdd860..7753df4 100644 --- a/cs677/pa3/BMP.cc +++ b/cs677/pa3/BMP.cc @@ -91,6 +91,30 @@ bool BMP::create(char * fileName, int width, int height, unsigned char * data) return (m_fp != NULL); } +void BMP::read(unsigned char * buf) +{ + if (m_fp != NULL) + { + int row_data_bytes = 3 * m_info.width; + int row_padding = row_data_bytes & 0x3; + if (row_padding) + row_padding = 4 - row_padding; + fseek(m_fp, + (m_header.offset != 0 + ? m_header.offset + : sizeof(m_header) + sizeof(m_info)) + SEEK_SET); + unsigned char * data_ptr = buf + row_data_bytes * (m_info.height - 1); + for (int i = 0; i < m_info.height; i++) + { + fread(data_ptr, row_data_bytes, 1, m_fp); + if (row_padding) + fseek(m_fp, row_padding, SEEK_CUR); + data_ptr -= row_data_bytes; + } + } +} + void BMP::close() { if (m_fp != NULL) diff --git a/cs677/pa3/BMP.h b/cs677/pa3/BMP.h index 842d0a6..fb93836 100644 --- a/cs677/pa3/BMP.h +++ b/cs677/pa3/BMP.h @@ -34,8 +34,9 @@ public: BMP(char * fileName); BMP(char * fileName, int width, int height, unsigned char * data); ~BMP(); - int getWidth(); - int getHeight(); + void read(unsigned char * buf); + int getWidth() { return m_info.width; } + int getHeight() { return m_info.height; } private: FILE * m_fp;