/***************************************************************************
* GFitsImageByte.i - FITS Byte image class *
* ----------------------------------------------------------------------- *
* copyright (C) 2010-2021 by Juergen Knoedlseder *
* ----------------------------------------------------------------------- *
* *
* 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 3 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, see . *
* *
***************************************************************************/
/**
* @file GFitsImageByte.i
* @brief FITS Byte image class definition
* @author Juergen Knoedlseder
*/
%{
/* Put headers and other declarations here that are needed for compilation */
#include "GFitsImageByte.hpp"
%}
/* __ Typemaps ___________________________________________________________ */
%typemap(in) const unsigned char* pixels {
if (!PyList_Check($input)) {
SWIG_exception(SWIG_ValueError, "List expected");
}
Py_ssize_t num = PyList_Size($input);
if (num > 0) {
$1 = (unsigned char*)malloc(num*sizeof(unsigned char));
for (int i = 0; i < num; ++i) {
PyObject *s = PyList_GetItem($input,i);
if (!PyInt_Check(s)) {
free($1);
SWIG_exception(SWIG_ValueError, "List items must be integers");
}
$1[i] = (unsigned char)PyInt_AsLong(s);
}
}
}
%typemap(typecheck, precedence=SWIG_TYPECHECK_INTEGER) const unsigned char* pixels {
$1 = PyList_Check($input) ? 1 : 0;
}
%typemap(freearg) const unsigned char* pixels {
if ($1) {
free($1);
}
}
/***********************************************************************//**
* @class GFitsImageByte
*
* @brief FITS Byte image class
***************************************************************************/
class GFitsImageByte : public GFitsImage {
public:
// Constructors and destructors
GFitsImageByte(void);
GFitsImageByte(const int& nx, const unsigned char* pixels = NULL);
GFitsImageByte(const int& nx, const int& ny, const unsigned char* pixels = NULL);
GFitsImageByte(const int& nx, const int& ny, const int& nz, const unsigned char* pixels = NULL);
GFitsImageByte(const int& nx, const int& ny, const int& nz, const int& nt, const unsigned char* pixels = NULL);
GFitsImageByte(const std::vector& naxes, const unsigned char* pixels = NULL);
GFitsImageByte(const GFitsImage& image);
GFitsImageByte(const GFitsImageByte& image);
virtual ~GFitsImageByte(void);
// Methods
void clear(void);
GFitsImageByte* clone(void) const;
std::string classname(void) const;
double pixel(const int& ix) const;
double pixel(const int& ix, const int& iy) const;
double pixel(const int& ix, const int& iy, const int& iz) const;
double pixel(const int& ix, const int& iy, const int& iz, const int& it) const;
int type(void) const;
};
/***********************************************************************//**
* @brief GFitsImageByte class extension
***************************************************************************/
%extend GFitsImageByte {
unsigned char __getitem__(int GTuple1D4D[]) {
// Check image dimensions
for (int i = 0; i < GTuple1D4D[0]; ++i) {
if (GTuple1D4D[i+1] < 0 || GTuple1D4D[i+1] >= self->naxes(i)) {
throw GException::out_of_range("__getitem__(int)",
"FITS image axis "+
gammalib::str(i)+" index",
GTuple1D4D[i+1],
self->naxes(i));
}
}
// Return pixel value
if (GTuple1D4D[0] == 1) {
return (*self)(GTuple1D4D[1]);
}
else if (GTuple1D4D[0] == 2) {
return (*self)(GTuple1D4D[1], GTuple1D4D[2]);
}
else if (GTuple1D4D[0] == 3) {
return (*self)(GTuple1D4D[1], GTuple1D4D[2], GTuple1D4D[3]);
}
else if (GTuple1D4D[0] == 4) {
return (*self)(GTuple1D4D[1], GTuple1D4D[2], GTuple1D4D[3],
GTuple1D4D[4]);
}
else {
std::string msg = "Image dimension "+gammalib::str(GTuple1D4D[0])+
" must be within [1,4].";
throw GException::invalid_argument("__getitem__(int)", msg);
}
}
void __setitem__(int GTuple1D4D[], unsigned char value) {
if (GTuple1D4D[0] == 1) {
self->at(GTuple1D4D[1]) = value;
}
else if (GTuple1D4D[0] == 2) {
self->at(GTuple1D4D[1], GTuple1D4D[2]) = value;
}
else if (GTuple1D4D[0] == 3) {
self->at(GTuple1D4D[1], GTuple1D4D[2], GTuple1D4D[3]) = value;
}
else if (GTuple1D4D[0] == 4) {
self->at(GTuple1D4D[1], GTuple1D4D[2], GTuple1D4D[3],
GTuple1D4D[4]) = value;
}
else {
std::string msg = "Image dimension "+gammalib::str(GTuple1D4D[0])+
" must be within [1,4].";
throw GException::invalid_argument("__setitem__(int)", msg);
}
}
PyObject* pixels(void) {
PyObject *list = PyList_New(self->npix());
for (int i = 0; i < self->npix(); ++i) {
PyList_SetItem(list, i, PyInt_FromLong((long)(static_cast(self->pixels())[i])));
}
return list;
}
GFitsImageByte copy() {
return (*self);
}
%pythoncode {
def __getstate__(self):
state = (gammalib.GFitsHDU.__getstate__(self),
[self.naxes(axis) for axis in range(self.naxis())],
self.pixels())
return state
def __setstate__(self, state):
self.__init__(state[1], state[2])
gammalib.GFitsHDU.__setstate__(self, state[0])
}
};