package lcm.util; import java.awt.*; /** Converts scalar values to RGB colors by interpolating from a user-provided look-up table. **/ public class ColorMapper { /** Minimum/maximum value for mapped range (will be drawn opaquely). **/ double minval; double maxval; int[] colors; /** If these bounds are exceeded, use transparent color **/ double opaqueMax = Double.MAX_VALUE, opaqueMin=-Double.MAX_VALUE; public ColorMapper(int[] colors, double minval, double maxval) { this.colors=colors; this.minval=minval; this.maxval=maxval; } public void setMinMax(double minval, double maxval) { this.minval = minval; this.maxval = maxval; } public void setOpaqueMax(double opaqueMax) { this.opaqueMax = opaqueMax; } public void setOpaqueMin(double opaqueMin) { this.opaqueMin = opaqueMin; } public boolean isVisible(double v) { if (v > opaqueMax || v < opaqueMin) return false; return true; } public int map(double v) { if (!isVisible(v)) return 0x00000000; // transparent double normval = (colors.length)*(v-minval)/(maxval-minval); int a = (int) Math.floor(normval); if (a<0) a=0; if (a>=colors.length) a=colors.length-1; int b = a + 1; if (b>=colors.length) b=colors.length-1; double frac = normval - a; if (frac<0) frac=0; if (frac>1) frac=1; int c=0; for (int i=0;i<4;i++) { int r =i*8; int comp = (int) (((colors[a]>>r)&0xff)*(1-frac) + ((colors[b]>>r)&0xff)*frac); comp = comp & 0xff; c |= (comp<<r); } // force opacity return c | 0xff000000; } }