00001
00002
00003
00004
00005 #ifndef MERCATOR_BUFFER_H
00006 #define MERCATOR_BUFFER_H
00007
00008 #include <cassert>
00009
00010 namespace Mercator {
00011
00012 class Segment;
00013
00014 template<typename DataType>
00015 class Buffer {
00016 public:
00017 const Segment & m_segment;
00018 private:
00019 const unsigned int m_channels;
00020 const unsigned int m_size;
00021 DataType * m_data;
00022
00023 public:
00024 explicit Buffer(const Segment & segment, unsigned int channels = 4);
00025 virtual ~Buffer();
00026
00027 DataType & operator()(unsigned int x,unsigned int y,unsigned int channel) {
00028 assert(m_data != 0);
00029 return m_data[(y * m_size + x) * m_channels + channel];
00030 }
00031
00032 const DataType & operator()(unsigned int x,
00033 unsigned int y,
00034 unsigned int channel) const {
00035 assert(m_data != 0);
00036 return m_data[(y * m_size + x) * m_channels + channel];
00037 }
00038
00039 const Segment & getSegment() const {
00040 return m_segment;
00041 }
00042
00043 unsigned int getSize() const {
00044 return m_size;
00045 }
00046
00047 unsigned int getChannels() const {
00048 return m_channels;
00049 }
00050
00051 DataType * getData() {
00052 return m_data;
00053 }
00054
00055 void allocate() {
00056 assert(m_data == 0);
00057 m_data = new DataType[m_size * m_size * m_channels];
00058 }
00059
00060 bool isValid() const {
00061 return (m_data != 0);
00062 }
00063
00064 void invalidate() {
00065 delete [] m_data;
00066 m_data = 0;
00067 }
00068
00069 };
00070
00071 }
00072
00073 #endif // MERCATOR_BUFFER_H