00001 // This file may be redistributed and modified only under the terms of 00002 // the GNU General Public License (See COPYING for details). 00003 // Copyright (C) 2003 Alistair Riddoch 00004 00005 #ifndef MERCATOR_BUFFER_H 00006 #define MERCATOR_BUFFER_H 00007 00008 #include <cassert> 00009 00010 namespace Mercator { 00011 00012 class Segment; 00013 00015 template<typename DataType> 00016 class Buffer { 00017 public: 00019 const Segment & m_segment; 00020 private: 00022 const unsigned int m_channels; 00024 const unsigned int m_size; 00026 DataType * m_data; 00027 00028 public: 00033 explicit Buffer(const Segment & segment, unsigned int channels = 4); 00034 virtual ~Buffer(); 00035 00041 DataType & operator()(unsigned int x,unsigned int y,unsigned int channel) { 00042 assert(m_data != 0); 00043 return m_data[(y * m_size + x) * m_channels + channel]; 00044 } 00045 00051 const DataType & operator()(unsigned int x, 00052 unsigned int y, 00053 unsigned int channel) const { 00054 assert(m_data != 0); 00055 return m_data[(y * m_size + x) * m_channels + channel]; 00056 } 00057 00059 const Segment & getSegment() const { 00060 return m_segment; 00061 } 00062 00064 unsigned int getSize() const { 00065 return m_size; 00066 } 00067 00069 unsigned int getChannels() const { 00070 return m_channels; 00071 } 00072 00074 DataType * getData() { 00075 return m_data; 00076 } 00077 00082 void allocate() { 00083 assert(m_data == 0); 00084 m_data = new DataType[m_size * m_size * m_channels]; 00085 } 00086 00090 bool isValid() const { 00091 return (m_data != 0); 00092 } 00093 00097 void invalidate() { 00098 delete [] m_data; 00099 m_data = 0; 00100 } 00101 00102 }; 00103 00104 } // namespace Mercator 00105 00106 #endif // MERCATOR_BUFFER_H