| /* |
| Copyright (C) 2006 Pedro Felzenszwalb |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| /* a simple image class */ |
| |
| #ifndef IMAGE_H |
| #define IMAGE_H |
| |
| #include <cstring> |
| |
| template <class T> |
| class image { |
| public: |
| /* create an image */ |
| image(const int width, const int height, const bool init = true); |
| |
| /* delete an image */ |
| ~image(); |
| |
| /* init an image */ |
| void init(const T &val); |
| |
| /* copy an image */ |
| image<T> *copy() const; |
| |
| /* get the width of an image. */ |
| int width() const { return w; } |
| |
| /* get the height of an image. */ |
| int height() const { return h; } |
| |
| /* image data. */ |
| T *data; |
| |
| /* row pointers. */ |
| T **access; |
| |
| private: |
| int w, h; |
| }; |
| |
| /* use imRef to access image data. */ |
| #define imRef(im, x, y) (im->access[y][x]) |
| |
| /* use imPtr to get pointer to image data. */ |
| #define imPtr(im, x, y) &(im->access[y][x]) |
| |
| template <class T> |
| image<T>::image(const int width, const int height, const bool init) { |
| w = width; |
| h = height; |
| data = new T[w * h]; // allocate space for image data |
| access = new T *[h]; // allocate space for row pointers |
| |
| // initialize row pointers |
| for (int i = 0; i < h; i++) access[i] = data + (i * w); |
| |
| if (init) memset(data, 0, w * h * sizeof(T)); |
| } |
| |
| template <class T> |
| image<T>::~image() { |
| delete[] data; |
| delete[] access; |
| } |
| |
| template <class T> |
| void image<T>::init(const T &val) { |
| T *ptr = imPtr(this, 0, 0); |
| T *end = imPtr(this, w - 1, h - 1); |
| while (ptr <= end) *ptr++ = val; |
| } |
| |
| template <class T> |
| image<T> *image<T>::copy() const { |
| image<T> *im = new image<T>(w, h, false); |
| memcpy(im->data, data, w * h * sizeof(T)); |
| return im; |
| } |
| |
| #endif |