Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #pragma once
00022
00023 #include <cstring>
00024
00025 namespace distance_transform
00026 {
00027
00028 template <class T>
00029 class image {
00030 public:
00031
00032 image(const int width, const int height, const bool init = true);
00033
00034
00035 ~image();
00036
00037
00038 void init(const T &val);
00039
00040
00041 image<T> *copy() const;
00042
00043
00044 int width() const { return w; }
00045
00046
00047 int height() const { return h; }
00048
00049
00050 T *data;
00051
00052
00053 T **access;
00054
00055 private:
00056 int w, h;
00057 };
00058
00059
00060 #define imRef(im, x, y) (im->access[y][x])
00061
00062
00063 #define imPtr(im, x, y) &(im->access[y][x])
00064
00065 template <class T>
00066 image<T>::image(const int width, const int height, const bool init) {
00067 w = width;
00068 h = height;
00069 data = new T[w * h];
00070 access = new T*[h];
00071
00072
00073 for (int i = 0; i < h; i++)
00074 access[i] = data + (i * w);
00075
00076 if (init)
00077 memset(data, 0, w * h * sizeof(T));
00078 }
00079
00080 template <class T>
00081 image<T>::~image() {
00082 delete [] data;
00083 delete [] access;
00084 }
00085
00086 template <class T>
00087 void image<T>::init(const T &val) {
00088 T *ptr = imPtr(this, 0, 0);
00089 T *end = imPtr(this, w-1, h-1);
00090 while (ptr <= end)
00091 *ptr++ = val;
00092 }
00093
00094 template <class T>
00095 image<T> *image<T>::copy() const {
00096 image<T> *im = new image<T>(w, h, false);
00097 memcpy(im->data, data, w * h * sizeof(T));
00098 return im;
00099 }
00100
00101 }