Changeset 6409


Ignore:
Timestamp:
05/27/10 15:03:34 (9 years ago)
Author:
melissa
Message:

Several fixes to Leica LEI, ND2, and Perkin Elmer readers.

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/4.2/components/bio-formats/src/loci/formats/in/LeicaReader.java

    r6400 r6409  
    215215    FormatTools.assertId(currentId, true, 1); 
    216216    try { 
    217       tiff.setId((String) files[series].get(lastPlane)); 
     217      int index = (int) Math.min(lastPlane, files[series].size() - 1); 
     218      tiff.setId((String) files[series].get(index)); 
    218219      return tiff.get8BitLookupTable(); 
     220    } 
     221    catch (FormatException e) { 
     222      LOGGER.debug("Failed to retrieve lookup table", e); 
    219223    } 
    220224    catch (IOException e) { 
     
    228232    FormatTools.assertId(currentId, true, 1); 
    229233    try { 
    230       tiff.setId((String) files[series].get(lastPlane)); 
     234      int index = (int) Math.min(lastPlane, files[series].size() - 1); 
     235      tiff.setId((String) files[series].get(index)); 
    231236      return tiff.get16BitLookupTable(); 
     237    } 
     238    catch (FormatException e) { 
     239      LOGGER.debug("Failed to retrieve lookup table", e); 
    232240    } 
    233241    catch (IOException e) { 
     
    251259 
    252260    lastPlane = no; 
    253     if (no < files[series].size()) { 
    254       String filename = (String) files[series].get(no); 
    255       if (new Location(filename).exists()) { 
     261 
     262    int fileIndex = no < files[series].size() ? no : 0; 
     263    int planeIndex = no < files[series].size() ? 0 : no; 
     264    String filename = (String) files[series].get(fileIndex); 
     265 
     266    if (new Location(filename).exists()) { 
     267      if (checkSuffix(filename, TiffReader.TIFF_SUFFIXES)) { 
    256268        tiff.setId(filename); 
    257         return tiff.openBytes(0, buf, x, y, w, h); 
    258       } 
    259     } 
     269        return tiff.openBytes(planeIndex, buf, x, y, w, h); 
     270      } 
     271      else { 
     272        RandomAccessInputStream s = new RandomAccessInputStream(filename); 
     273        s.seek(planeIndex * FormatTools.getPlaneSize(this)); 
     274        readPlane(s, x, y, w, h, buf); 
     275        s.close(); 
     276      } 
     277    } 
     278 
    260279    // imitate Leica's software and return a blank plane if the 
    261280    // appropriate TIFF file is missing 
     
    309328 
    310329    String leiFile = findLEIFile(id); 
    311     if (leiFile == null) { 
    312       if (checkSuffix(id, TiffReader.TIFF_SUFFIXES) && !isGroupFiles()) { 
     330    if (leiFile == null || leiFile.trim().length() == 0 || 
     331      new Location(leiFile).isDirectory()) 
     332    { 
     333      if (checkSuffix(id, TiffReader.TIFF_SUFFIXES)) { 
    313334        super.initFile(id); 
    314335        TiffReader r = new TiffReader(); 
     
    341362    super.initFile(leiFile); 
    342363 
    343     leiFilename =  
     364    leiFilename = 
    344365      new File(leiFile).exists()? new Location(leiFile).getAbsolutePath() : id; 
    345366 
     
    355376      fourBytes[2] == TiffConstants.LITTLE && 
    356377      fourBytes[3] == TiffConstants.LITTLE); 
     378    boolean realLittleEndian = isLittleEndian(); 
    357379 
    358380    in.order(isLittleEndian()); 
     
    541563      core[i].dimensionOrder = 
    542564        MetadataTools.makeSaneDimensionOrder(getDimensionOrder()); 
     565      core[i].littleEndian = realLittleEndian; 
    543566    } 
    544567 
  • branches/4.2/components/bio-formats/src/loci/formats/in/MinimalTiffReader.java

    r6188 r6409  
    286286    in = new RandomAccessInputStream(id); 
    287287    tiffParser = new TiffParser(in); 
    288     boolean little = tiffParser.checkHeader().booleanValue(); 
     288    Boolean littleEndian = tiffParser.checkHeader(); 
     289    if (littleEndian == null) { 
     290      throw new FormatException("Invalid TIFF file"); 
     291    } 
     292    boolean little = littleEndian.booleanValue(); 
    289293    in.order(little); 
    290294 
  • branches/4.2/components/bio-formats/src/loci/formats/in/NativeND2Reader.java

    r6376 r6409  
    249249      // search for blocks 
    250250      byte[] sigBytes = {-38, -50, -66, 10}; // 0xDACEBE0A 
    251       final String sig = new String(sigBytes); 
    252251      while (in.getFilePointer() < in.length() - 1 && in.getFilePointer() >= 0) 
    253252      { 
    254         in.findString(false, 1024, sig); // empirically, 1KB blocks work well 
     253        byte[] buf = new byte[1024]; 
     254        int foundIndex = -1; 
     255        in.read(buf, 0, sigBytes.length); 
     256        while (foundIndex == -1 && in.getFilePointer() < in.length()) { 
     257          int n = in.read(buf, sigBytes.length, buf.length - sigBytes.length); 
     258          for (int i=0; i<buf.length-sigBytes.length; i++) { 
     259            for (int j=0; j<sigBytes.length; j++) { 
     260              if (buf[i + j] != sigBytes[j]) break; 
     261              if (j == sigBytes.length - 1) foundIndex = i; 
     262            } 
     263            if (foundIndex != -1) break; 
     264          } 
     265          if (foundIndex == -1) { 
     266            System.arraycopy(buf, buf.length - sigBytes.length - 1, 
     267              buf, 0, sigBytes.length); 
     268          } 
     269          else in.seek(in.getFilePointer() - n + foundIndex); 
     270        } 
     271        if (in.getFilePointer() >= in.length() || foundIndex == -1) { 
     272          break; 
     273        } 
     274 
    255275        if (in.getFilePointer() > in.length() - 24) break; 
    256276 
     
    12111231            } 
    12121232            else if (dim.startsWith("T")) { 
    1213               if (getSizeT() <= 1) { 
     1233              if (getSizeT() <= 1 || v < getSizeT()) { 
    12141234                core[0].sizeT = v; 
    12151235              } 
  • branches/4.2/components/bio-formats/src/loci/formats/in/PerkinElmerReader.java

    r6301 r6409  
    174174    RandomAccessInputStream ras = new RandomAccessInputStream(files[no]); 
    175175    ras.seek(6); 
    176  
    177176    readPlane(ras, x, y, w, h, buf); 
    178177    ras.close(); 
     
    692691        int count = (int) Math.min(oldCount, nPlanes); 
    693692        System.arraycopy(tmpFiles, oldFile, files, nextFile, count); 
     693        nextFile += count; 
     694        oldFile += count; 
    694695        if (count < oldCount) oldFile += (oldCount - count); 
    695696      } 
  • trunk/components/bio-formats/src/loci/formats/in/LeicaReader.java

    r6398 r6409  
    215215    FormatTools.assertId(currentId, true, 1); 
    216216    try { 
    217       tiff.setId((String) files[series].get(lastPlane)); 
     217      int index = (int) Math.min(lastPlane, files[series].size() - 1); 
     218      tiff.setId((String) files[series].get(index)); 
    218219      return tiff.get8BitLookupTable(); 
     220    } 
     221    catch (FormatException e) { 
     222      LOGGER.debug("Failed to retrieve lookup table", e); 
    219223    } 
    220224    catch (IOException e) { 
     
    228232    FormatTools.assertId(currentId, true, 1); 
    229233    try { 
    230       tiff.setId((String) files[series].get(lastPlane)); 
     234      int index = (int) Math.min(lastPlane, files[series].size() - 1); 
     235      tiff.setId((String) files[series].get(index)); 
    231236      return tiff.get16BitLookupTable(); 
     237    } 
     238    catch (FormatException e) { 
     239      LOGGER.debug("Failed to retrieve lookup table", e); 
    232240    } 
    233241    catch (IOException e) { 
     
    251259 
    252260    lastPlane = no; 
    253     if (no < files[series].size()) { 
    254       String filename = (String) files[series].get(no); 
    255       if (new Location(filename).exists()) { 
     261 
     262    int fileIndex = no < files[series].size() ? no : 0; 
     263    int planeIndex = no < files[series].size() ? 0 : no; 
     264    String filename = (String) files[series].get(fileIndex); 
     265 
     266    if (new Location(filename).exists()) { 
     267      if (checkSuffix(filename, TiffReader.TIFF_SUFFIXES)) { 
    256268        tiff.setId(filename); 
    257         return tiff.openBytes(0, buf, x, y, w, h); 
    258       } 
    259     } 
     269        return tiff.openBytes(planeIndex, buf, x, y, w, h); 
     270      } 
     271      else { 
     272        RandomAccessInputStream s = new RandomAccessInputStream(filename); 
     273        s.seek(planeIndex * FormatTools.getPlaneSize(this)); 
     274        readPlane(s, x, y, w, h, buf); 
     275        s.close(); 
     276      } 
     277    } 
     278 
    260279    // imitate Leica's software and return a blank plane if the 
    261280    // appropriate TIFF file is missing 
     
    309328 
    310329    String leiFile = findLEIFile(id); 
    311     if (leiFile == null) { 
    312       if (checkSuffix(id, TiffReader.TIFF_SUFFIXES) && !isGroupFiles()) { 
     330    if (leiFile == null || leiFile.trim().length() == 0 || 
     331      new Location(leiFile).isDirectory()) 
     332    { 
     333      if (checkSuffix(id, TiffReader.TIFF_SUFFIXES)) { 
    313334        super.initFile(id); 
    314335        TiffReader r = new TiffReader(); 
     
    341362    super.initFile(leiFile); 
    342363 
    343     leiFilename =  
     364    leiFilename = 
    344365      new File(leiFile).exists()? new Location(leiFile).getAbsolutePath() : id; 
    345366 
     
    355376      fourBytes[2] == TiffConstants.LITTLE && 
    356377      fourBytes[3] == TiffConstants.LITTLE); 
     378    boolean realLittleEndian = isLittleEndian(); 
    357379 
    358380    in.order(isLittleEndian()); 
     
    541563      core[i].dimensionOrder = 
    542564        MetadataTools.makeSaneDimensionOrder(getDimensionOrder()); 
     565      core[i].littleEndian = realLittleEndian; 
    543566    } 
    544567 
  • trunk/components/bio-formats/src/loci/formats/in/MinimalTiffReader.java

    r6188 r6409  
    286286    in = new RandomAccessInputStream(id); 
    287287    tiffParser = new TiffParser(in); 
    288     boolean little = tiffParser.checkHeader().booleanValue(); 
     288    Boolean littleEndian = tiffParser.checkHeader(); 
     289    if (littleEndian == null) { 
     290      throw new FormatException("Invalid TIFF file"); 
     291    } 
     292    boolean little = littleEndian.booleanValue(); 
    289293    in.order(little); 
    290294 
  • trunk/components/bio-formats/src/loci/formats/in/NativeND2Reader.java

    r6377 r6409  
    249249      // search for blocks 
    250250      byte[] sigBytes = {-38, -50, -66, 10}; // 0xDACEBE0A 
    251       final String sig = new String(sigBytes); 
    252251      while (in.getFilePointer() < in.length() - 1 && in.getFilePointer() >= 0) 
    253252      { 
    254         in.findString(false, 1024, sig); // empirically, 1KB blocks work well 
     253        byte[] buf = new byte[1024]; 
     254        int foundIndex = -1; 
     255        in.read(buf, 0, sigBytes.length); 
     256        while (foundIndex == -1 && in.getFilePointer() < in.length()) { 
     257          int n = in.read(buf, sigBytes.length, buf.length - sigBytes.length); 
     258          for (int i=0; i<buf.length-sigBytes.length; i++) { 
     259            for (int j=0; j<sigBytes.length; j++) { 
     260              if (buf[i + j] != sigBytes[j]) break; 
     261              if (j == sigBytes.length - 1) foundIndex = i; 
     262            } 
     263            if (foundIndex != -1) break; 
     264          } 
     265          if (foundIndex == -1) { 
     266            System.arraycopy(buf, buf.length - sigBytes.length - 1, 
     267              buf, 0, sigBytes.length); 
     268          } 
     269          else in.seek(in.getFilePointer() - n + foundIndex); 
     270        } 
     271        if (in.getFilePointer() >= in.length() || foundIndex == -1) { 
     272          break; 
     273        } 
     274 
    255275        if (in.getFilePointer() > in.length() - 24) break; 
    256276 
     
    12111231            } 
    12121232            else if (dim.startsWith("T")) { 
    1213               if (getSizeT() <= 1) { 
     1233              if (getSizeT() <= 1 || v < getSizeT()) { 
    12141234                core[0].sizeT = v; 
    12151235              } 
  • trunk/components/bio-formats/src/loci/formats/in/PerkinElmerReader.java

    r6301 r6409  
    174174    RandomAccessInputStream ras = new RandomAccessInputStream(files[no]); 
    175175    ras.seek(6); 
    176  
    177176    readPlane(ras, x, y, w, h, buf); 
    178177    ras.close(); 
     
    692691        int count = (int) Math.min(oldCount, nPlanes); 
    693692        System.arraycopy(tmpFiles, oldFile, files, nextFile, count); 
     693        nextFile += count; 
     694        oldFile += count; 
    694695        if (count < oldCount) oldFile += (oldCount - count); 
    695696      } 
Note: See TracChangeset for help on using the changeset viewer.