/* ----------------------------------------------------------------------------- 
 * color.c
 *
 *     Colormaps
 * 
 * Author(s) : David Beazley (beazley@cs.uchicago.edu)
 * Copyright (C) 1995-1996
 *
 * See the file LICENSE for information on usage and redistribution.	
 * ----------------------------------------------------------------------------- */

#define COLORMAP
#include "gifplot.h"
#include <string.h>

/* ------------------------------------------------------------------------
   ColorMap *new_ColorMap(char *filename)

   Read a colormap from a file.
   ------------------------------------------------------------------------ */

ColorMap *new_ColorMap(char *filename) {
  ColorMap *c;
  FILE *cm;
  void ColorMap_default(ColorMap *);
  
  if (!filename) {
    c = (ColorMap *) malloc(sizeof(ColorMap));
    c->cmap = (unsigned char *) malloc(768*sizeof(char));
    c->name = 0;
    ColorMap_default(c);
    return c;
  }
  if (strlen(filename) == 0) {
    c = (ColorMap *) malloc(sizeof(ColorMap));
    c->cmap = (unsigned char *) malloc(768*sizeof(char));
    ColorMap_default(c);
    return c;
  }
  if ((cm = fopen(filename,"rb")) == NULL) {
    return (ColorMap *) 0;
  }
  c = (ColorMap *) malloc(sizeof(ColorMap));
  c->cmap = (unsigned char *) malloc(768*sizeof(char));
  if (fread(c->cmap, 768, 1, cm) != 1) {
    free((char *)c->cmap);
    free((char *)c);
    fclose(cm);
    return (ColorMap *) 0;
  }
  fclose(cm);
  c->name = (char *) malloc(strlen(filename)+1);
  strcpy(c->name, filename);
  ColorMap_default(c);
  return c;
}

/* --------------------------------------------------------------------------
   delete_ColorMap(ColorMap *cm)

   Destroy a ColorMap
   -------------------------------------------------------------------------- */

void delete_ColorMap(ColorMap *cm) {
  if (cm) {
    free((char *)cm->cmap);
    if (cm->name)
      free((char *)cm->name);
    free((char *)cm);
  }
}

/* --------------------------------------------------------------------------
   ColorMap_default(ColorMap *cm)

   This function fills in default values for the first 8 entries of the
   colormap.  These are *fixed* values---used internally.
   -------------------------------------------------------------------------- */

void ColorMap_default(ColorMap *cm) {
  unsigned char *r,*g,*b;
  if (cm) {
    r = cm->cmap;
    g = cm->cmap+256;
    b = cm->cmap+512;

    r[0] = 0;   g[0] = 0;   b[0] = 0;      /* BLACK */
    r[1] = 255; g[1] = 255; b[1] = 255;    /* WHITE */
    r[2] = 255; g[2] = 0;   b[2] = 0;      /* RED   */
    r[3] = 0;   g[3] = 255; b[3] = 0;      /* GREEN */
    r[4] = 0;   g[4] = 0;   b[4] = 255;    /* BLUE  */
    r[5] = 255; g[5] = 255; b[5] = 0;      /* YELLOW */
    r[6] = 0;   g[6] = 255; b[6] = 255;    /* CYAN   */
    r[7] = 255; g[7] = 0;   b[7] = 255;    /* MAGENTA */
  }
}

void ColorMap_assign(ColorMap *cm, int index, int r, int g, int b) {
  unsigned char *rb,*gb,*bb;

  rb = cm->cmap;
  gb = cm->cmap+256;
  bb = cm->cmap+512;

  rb[index] = r;
  gb[index] = g;
  bb[index] = b;
}

int ColorMap_getitem(ColorMap *cm, int index) {
  if ((index < 0) && (index >= 768)) return -1;
  return cm->cmap[index];
}

void ColorMap_setitem(ColorMap *cm, int index, int value) {
  if ((index < 0) && (index >= 768)) return;
  cm->cmap[index]=value;
}  

/* --------------------------------------------------------------------
   ColorMap_write(ColorMap *cm, char *filename)

   Write out a colormap to disk.
   -------------------------------------------------------------------- */

int ColorMap_write(ColorMap *cm, char *filename) {

  FILE *f;
  if (!cm) return -1;
  if (!filename) return -1;
  if (strlen(filename) == 0) return -1;

  f = fopen(filename,"w");
  
  if (fwrite(cm->cmap,768,1,f) != 1) {
    fclose(f);
    return -1;
  }
  fclose(f);
  return 0;
}

#undef COLORMAP
