Changeset 6305


Ignore:
Timestamp:
05/13/10 12:29:13 (10 years ago)
Author:
curtis
Message:

If indexed is set and pixel type is uint8 or uint16, generate LUTs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/FakeReader.java

    r6262 r6305  
    2525 
    2626import java.io.IOException; 
     27import java.util.Random; 
    2728 
    2829import loci.common.DataTools; 
     
    5758  // -- Constants -- 
    5859 
     60  public static final int BOX_SIZE = 10; 
    5961  private static final String TOKEN_SEPARATOR = "&"; 
    60   private static final int BOX_SIZE = 10; 
     62  private static final long SEED = 0xcafebabe; 
     63   
     64  // -- Fields -- 
     65 
     66  /** 8-bit lookup table, if indexed color. */ 
     67  private byte[][] lut8 = null; 
     68 
     69  /** 16-bit lookup table, if indexed color. */ 
     70  private short[][] lut16 = null; 
     71 
     72  private int[] indexToValue = null, valueToIndex = null; 
    6173 
    6274  // -- Constructor -- 
     
    6779  // -- IFormatReader API methods -- 
    6880 
     81  /* @see IFormatReader#get8BitLookupTable() */ 
     82  @Override 
     83  public byte[][] get8BitLookupTable() throws FormatException, IOException { 
     84    return lut8; 
     85  } 
     86   
     87  /* @see IFormatReader#get16BitLookupTable() */ 
     88  @Override 
     89  public short[][] get16BitLookupTable() throws FormatException, IOException { 
     90    return lut16; 
     91  } 
     92   
    6993  /** 
    7094   * @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int) 
     
    81105    boolean signed = FormatTools.isSigned(pixelType); 
    82106    boolean little = isLittleEndian(); 
     107    boolean indexed = isIndexed(); 
    83108 
    84109    int[] zct = getZCTCoords(no); 
     
    113138          } 
    114139        } 
    115  
    116         // if applicable, convert value to raw IEEE floating point bits 
     140         
     141        // if indexed color with non-null LUT, convert value to index 
     142        if (indexed) { 
     143          if (lut8 != null) pixel = valueToIndex[(int) (pixel % 256)]; 
     144          if (lut16 != null) pixel = valueToIndex[(int) (pixel % 65536)]; 
     145        } 
     146 
     147        // if floating point, convert value to raw IEEE floating point bits 
    117148        switch (pixelType) { 
    118149          case FormatTools.FLOAT: 
     
    146177    int sizeC = 1; 
    147178    int sizeT = 1; 
    148     int thumbSizeX = 128; 
    149     int thumbSizeY = 128; 
     179    int thumbSizeX = 0; // default 
     180    int thumbSizeY = 0; // default 
    150181    int pixelType = FormatTools.UINT8; 
    151182    int rgb = 1; 
     
    161192    int seriesCount = 1; 
    162193 
     194    // parse tokens from filename 
    163195    for (String token : tokens) { 
    164196      if (name == null) { 
     
    202234    } 
    203235 
     236    // populate core metadata 
    204237    int effSizeC = sizeC / rgb; 
    205  
    206238    core = new CoreMetadata[seriesCount]; 
    207239    for (int s=0; s<seriesCount; s++) { 
     
    228260    } 
    229261 
     262    // populate OME metadata 
    230263    MetadataStore store = makeFilterMetadata(); 
    231264    MetadataTools.populatePixels(store, this); 
     
    235268      MetadataTools.setDefaultCreationDate(store, id, s); 
    236269    } 
     270     
     271    // for indexed color images, create lookup tables 
     272    if (indexed) { 
     273      if (pixelType == FormatTools.UINT8) { 
     274        // create 8-bit LUT 
     275        final int num = 256; 
     276        createIndexMap(num); 
     277        lut8 = new byte[rgb][num]; 
     278        // linear ramp 
     279        for (int c=0; c<rgb; c++) { 
     280          for (int index = 0; index < num; index++) { 
     281            lut8[c][index] = (byte) indexToValue[index]; 
     282          } 
     283        } 
     284      } 
     285      else if (pixelType == FormatTools.UINT16) { 
     286        // create 16-bit LUT 
     287        final int num = 65536; 
     288        createIndexMap(num); 
     289        lut16 = new short[rgb][num]; 
     290        // linear ramp 
     291        for (int c=0; c<rgb; c++) { 
     292          for (int index = 0; index < num; index++) { 
     293            lut16[c][index] = (short) indexToValue[index]; 
     294          } 
     295        } 
     296      } 
     297      // NB: Other pixel types will have null LUTs. 
     298    } 
     299  } 
     300   
     301  // -- Helper methods -- 
     302 
     303  /** Creates an index map from 0 */ 
     304  private void createIndexMap(int num) { 
     305    // create random mapping from indices to values 
     306    indexToValue = new int[num]; 
     307    for (int index = 0; index < num; index++) indexToValue[index] = index; 
     308    shuffle(indexToValue); 
     309     
     310    // create inverse mapping: values to indices 
     311    valueToIndex = new int[num]; 
     312    for (int index = 0; index < num; index++) { 
     313      int value = indexToValue[index]; 
     314      valueToIndex[value] = index; 
     315    } 
     316  } 
     317 
     318  /** Fisher-Yates shuffle with constant seed to ensure reproducibility. */ 
     319  private static void shuffle(int[] array) { 
     320    Random r = new Random(SEED); 
     321    for (int i = array.length; i > 1; i--) { 
     322      int j = r.nextInt(i); 
     323      int tmp = array[j]; 
     324      array[j] = array[i - 1]; 
     325      array[i - 1] = tmp; 
     326    } 
    237327  } 
    238328 
Note: See TracChangeset for help on using the changeset viewer.