001package org.dcm4che3.image; 002 003public class ShortLookupTable extends LookupTable { 004 005 private final short[] lut; 006 007 ShortLookupTable(StoredValue inBits, int outBits, int offset, short[] lut) { 008 super(inBits, outBits, offset); 009 this.lut = lut; 010 } 011 012 ShortLookupTable(StoredValue inBits, int outBits, int offset, int size, boolean flip) { 013 this(inBits, outBits, offset, new short[size]); 014 int maxOut = (1<<outBits)-1; 015 int maxIndex = size - 1; 016 int midIndex = size / 2; 017 if (flip) 018 for (int i = 0; i < size; i++) 019 lut[maxIndex-i] = (short) ((i * maxOut + midIndex) / maxIndex); 020 else 021 for (int i = 0; i < size; i++) 022 lut[i] = (short) ((i * maxOut + midIndex) / maxIndex); 023 } 024 025 @Override 026 public int length() { 027 return lut.length; 028 } 029 030 @Override 031 public void lookup(byte[] src, int srcPos, byte[] dest, int destPos, int length) { 032 for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;) 033 dest[j++] = (byte) lut[index(src[i++] & 0xff)]; 034 } 035 036 private int index(int pixel) { 037 int index = inBits.valueOf(pixel) - offset; 038 return Math.min(Math.max(0, index), lut.length-1); 039 } 040 041 @Override 042 public void lookup(short[] src, int srcPos, byte[] dest, int destPos, int length) { 043 for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;) 044 dest[j++] = (byte) lut[index(src[i++] & 0xffff)]; 045 } 046 047 @Override 048 public void lookup(byte[] src, int srcPos, short[] dest, int destPos, int length) { 049 for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;) 050 dest[j++] = lut[index(src[i++] & 0xff)]; 051 } 052 053 @Override 054 public void lookup(short[] src, int srcPos, short[] dest, int destPos, int length) { 055 for (int i = srcPos, endPos = srcPos + length, j = destPos; i < endPos;) 056 dest[j++] = lut[index(src[i++] & 0xffff)]; 057 } 058 059 @Override 060 public LookupTable adjustOutBits(int outBits) { 061 int diff = outBits - this.outBits; 062 if (diff != 0) { 063 short[] lut = this.lut; 064 if (diff < 0) { 065 diff = -diff; 066 for (int i = 0; i < lut.length; i++) 067 lut[i] = (short) ((lut[i] & 0xffff) >> diff); 068 } else 069 for (int i = 0; i < lut.length; i++) 070 lut[i] <<= diff; 071 this.outBits = outBits; 072 } 073 return this; 074 } 075 076 @Override 077 public void inverse() { 078 short[] lut = this.lut; 079 int maxOut = (1<<outBits)-1; 080 for (int i = 0; i < lut.length; i++) 081 lut[i] = (short) (maxOut - lut[i]); 082 } 083 084 @Override 085 public LookupTable combine(LookupTable other) { 086 short[] lut = this.lut; 087 other.lookup(lut, 0, lut, 0, lut.length); 088 this.outBits = other.outBits; 089 return this; 090 } 091}