/******************************************************************

Copyright (C) 1996 by Brian Scearce

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
and/or distribute copies of the Software, and to permit persons to whom
the Software is furnished to do so, subject to the following conditions:

1. The above copyright notice and this permission notice shall be
   included in all copies or substantial portions of the Software.

2. Redistribution for profit requires the express, written permission of
   the author.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL BRIAN SCEARCE BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
******************************************************************/

/* Fixdark
        Routine to repair dark current artifacts in qcam output.
        Basic idea: the Qcam CCD suffers from "dark current";
        that is, some of the CCD pixels will leak current under
        long exposures, even if they're in the dark, and this
        shows up as ugly speckling on images taken in low light.

        Fortunately, the leaky pixels are the same from shot to
        shot.  So, we can figure out which pixels are leaky by
        taking some establishing shots in the dark, and try to
        fix those pixels on subsequent shots.  The dark
        establishing shots need only be done once per camera.
*/

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "qcam.h"
#define MAX_LOOPS 10
#define FNAME "qcam.darkfile"

static unsigned char master_darkmask1[MAX_HEIGHT][MAX_WIDTH];
static unsigned char master_darkmask2[MAX_HEIGHT / 2 + 1][MAX_WIDTH / 2 + 1];
static unsigned char master_darkmask4[MAX_HEIGHT / 4 + 1][MAX_WIDTH / 4 + 1];

/*
int
read_darkmask()
{
  int x, y;
  int min_bright;
  char darkfile[BUFSIZ], *p;
  FILE *fp;

  strcpy(darkfile, CONFIG_FILE);
  if ( (p = strrchr(darkfile, '/'))) {
    strcpy(p+1, FNAME);
  } else {
    strcpy(darkfile, FNAME);
  }

  if (!(fp = fopen(darkfile, "r"))) {
#ifdef DEBUG
    fprintf(stderr, "Can't open darkfile %s\n", darkfile);
#endif
    return 0;
  }

  if (fread(master_darkmask1, sizeof(unsigned char), MAX_WIDTH*MAX_HEIGHT, fp) !=
        MAX_WIDTH*MAX_HEIGHT) {
#ifdef DEBUG
    fprintf(stderr, "Error reading darkfile\n");
#endif
    return 0;
  }

  for (y = 0; y < MAX_HEIGHT; y += 2) {
    for (x = 0; x < MAX_WIDTH; x += 2) {
      min_bright = master_darkmask1[y][x];
      if (y < MAX_HEIGHT-1 && master_darkmask1[y+1][x] < min_bright)
        min_bright = master_darkmask1[y+1][x];
      if (x < MAX_WIDTH-1 && master_darkmask1[y][x+1] < min_bright)
        min_bright = master_darkmask1[y][x+1];
      if (y < MAX_HEIGHT-1 && x < MAX_WIDTH-1 && master_darkmask1[y+1][x+1] < min_bright)
        min_bright = master_darkmask1[y+1][x+1];
      master_darkmask2[y/2][x/2] = min_bright;
        assert(y/2 < MAX_HEIGHT/2+1);
        assert(x/2 < MAX_WIDTH/2+1);
    }
  }

  for (y = 0; y < MAX_HEIGHT/2; y += 2) {
    for (x = 0; x < MAX_WIDTH/2; x += 2) {
      min_bright = master_darkmask2[y][x];
      if (y < MAX_HEIGHT/2-1 && master_darkmask2[y+1][x] < min_bright)
        min_bright = master_darkmask2[y+1][x];
      if (x < MAX_WIDTH/2-1 && master_darkmask2[y][x+1] < min_bright)
        min_bright = master_darkmask2[y][x+1];
      if (y < MAX_HEIGHT/2-1 && x < MAX_WIDTH-1 && master_darkmask2[y+1][x+1] < min_bright)
        min_bright = master_darkmask2[y+1][x+1];
      master_darkmask4[y/2][x/2] = min_bright;
        assert(y/2 < MAX_HEIGHT/4+1);
        assert(x/2 < MAX_WIDTH/4+1);
    }
  }

  fclose(fp);
  return 1;
}
*/


/* fixdark
                We first record a list of bad leaky pixels, by making a
                number of exposures in the dark.  master_darkmask holds
                this information.  It's a map of the CCD.
                master_darkmask[y][x] == val means that the pixel is
                unreliable for brightnesses of "val" and above.

                We go over the image.  If a pixel is bad, look at the
                adjacent four pixels, average the ones that have good
                values, and use that instead.
*/

int
fixdark (const struct qcam *q, scanbuf * scan)
{
  static int init = 0;
  static int smallest_dm = 255;
  unsigned char darkmask[MAX_HEIGHT][MAX_WIDTH];
  unsigned char new_image[MAX_HEIGHT][MAX_WIDTH];
  int width, height;
  int max_width, max_height;
  int x, y;
  int ccd_x, ccd_y;
  int pixelcount, pixeltotal;
  int again, loopcount = 0;
  int val;
  int brightness = q->brightness;
  int scale = q->transfer_scale;

  if (!init) {
    if (!read_darkmask ())
      return 0;
    for (y = 0; y < MAX_HEIGHT; y++)
      for (x = 0; x < MAX_HEIGHT; x++)
        if (master_darkmask1[y][x] < smallest_dm) {
          smallest_dm = master_darkmask1[y][x];
#ifdef DEBUG
          fprintf (stderr, "Smallest mask is %d at (%d, %d)\n",
              smallest_dm, x, y);
#endif
        }
    init = 1;
  }

  if (brightness < smallest_dm) {
#ifdef DEBUG
    fprintf (stderr,
        "Brightness %d (dark current starts at %d), no fixup needed\n",
        brightness, smallest_dm);
#endif
    return 1;
  }

  width = q->width / scale;
  height = q->height / scale;

  max_height = MAX_HEIGHT / scale;
  max_width = MAX_WIDTH / scale;
  for (y = 0; y < max_height; y++)
    for (x = 0; x < max_width; x++)
      if (scale == 1) {
        darkmask[y][x] = master_darkmask1[y][x];
      } else if (scale == 2) {
        darkmask[y][x] = master_darkmask2[y][x];
      } else if (scale == 4) {
        darkmask[y][x] = master_darkmask4[y][x];
      } else {
#ifdef DEBUG
        fprintf (stderr, "Bad transfer_scale in darkmask assignment!\n");
#endif
        return 0;
      }

  do {
    again = 0;
    ccd_y = (q->top - 1) / scale;
    for (y = 0; y < height; y++, ccd_y++) {
      ccd_x = q->left - 1;
      ccd_x /= 2;
      ccd_x *= 2;
      ccd_x /= scale;
      for (x = 0; x < width; x++, ccd_x++) {
        val = scan[y * width + x];
        if (brightness < darkmask[ccd_y][ccd_x]) {      /* good pixel */
          new_image[y][x] = val;
        } else {                /* bad pixel */
          /* look at nearby pixels, average the good values */
          pixelcount = 0;
          pixeltotal = 0;
          if (x > 0) {          /* left */
            if (brightness < darkmask[ccd_y][ccd_x - 1]) {
              pixelcount++;
              pixeltotal += scan[y * width + x - 1];
            }
          }
          if (x < width - 1) {  /* right */
            if (brightness < darkmask[ccd_y][ccd_x + 1]) {
              pixelcount++;
              pixeltotal += scan[y * width + x + 1];
            }
          }
          if (y > 0) {          /* above */
            if (brightness < darkmask[ccd_y - 1][ccd_x]) {
              pixelcount++;
              pixeltotal += scan[(y - 1) * width + x];
            }
          }
          if (y < height - 1) { /* below */
            if (brightness < darkmask[ccd_y + 1][ccd_x]) {
              pixelcount++;
              pixeltotal += scan[(y + 1) * width + x];
            }
          }

          if (pixelcount == 0) {        /* no valid neighbors! */
            again = 1;
          } else {
            new_image[y][x] = pixeltotal / pixelcount;
            /* mark this pixel as valid, so we don't loop forever */
            darkmask[ccd_y][ccd_x] = 255;
          }
        }
      }
    }

    for (y = 0; y < height; y++)
      for (x = 0; x < width; x++)
        scan[y * width + x] = new_image[y][x];

  } while (loopcount++ < MAX_LOOPS && again);
#ifdef DEBUG
  fprintf (stderr, "Darkmask fix took %d loop%s\n",
      loopcount, (loopcount == 1) ? "" : "s");
#endif
  return 1;
}
