/** @file  pmMaskBadPixels.h
 *
 *  @brief Given an input image, a bad pixel mask, a corresponding value in the bad pixel mask to mask, a
 *  saturation level, and a growing radius, mask in the input image those pixels in the bad pixel mask that
 *  match the value to mask.
 *
 *  Given an input image, in, a bad pixel mask, a corresponding value in the bad pixel mask to mask in the
 *  input image, maskVal, a saturation level, and a growing radius, pmMaskBadPixels shall mask in the input
 *  image those pixels in the bad pixel mask that match the value to mask. Note that the input image, in, is
 *  modified in-place. All pixels in the mask which satisfy the maskVal shall have their corresponding pixels
 *  masked in the input image, in. All pixels which satisfy the growVal shall have their corresponding
 *  pixels, along with all pixels within the grow radius masked. Pixels which have flux greater than sat shall
 *  also be masked, but not grown. Note that the input image, in, and the mask need not be the same size,
 *  since the input image may already have been trimmed (following overscan subtraction), but the function
 *  shall use the offsets in the image (in->x0 and in->y0) to determine the appropriate offsets to obtain the
 *  correct pixel on the mask. In the event that the mask image is too small (i.e., pixels on the input image
 *  refer to pixels outside the range of the mask image), the function shall generate an error.
 *
 *  @author Ross Harman, MHPCC
 *
 *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
 *  @date $Date: 2005-11-15 20:09:03 $
 *
 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
 */

#include "pslib.h"
#include "pmAstrometry.h"

/** Mask values */
typedef enum {
    PM_MASK_TRAP    = 0x0001,   ///< The pixel is a charge trap.
    PM_MASK_BADCOL  = 0x0002,   ///< The pixel is a bad column.
    PM_MASK_SAT     = 0x0004,   ///< The pixel is saturated.
    PM_MASK_FLAT    = 0x0008    ///< The pixel is non-positive in the flat-field.
} pmMaskValue;

// XXX: Use PS_MIN, PS_MAX
/** Macro to find maximum of two numbers */
#define MAX(A,B)((A)>=(B)?(A):(B))

/** Macro to find minimum of two numbers */
#define MIN(A,B)((A)<=(B)?(A):(B))


/** Execute bad pixels module.
 *
 *  Given an input image, a bad pixel mask, a corresponding value in the bad pixel mask to mask, a
 *  saturation level, and a growing radius, mask in the input image those pixels in the bad pixel mask that
 *  match the value to mask.
 *
 *  @return  bool: True or false for success or failure
 */
bool pmMaskBadPixels(
    pmReadout *in,          ///< Readout containing input image data.
    const pmReadout *mask,   ///< Mask data to be added to readout mask data.
    unsigned int maskVal,   ///< Mask value to determine what to add to input mask.
    float sat,              ///< Saturation limit to mask bad pixels.
    unsigned int growVal,   ///< Mask data to determine if a circurlar area should be masked.
    int grow                ///< Radius of mask to apply around pixel.
);

