44 typedef int8_t * int8_p;
45 typedef uint8_t *uint8_p;
46 typedef int16_t * int16_p;
47 typedef uint16_t *uint16_p;
48 typedef int32_t * int32_p;
49 typedef uint32_t *uint32_p;
50 typedef float * float_p;
51 typedef double *double_p;
61 const std::string& b) : std::runtime_error(a +
": " + b) { }
71 raw(std::string name,
size_t start,
size_t height,
size_t width,
size_t depth,
size_t size,
bool write) :
82 size_t length = start + height * width * depth * size;
84 int mode = write ? O_RDWR | O_TRUNC | O_CREAT : O_RDONLY;
85 int prot = write ? PROT_READ | PROT_WRITE : PROT_READ;
87 if ((file = open(name.c_str(), mode, 0666)) == -1)
90 if (write && ftruncate(file, length) == -1)
93 if ((buffer = mmap(0, length, prot, MAP_SHARED, file, 0)) == MAP_FAILED)
96 pixels = uint8_p(buffer) + start;
99 virtual void put(
int,
int,
int,
double) = 0;
100 virtual double get(int, int, int)
const = 0;
102 std::string get_name()
const {
return name; }
103 int get_height()
const {
return height; }
104 int get_width()
const {
return width; }
105 int get_depth()
const {
return depth; }
109 size_t length = start + height * width * depth * size;
111 if (munmap(buffer, length) == -1)
114 if (close(file) == -1)
120 const void *data(
int i,
int j,
int k)
const
122 return (
const uint8_t *) pixels + (((i * width) + j) * depth + k) * size;
124 void *data(
int i,
int j,
int k)
126 return (uint8_t *) pixels + (((i * width) + j) * depth + k) * size;
145 static inline double uclamp(
double d)
147 if (d > 1.0)
return 1;
148 else if (d < 0.0)
return 0;
152 static inline double clamp(
double d)
154 if (d > 1.0)
return 1;
155 else if (d < -1.0)
return -1;
163 static inline void swap(uint8_t *a, uint8_t *b)
171 static inline int16_t swap(int16_t n)
173 swap(uint8_p(&n) + 0, uint8_p(&n) + 1);
177 static inline uint16_t swap(uint16_t n)
179 swap(uint8_p(&n) + 0, uint8_p(&n) + 1);
183 static inline int32_t swap(int32_t n)
185 swap(uint8_p(&n) + 0, uint8_p(&n) + 3);
186 swap(uint8_p(&n) + 1, uint8_p(&n) + 2);
190 static inline uint32_t swap(uint32_t n)
192 swap(uint8_p(&n) + 0, uint8_p(&n) + 3);
193 swap(uint8_p(&n) + 1, uint8_p(&n) + 2);
197 static inline float swap(
float n)
199 swap(uint8_p(&n) + 0, uint8_p(&n) + 3);
200 swap(uint8_p(&n) + 1, uint8_p(&n) + 2);
204 static inline double swap(
double n)
206 swap(uint8_p(&n) + 0, uint8_p(&n) + 7);
207 swap(uint8_p(&n) + 1, uint8_p(&n) + 6);
208 swap(uint8_p(&n) + 2, uint8_p(&n) + 5);
209 swap(uint8_p(&n) + 3, uint8_p(&n) + 4);
220 rawc(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
221 :
raw(a, o, h, w, d,
sizeof (int8_t), m) { }
223 void put(
int i,
int j,
int k,
double d)
225 *int8_p(data(i, j, k)) = int8_t(clamp(d) * INT8_MAX);
227 double get(
int i,
int j,
int k)
const
229 return double(*int8_p(data(i, j, k))) / INT8_MAX;
238 rawb(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
239 :
raw(a, o, h, w, d,
sizeof (uint8_t), m) { }
241 void put(
int i,
int j,
int k,
double d)
243 *uint8_p(data(i, j, k)) = uint8_t(uclamp(d) * UINT8_MAX);
245 double get(
int i,
int j,
int k)
const
247 return double(*uint8_p(data(i, j, k))) / UINT8_MAX;
258 raws(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
259 :
raw(a, o, h, w, d,
sizeof (int16_t), m) { }
261 void put(
int i,
int j,
int k,
double d)
263 *int16_p(data(i, j, k)) = int16_t(clamp(d) * INT16_MAX);
265 double get(
int i,
int j,
int k)
const
267 return double(*int16_p(data(i, j, k))) / INT16_MAX;
276 rawS(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
277 :
raw(a, o, h, w, d,
sizeof (int16_t), m) { }
279 void put(
int i,
int j,
int k,
double d)
281 *int16_p(data(i, j, k)) = swap(int16_t(clamp(d) * INT16_MAX));
283 double get(
int i,
int j,
int k)
const
285 return double(swap(*int16_p(data(i, j, k)))) / INT16_MAX;
296 rawu(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
297 :
raw(a, o, h, w, d,
sizeof (uint16_t), m) { }
299 void put(
int i,
int j,
int k,
double d)
301 *uint16_p(data(i, j, k)) = uint16_t(uclamp(d) * UINT16_MAX);
303 double get(
int i,
int j,
int k)
const
305 return double(*uint16_p(data(i, j, k))) / UINT16_MAX;
314 rawU(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
315 :
raw(a, o, h, w, d,
sizeof (uint16_t), m) { }
317 void put(
int i,
int j,
int k,
double d)
319 *uint16_p(data(i, j, k)) = swap(uint16_t(uclamp(d) * UINT16_MAX));
321 double get(
int i,
int j,
int k)
const
323 return double(swap(*uint16_p(data(i, j, k)))) / UINT16_MAX;
334 rawi(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
335 :
raw(a, o, h, w, d,
sizeof (int32_t), m) { }
337 void put(
int i,
int j,
int k,
double d)
339 *int32_p(data(i, j, k)) = int32_t(clamp(d) * INT32_MAX);
341 double get(
int i,
int j,
int k)
const
343 return double(*int32_p(data(i, j, k))) / INT32_MAX;
352 rawI(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
353 :
raw(a, o, h, w, d,
sizeof (int32_t), m) { }
355 void put(
int i,
int j,
int k,
double d)
357 *int32_p(data(i, j, k)) = swap(int32_t(clamp(d) * INT32_MAX));
359 double get(
int i,
int j,
int k)
const
361 return double(swap(*int32_p(data(i, j, k)))) / INT32_MAX;
372 rawl(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
373 :
raw(a, o, h, w, d,
sizeof (uint32_t), m) { }
375 void put(
int i,
int j,
int k,
double d)
377 *uint32_p(data(i, j, k)) = uint32_t(uclamp(d) * UINT32_MAX);
379 double get(
int i,
int j,
int k)
const
381 return double(*uint32_p(data(i, j, k))) / UINT32_MAX;
390 rawL(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
391 :
raw(a, o, h, w, d,
sizeof (uint32_t), m) { }
393 void put(
int i,
int j,
int k,
double d)
395 *uint32_p(data(i, j, k)) = swap(uint32_t(uclamp(d) * UINT32_MAX));
397 double get(
int i,
int j,
int k)
const
399 return double(swap(*uint32_p(data(i, j, k)))) / UINT32_MAX;
410 rawf(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
411 :
raw(a, o, h, w, d,
sizeof (
float), m) { }
413 void put(
int i,
int j,
int k,
double d)
415 *float_p(data(i, j, k)) = float(d);
417 double get(
int i,
int j,
int k)
const
419 return double(*float_p(data(i, j, k)));
428 rawF(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
429 :
raw(a, o, h, w, d,
sizeof (
float), m) { }
431 void put(
int i,
int j,
int k,
double d)
433 *float_p(data(i, j, k)) = swap(
float(d));
435 double get(
int i,
int j,
int k)
const
437 return double(swap(*float_p(data(i, j, k))));
448 rawd(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
449 :
raw(a, o, h, w, d,
sizeof (
double), m) { }
451 void put(
int i,
int j,
int k,
double d)
453 *double_p(data(i, j, k)) = d;
455 double get(
int i,
int j,
int k)
const
457 return *double_p(data(i, j, k));
466 rawD(std::string a,
size_t o,
size_t h,
size_t w,
size_t d,
bool m)
467 :
raw(a, o, h, w, d,
sizeof (
double), m) { }
469 void put(
int i,
int j,
int k,
double d)
471 *double_p(data(i, j, k)) = swap(d);
473 double get(
int i,
int j,
int k)
const
475 return swap(*double_p(data(i, j, k)));
RAW image file.
Definition: raw.hpp:68
RAW image file I/O error.
Definition: raw.hpp:57
Signed 32-bit RAW adapter.
Definition: raw.hpp:331
Byte-swapped single precision floating point RAW adapter.
Definition: raw.hpp:463
Single precision floating point RAW adapter.
Definition: raw.hpp:445
Unigned 32-bit RAW adapter.
Definition: raw.hpp:369
Unsigned 16-bit RAW adapter.
Definition: raw.hpp:293
Byte-swapped unsigned 16-bit RAW adapter.
Definition: raw.hpp:311
Unsigned 8-bit RAW adapter.
Definition: raw.hpp:235
Signed 8-bit RAW adapter.
Definition: raw.hpp:217
Byte-swapped single precision floating point RAW adapter.
Definition: raw.hpp:425
Single precision floating point RAW adapter.
Definition: raw.hpp:407
Signed 16-bit RAW adapter.
Definition: raw.hpp:255
Byte-swapped signed 16-bit RAW adapter.
Definition: raw.hpp:273
Byte-swapped signed 32-bit RAW adapter.
Definition: raw.hpp:349
Byte-swapped unsigned 32-bit RAW adapter.
Definition: raw.hpp:387