package org.dcm4che3.image;
public class ByteLookupTable extends LookupTable {
private final byte[] lut;
ByteLookupTable(StoredValue inBits, int outBits, int offset, byte[] lut) {
super(inBits, outBits, offset);
this.lut = lut;
}
ByteLookupTable(StoredValue inBits, int outBits, int offset, int size, boolean flip) {
this(inBits, outBits, offset, new byte[size]);
int maxOut = (1<<outBits)-1;
int maxIndex = size - 1;
int midIndex = maxIndex / 2;
if (flip)
for (int i = 0; i < size; i++)
lut[maxIndex-i] = (byte) ((i * maxOut + midIndex) / maxIndex);
else
for (int i = 0; i < size; i++)
lut[i] = (byte) ((i * maxOut + midIndex) / maxIndex);
}
@Override
public int length() {
return lut.length;
}
@Override
public void lookup(byte[] src, int srcPos, byte[] dest, int destPos, int length) {
for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;)
dest[j++] = lut[index(src[i++])];
}
private int index(int pixel) {
int index = inBits.valueOf(pixel) - offset;
return Math.min(Math.max(0, index), lut.length-1);
}
@Override
public void lookup(short[] src, int srcPos, byte[] dest, int destPos, int length) {
for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;)
dest[j++] = lut[index(src[i++])];
}
@Override
public void lookup(byte[] src, int srcPos, short[] dest, int destPos, int length) {
for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;)
dest[j++] = (short) (lut[index(src[i++])] & 0xff);
}
@Override
public void lookup(short[] src, int srcPos, short[] dest, int destPos, int length) {
for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;)
dest[j++] = (short) (lut[index(src[i++])] & 0xff);
}
@Override
public LookupTable adjustOutBits(int outBits) {
int diff = outBits - this.outBits;
if (diff != 0) {
byte[] lut = this.lut;
if (outBits > 8) {
short[] ss = new short[lut.length];
for (int i = 0; i < lut.length; i++)
ss[i] = (short) ((lut[i] & 0xff) << diff);
return new ShortLookupTable(inBits, outBits, offset, ss);
}
if (diff < 0) {
diff = -diff;
for (int i = 0; i < lut.length; i++)
lut[i] = (byte) ((lut[i] & 0xff) >> diff);
} else
for (int i = 0; i < lut.length; i++)
lut[i] <<= diff;
this.outBits = outBits;
}
return this;
}
@Override
public void inverse() {
byte[] lut = this.lut;
int maxOut = (1<<outBits)-1;
for (int i = 0; i < lut.length; i++)
lut[i] = (byte) (maxOut - lut[i]);
}
@Override
public LookupTable combine(LookupTable other) {
byte[] lut = this.lut;
if (other.outBits > 8) {
short[] ss = new short[lut.length];
other.lookup(lut, 0, ss, 0, lut.length);
return new ShortLookupTable(inBits, other.outBits, offset, ss);
}
other.lookup(lut, 0, lut, 0, lut.length);
this.outBits = other.outBits;
return this;
}
}