//
// EnhancementTable.java
//
/*
This source file is part of the edu.wisc.ssec.mcidas package and is
Copyright (C) 1998 - 2017 by Tom Whittaker, Tommy Jasmin, Tom Rink,
Don Murray, James Kelly, Bill Hibbard, Dave Glowacki, Curtis Rueden
and others.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/
package edu.wisc.ssec.mcidas;
import java.awt.Color;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.File;
import java.net.URL;
/**
* Class for reading a McIDAS enhancement table (.ET file). The default
* constructor creates a grey scale enhancement.
*/
public class EnhancementTable
{
private int[][] rgbValues = null;
private DataInputStream dataStream;
/**
* Construct an enhancement table with a grey scale enhancement.
*/
public EnhancementTable()
{
rgbValues = new int[3][256];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 256; j++)
{
rgbValues[i][j] = j;
}
}
}
/**
* Construct an enhancement table from a local disk file or
* URL.
*
* @param source source of the enhancement table (path or URL)
*
* @exception McIDASException error finding or reading the source.
*/
public EnhancementTable(String source)
throws McIDASException
{
try
{
dataStream =
new DataInputStream(
new BufferedInputStream(
new FileInputStream(source)));
}
catch (Exception e)
{
try
{
dataStream =
new DataInputStream(
new BufferedInputStream(
new URL(source).openStream()));
}
catch (Exception e2)
{
throw new McIDASException(
"Unable to open enhancement table " + source, e2);
}
}
readRGBValues();
}
/**
* Construct an enhancement table from a file object.
*
* @param file file object representing the enhancement table.
*
* @exception McIDASException error finding or reading the file.
*/
public EnhancementTable(File file)
throws McIDASException
{
try
{
dataStream =
new DataInputStream(
new BufferedInputStream(
new FileInputStream(file)));
}
catch (Exception e)
{
throw new McIDASException(
"Unable to open enhancement table " + file, e);
}
readRGBValues();
}
/**
* Construct an enhancement table from a remote URL object.
*
* @param url URL representing the enhancement table.
*
* @exception McIDASException error finding or reading the URL.
*/
public EnhancementTable(URL url)
throws McIDASException
{
try
{
dataStream =
new DataInputStream(
new BufferedInputStream(url.openStream()));
}
catch (Exception e)
{
throw new McIDASException(
"Unable to open enhancement table at URL" + url, e);
}
readRGBValues();
}
/**
* read in the values
*/
private void readRGBValues()
throws McIDASException
{
rgbValues = new int[3][256];
try
{
int reservedWord = dataStream.readInt();
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 256; j++)
rgbValues[i][j] = dataStream.readInt();
}
}
catch (Exception e)
{
throw new McIDASException("Invalid enhancement table", e);
}
}
/**
* Retrieve the data values.
*
* @return integer array [3][256] of red, green, blue values or null if
* the table was not initialized correctly. Values
* range from 0-255.
*/
public int[][] getRGBValues()
{
return rgbValues;
}
/**
* Look up a unique (hopefully) RGB value and return the index
*
* @return index value (0-255) or -1 if not found
*
*/
public int getIndex(int red, int green, int blue) {
int inx;
for (inx=0; inx<256; inx++) {
if (rgbValues[0][inx] == red &&
rgbValues[1][inx] == green &&
rgbValues[2][inx] == blue) {
return inx;
}
}
return -1;
}
/**
* Print out a pretty table. Currently lists all values, but will
* eventually print a format like EU TABLE.
*
* @return table of levels, red, green and blue values
*/
public String toString()
{
StringBuffer sb = new StringBuffer();
sb.append(" Brightness Red Green Blue ");
sb.append("\n");
sb.append(" min max min max min max min max");
sb.append("\n");
sb.append(" --- --- --- --- --- --- --- ---");
sb.append("\n");
for (int i = 0; i < 256; i++)
{
sb.append(" " + i + " " +
rgbValues[0][i] + " " +
rgbValues[1][i] + " " +
rgbValues[2][i]);
sb.append("\n");
}
return sb.toString();
}
/**
* Test by running:
* <UL>
* <LI>java edu.wisc.ssec.mcidas.EnhancementTable _OR_
* <LI>java edu.wisc.ssec.mcidas.EnhancementTable <i>enhancement_file</i>.
* </UL>
*/
public static void main(String[] args)
{
try
{
EnhancementTable et =
args.length == 0
? new EnhancementTable()
: new EnhancementTable(args[0]);
System.out.println(et.toString());
}
catch (McIDASException e)
{
System.out.println(e.toString());
}
}
}