Changeset 5748


Ignore:
Timestamp:
12/17/09 13:51:54 (10 years ago)
Author:
melissa
Message:

Tweaked Slidebook reader to work with spool files. Closes #407.

File:
1 edited

Legend:

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

    r5676 r5748  
    2626import java.io.EOFException; 
    2727import java.io.IOException; 
     28import java.util.Arrays; 
     29import java.util.Hashtable; 
    2830import java.util.Vector; 
    2931 
     32import loci.common.DataTools; 
    3033import loci.common.RandomAccessInputStream; 
    3134import loci.formats.CoreMetadata; 
     
    5255  // -- Constants -- 
    5356 
    54   public static final long SLD_MAGIC_BYTES = 0x6c000001494900L; 
     57  public static final long SLD_MAGIC_BYTES_1 = 0x6c000001L; 
     58  public static final long SLD_MAGIC_BYTES_2 = 0xf5010201L; 
     59  public static final long SLD_MAGIC_BYTES_3 = 0xf6010101L; 
    5560 
    5661  // -- Fields -- 
     
    6166  private Vector<Double> ndFilters; 
    6267 
     68  private boolean isSpool; 
     69  private Hashtable<Integer, Integer> metadataInPlanes; 
     70 
    6371  // -- Constructor -- 
    6472 
    6573  /** Constructs a new Slidebook reader. */ 
    6674  public SlidebookReader() { 
    67     super("Olympus Slidebook", "sld"); 
     75    super("Olympus Slidebook", new String[] {"sld", "spl"}); 
    6876    domains = new String[] {FormatTools.LM_DOMAIN}; 
    6977  } 
     
    7583    final int blockLen = 8; 
    7684    if (!FormatTools.validStream(stream, blockLen, false)) return false; 
    77     return stream.readLong() == SLD_MAGIC_BYTES; 
     85    long magicBytes = stream.readInt(); 
     86    return magicBytes == SLD_MAGIC_BYTES_1 || magicBytes == SLD_MAGIC_BYTES_2; 
    7887  } 
    7988 
     
    9099    in.seek(offset); 
    91100 
     101    // if this is a spool file, there may be an extra metadata block here 
     102    if (isSpool) { 
     103      Integer[] keys = metadataInPlanes.keySet().toArray(new Integer[0]); 
     104      Arrays.sort(keys); 
     105      for (int key : keys) { 
     106        if (key < no) { 
     107          in.skipBytes(256); 
     108        } 
     109      } 
     110 
     111      in.order(false); 
     112      long magicBytes = (long) in.readInt() & 0xffffffffL; 
     113      in.order(isLittleEndian()); 
     114      if (magicBytes == SLD_MAGIC_BYTES_3 && !metadataInPlanes.contains(no)) { 
     115        metadataInPlanes.put(no, 0); 
     116        in.skipBytes(252); 
     117      } 
     118      else in.seek(in.getFilePointer() - 4); 
     119    } 
     120 
    92121    readPlane(in, x, y, w, h, buf); 
    93122    return buf; 
     
    100129      metadataOffsets = pixelOffsets = pixelLengths = null; 
    101130      ndFilters = null; 
     131      isSpool = false; 
     132      metadataInPlanes = null; 
    102133    } 
    103134  } 
     
    110141    super.initFile(id); 
    111142    in = new RandomAccessInputStream(id); 
     143    isSpool = checkSuffix(id, "spl"); 
     144    if (isSpool) { 
     145      metadataInPlanes = new Hashtable<Integer, Integer>(); 
     146    } 
    112147 
    113148    status("Finding offsets to pixel data"); 
     
    151186 
    152187    while (in.getFilePointer() < in.length() - 8) { 
     188      debug("Looking for block at " + in.getFilePointer()); 
    153189      in.skipBytes(4); 
    154190      int checkOne = in.read(); 
     
    157193        (checkOne == 'M' && checkTwo == 'M')) 
    158194      { 
     195        debug("Found metadata offset: " + (in.getFilePointer() - 6)); 
    159196        metadataOffsets.add(new Long(in.getFilePointer() - 6)); 
    160197        in.skipBytes(in.readShort() - 8); 
     
    171208              foundBlock = true; 
    172209              in.seek(in.getFilePointer() - block.length + i - 2); 
     210              debug("Found metadata offset: " + (in.getFilePointer() - 2)); 
    173211              metadataOffsets.add(new Long(in.getFilePointer() - 2)); 
    174212              in.skipBytes(in.readShort() - 5); 
     
    238276          else in.seek(fp); 
    239277 
     278          debug("Found pixel offset at " + fp); 
    240279          pixelOffsets.add(new Long(fp)); 
    241280          try { 
     
    280319      long offset = pixelOffsets.get(i).longValue(); 
    281320 
    282       if (length + offset + 6 >= in.length()) { 
     321      int padding = isSpool ? 0 : 7; 
     322 
     323      if (length + offset + padding > in.length()) { 
    283324        pixelOffsets.remove(i); 
    284325        pixelLengths.remove(i); 
     
    428469          addSeriesMeta("Mag. changer", in.readCString()); 
    429470        } 
     471        else if (isSpool) { 
     472          // spool files don't necessarily have block identifiers 
     473          for (int j=0; j<pixelOffsets.size(); j++) { 
     474            long end = j == pixelOffsets.size() - 1 ? in.length() : 
     475              pixelOffsets.get(j + 1).longValue(); 
     476            if (in.getFilePointer() < end) { 
     477              in.skipBytes(16); 
     478              core[j].sizeX = in.readShort(); 
     479              core[j].sizeY = in.readShort(); 
     480              break; 
     481            } 
     482          } 
     483        } 
    430484      } 
    431485    } 
Note: See TracChangeset for help on using the changeset viewer.