Changeset 6418


Ignore:
Timestamp:
05/28/10 15:20:28 (9 years ago)
Author:
curtis
Message:

Fix problems with ChannelFiller when lookup table color component count != 3.

File:
1 edited

Legend:

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

    r6155 r6418  
    2929 
    3030/** 
    31  * Expands indexed color images to RGB. 
     31 * For indexed color data representing true color, factors out 
     32 * the indices, replacing them with the color table values directly. 
     33 *  
     34 * For all other data (either non-indexed, or indexed with 
     35 * "false color" tables), does nothing. 
    3236 * 
    3337 * <dl><dt><b>Source code:</b></dt> 
     
    3640 */ 
    3741public class ChannelFiller extends ReaderWrapper { 
    38  
     42   
    3943  // -- Utility methods -- 
    4044 
     
    5559  // -- IFormatReader API methods -- 
    5660 
     61  @Override 
     62  public int getSizeC() { 
     63    if (passthrough()) return reader.getSizeC(); 
     64    return reader.getSizeC() * getLookupTableComponentCount(); 
     65  } 
     66 
     67  /* @see IFormatReader#isRGB() */ 
     68  @Override 
     69  public boolean isRGB() { 
     70    if (passthrough()) return reader.isRGB(); 
     71    return false; 
     72  } 
     73 
    5774  /* @see IFormatReader#isIndexed() */ 
     75  @Override 
    5876  public boolean isIndexed() { 
     77    if (passthrough()) return reader.isIndexed(); 
    5978    return false; 
    6079  } 
    6180 
    62   /* @see IFormatReader#getSizeC() */ 
    63   public int getSizeC() { 
    64     return reader.getSizeC() * 
    65       ((reader.isIndexed() && !reader.isFalseColor()) ? 3 : 1); 
    66   } 
    67  
    6881  /* @see IFormatReader#getRGBChannelCount() */ 
     82  @Override 
    6983  public int getRGBChannelCount() { 
    70     return (reader.isIndexed() && !reader.isFalseColor()) ? 3 : 
    71       reader.getRGBChannelCount(); 
    72   } 
    73  
    74   /* @see IFormatReader#isRGB() */ 
    75   public boolean isRGB() { 
    76     return (reader.isIndexed() && !reader.isFalseColor()) || reader.isRGB(); 
     84    if (passthrough()) return reader.getRGBChannelCount(); 
     85    return reader.getRGBChannelCount() * getLookupTableComponentCount(); 
    7786  } 
    7887 
    7988  /* @see IFormatReader#get8BitLookupTable() */ 
    80   public byte[][] get8BitLookupTable() { 
    81     try { 
    82       return reader.isFalseColor() ? reader.get8BitLookupTable() : null; 
    83     } 
    84     catch (FormatException e) { } 
    85     catch (IOException e) { } 
     89  @Override 
     90  public byte[][] get8BitLookupTable() throws FormatException, IOException { 
     91    if (passthrough()) return reader.get8BitLookupTable(); 
    8692    return null; 
    8793  } 
    8894 
    8995  /* @see IFormatReader#get16BitLookupTable() */ 
    90   public short[][] get16BitLookupTable() { 
    91     try { 
    92       return reader.isFalseColor() ? reader.get16BitLookupTable() : null; 
    93     } 
    94     catch (FormatException e) { } 
    95     catch (IOException e) { } 
     96  @Override 
     97  public short[][] get16BitLookupTable() throws FormatException, IOException { 
     98    if (passthrough()) return reader.get16BitLookupTable(); 
    9699    return null; 
    97100  } 
    98101 
    99102  /* @see IFormatReader#openBytes(int) */ 
     103  @Override 
    100104  public byte[] openBytes(int no) throws FormatException, IOException { 
    101105    return openBytes(no, 0, 0, getSizeX(), getSizeY()); 
     
    103107 
    104108  /* @see IFormatReader#openBytes(int, byte[]) */ 
     109  @Override 
    105110  public byte[] openBytes(int no, byte[] buf) 
    106111    throws FormatException, IOException 
     
    110115 
    111116  /* @see IFormatReader#openBytes(int, int, int, int, int) */ 
     117  @Override 
    112118  public byte[] openBytes(int no, int x, int y, int w, int h) 
    113119    throws FormatException, IOException 
     
    119125 
    120126  /* @see IFormatReader#openBytes(int, byte[], int, int, int, int) */ 
     127  @Override 
    121128  public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) 
    122129    throws FormatException, IOException 
    123130  { 
    124     if (reader.isIndexed() && !reader.isFalseColor()) { 
    125       byte[] pix = reader.openBytes(no, x, y, w, h); 
    126       if (getPixelType() == FormatTools.UINT8) { 
    127         byte[][] b = ImageTools.indexedToRGB(reader.get8BitLookupTable(), pix); 
    128         if (isInterleaved()) { 
    129           int pt = 0; 
    130           for (int i=0; i<b[0].length; i++) { 
    131             for (int j=0; j<b.length; j++) { 
    132               buf[pt++] = b[j][i]; 
    133             } 
    134           } 
    135         } 
    136         else { 
    137           for (int i=0; i<b.length; i++) { 
    138             System.arraycopy(b[i], 0, buf, i*b[i].length, b[i].length); 
    139           } 
    140         } 
    141         return buf; 
    142       } 
    143       short[][] s = ImageTools.indexedToRGB(reader.get16BitLookupTable(), 
    144         pix, isLittleEndian()); 
    145  
     131    if (passthrough()) return reader.openBytes(no, buf, x, y, w, h); 
     132 
     133    byte[] pix = reader.openBytes(no, x, y, w, h); 
     134    if (getPixelType() == FormatTools.UINT8) { 
     135      byte[][] b = ImageTools.indexedToRGB(reader.get8BitLookupTable(), pix); 
    146136      if (isInterleaved()) { 
    147137        int pt = 0; 
    148         for (int i=0; i<s[0].length; i++) { 
    149           for (int j=0; j<s.length; j++) { 
    150             buf[pt++] = (byte) (isLittleEndian() ? 
    151               (s[j][i] & 0xff) : (s[j][i] >> 8)); 
    152             buf[pt++] = (byte) (isLittleEndian() ? 
    153               (s[j][i] >> 8) : (s[j][i] & 0xff)); 
     138        for (int i=0; i<b[0].length; i++) { 
     139          for (int j=0; j<b.length; j++) { 
     140            buf[pt++] = b[j][i]; 
    154141          } 
    155142        } 
    156143      } 
    157144      else { 
    158         int pt = 0; 
    159         for (int i=0; i<s.length; i++) { 
    160           for (int j=0; j<s[i].length; j++) { 
    161             buf[pt++] = (byte) (isLittleEndian() ? 
    162               (s[i][j] & 0xff) : (s[i][j] >> 8)); 
    163             buf[pt++] = (byte) (isLittleEndian() ? 
    164               (s[i][j] >> 8) : (s[i][j] & 0xff)); 
    165           } 
     145        for (int i=0; i<b.length; i++) { 
     146          System.arraycopy(b[i], 0, buf, i*b[i].length, b[i].length); 
    166147        } 
    167148      } 
    168149      return buf; 
    169150    } 
    170     return reader.openBytes(no, buf, x, y, w, h); 
     151    short[][] s = ImageTools.indexedToRGB(reader.get16BitLookupTable(), 
     152      pix, isLittleEndian()); 
     153 
     154    if (isInterleaved()) { 
     155      int pt = 0; 
     156      for (int i=0; i<s[0].length; i++) { 
     157        for (int j=0; j<s.length; j++) { 
     158          buf[pt++] = (byte) (isLittleEndian() ? 
     159            (s[j][i] & 0xff) : (s[j][i] >> 8)); 
     160          buf[pt++] = (byte) (isLittleEndian() ? 
     161            (s[j][i] >> 8) : (s[j][i] & 0xff)); 
     162        } 
     163      } 
     164    } 
     165    else { 
     166      int pt = 0; 
     167      for (int i=0; i<s.length; i++) { 
     168        for (int j=0; j<s[i].length; j++) { 
     169          buf[pt++] = (byte) (isLittleEndian() ? 
     170            (s[i][j] & 0xff) : (s[i][j] >> 8)); 
     171          buf[pt++] = (byte) (isLittleEndian() ? 
     172            (s[i][j] >> 8) : (s[i][j] & 0xff)); 
     173        } 
     174      } 
     175    } 
     176    return buf; 
    171177  } 
    172178 
     
    174180 
    175181  /* @see IFormatHandler#setId(String) */ 
     182  @Override 
    176183  public void setId(String id) throws FormatException, IOException { 
    177184    super.setId(id); 
     
    179186    MetadataTools.populatePixels(store, this, false, false); 
    180187  } 
     188   
     189  // -- Helper methods -- 
     190 
     191  /** Whether to hand off all method calls directly to the wrapped reader. */ 
     192  private boolean passthrough() { 
     193    return !reader.isIndexed() || reader.isFalseColor(); 
     194  } 
     195   
     196  /** Gets the number of color components in the lookup table. */ 
     197  private int getLookupTableComponentCount() { 
     198    try { 
     199      byte[][] lut8 = reader.get8BitLookupTable(); 
     200      if (lut8 != null) return lut8.length; 
     201      short[][] lut16 = reader.get16BitLookupTable(); 
     202      if (lut16 != null) return lut16.length; 
     203    } 
     204    catch (FormatException exc) { } 
     205    catch (IOException exc) { } 
     206    return 3; 
     207  } 
    181208 
    182209} 
Note: See TracChangeset for help on using the changeset viewer.