view src/samer/tools/ColorRamp.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
line wrap: on
line source
/*
 *	Copyright (c) 2000, Samer Abdallah, King's College London.
 *	All rights reserved.
 *
 *	This software is provided AS iS and WITHOUT ANY WARRANTY; 
 *	without even the implied warranty of MERCHANTABILITY or 
 *	FITNESS FOR A PARTICULAR PURPOSE.
 */

package samer.tools;
import java.awt.Color;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;

/**
	Objects of these class could be used directly,
	but main purpose is to help construct an IndexColorModel
	for an image
 */

public class ColorRamp implements java.io.Serializable
{
	private byte	r[], g[], b[], a[];
	private int	size;
	private	int	lasti;
	private Color	lastc;


	public ColorRamp(int sz) 
	{ 
		size=sz;
		r=new byte[size]; 
		g=new byte[size]; 
		b=new byte[size]; 
		a=new byte[size]; 
	}

	public Color getColor(int i) { 
		int ir = ((int)r[i] & 0xff);
		int ig = ((int)g[i] & 0xff);
		int ib = ((int)b[i] & 0xff);
		return new Color(ir,ig,ib); 
	}

	public Color[] getColorArray() {
		Color[]	clut=new Color[size];
		for (int i=0; i<size; i++) clut[i]=getColor(i);
		return clut;
	}
	
	public int   getSize() { return size; }
	public IndexColorModel getColorModel() { 
		return new IndexColorModel(8,size,r,g,b); 
	}

	public void set( int i, Color c) { set(i,c,1); }
	public void set( int i, Color c, double alpha)
	{ 
		r[i]=(byte)c.getRed();
		g[i]=(byte)c.getGreen();
		b[i]=(byte)c.getBlue();
		a[i]=clip(256.0*alpha);
		lasti=i; lastc=c;
	}

	public void gradientTo( int i, Color c) { 
		gradient(lasti,lastc,1.0,i,c,1.0);
	}

	public void gradient( Color c1, Color c2) { 
		gradient(0,c1,1.0,size-1,c2,1.0);
	}

	public void gradient( Color c1, double a1, Color c2, double a2) { 
		gradient(0,c1,a1,size-1,c2,a2); 
	}

	public void gradient( int i1, Color c1, int i2, Color c2) { 
		gradient(i1,c1,1,i2,c2,1); 
	}

	public void gradient( int i1, Color c1, double a1, int i2, Color c2, double a2)
	{
		double	_a, _r, _g, _b;
		double	da, dr, dg, db;
		double	di;
		int		i;

		di = i2-i1-1;

		_a = 256*a1; 			da = (256*a2-_a)/di;    
		_r = c1.getRed(); 		dr = (c2.getRed()-_r)/di;    
		_g = c1.getGreen(); 	dg = (c2.getGreen()-_g)/di;
		_b = c1.getBlue(); 		db = (c2.getBlue()-_b)/di;  

		for (i=i1; i<=i2; i++) {
			a[i] = clip(_a);
			r[i] = clip(_r);
			g[i] = clip(_g);
			b[i] = clip(_b);
			_a+=da; _r+=dr; _g+=dg; _b+=db;
		}

		lasti=i2; lastc=c2;
	}

	private static byte clip(double t)
	{
		if (t<0) return 0;
		else if (t>=256.0) return (byte)255;
		else return (byte)t;
	}
}