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; } }