Changeset 4268


Ignore:
Timestamp:
07/31/08 18:19:25 (12 years ago)
Author:
melissa
Message:
  • Fixed various bugs exposed by test suite.
  • Another patch to MetamorphTiffReader, courtesy of Thomas Caswell.
Location:
trunk/loci/formats
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/DataTools.java

    r4265 r4268  
    757757  } 
    758758 
     759  public static void parseXML(RandomAccessStream stream, DefaultHandler handler) 
     760    throws FormatException, IOException 
     761  { 
     762    try { 
     763      SAXParser parser = SAX_FACTORY.newSAXParser(); 
     764      parser.parse(stream, handler); 
     765    } 
     766    catch (ParserConfigurationException exc) { 
     767      throw new FormatException(exc); 
     768    } 
     769    catch (SAXException exc) { 
     770      throw new FormatException(exc); 
     771    } 
     772  } 
     773 
    759774  public static void parseXML(byte[] xml, DefaultHandler handler) 
    760775    throws FormatException, IOException 
  • trunk/loci/formats/FileStitcher.java

    r4205 r4268  
    111111 
    112112  private boolean noStitch; 
     113 
     114  private MetadataStore store; 
    113115 
    114116  // -- Constructors -- 
     
    304306  public boolean isIndexed() { 
    305307    FormatTools.assertId(currentId, true, 2); 
    306     return reader.isIndexed(); 
     308    return noStitch ? reader.isIndexed() : core.indexed[getSeries()]; 
    307309  } 
    308310 
     
    310312  public boolean isFalseColor() { 
    311313    FormatTools.assertId(currentId, true, 2); 
    312     return reader.isFalseColor(); 
     314    return noStitch ? reader.isFalseColor() : core.falseColor[getSeries()]; 
    313315  } 
    314316 
     
    316318  public byte[][] get8BitLookupTable() throws FormatException, IOException { 
    317319    FormatTools.assertId(currentId, true, 2); 
    318     return reader.get8BitLookupTable(); 
     320    return noStitch ? reader.get8BitLookupTable() : 
     321      readers[seriesInFile ? 0 : getSeries()][0].get8BitLookupTable(); 
    319322  } 
    320323 
     
    322325  public short[][] get16BitLookupTable() throws FormatException, IOException { 
    323326    FormatTools.assertId(currentId, true, 2); 
    324     return reader.get16BitLookupTable(); 
     327    return noStitch ? reader.get16BitLookupTable() : 
     328      readers[seriesInFile ? 0 : getSeries()][0].get16BitLookupTable(); 
    325329  } 
    326330 
     
    341345  public int getThumbSizeX() { 
    342346    FormatTools.assertId(currentId, true, 2); 
    343     return reader.getThumbSizeX(); 
     347    return noStitch ? reader.getThumbSizeX() : 
     348      readers[seriesInFile ? 0 : getSeries()][0].getThumbSizeX(); 
    344349  } 
    345350 
     
    347352  public int getThumbSizeY() { 
    348353    FormatTools.assertId(currentId, true, 2); 
    349     return reader.getThumbSizeY(); 
     354    return noStitch ? reader.getThumbSizeY() : 
     355      readers[seriesInFile ? 0 : getSeries()][0].getThumbSizeY(); 
    350356  } 
    351357 
     
    353359  public boolean isLittleEndian() { 
    354360    FormatTools.assertId(currentId, true, 2); 
    355     return reader.isLittleEndian(); 
     361    return noStitch ? reader.isLittleEndian() : 
     362      readers[seriesInFile ? 0 : getSeries()][0].isLittleEndian(); 
    356363  } 
    357364 
     
    372379  public boolean isInterleaved() { 
    373380    FormatTools.assertId(currentId, true, 2); 
    374     return reader.isInterleaved(); 
     381    return noStitch ? reader.isInterleaved() : 
     382      readers[seriesInFile ? 0 : getSeries()][0].isInterleaved(); 
    375383  } 
    376384 
     
    378386  public boolean isInterleaved(int subC) { 
    379387    FormatTools.assertId(currentId, true, 2); 
    380     return reader.isInterleaved(subC); 
     388    return noStitch ? reader.isInterleaved(subC) : 
     389      readers[seriesInFile ? 0 : getSeries()][0].isInterleaved(subC); 
    381390  } 
    382391 
     
    547556      fileVector = seriesNames = null; 
    548557      seriesInFile = false; 
     558      store = null; 
    549559    } 
    550560  } 
     
    755765  public MetadataStore getMetadataStore() { 
    756766    FormatTools.assertId(currentId, true, 2); 
    757     return reader.getMetadataStore(); 
     767    return store; 
    758768  } 
    759769 
     
    761771  public Object getMetadataStoreRoot() { 
    762772    FormatTools.assertId(currentId, true, 2); 
    763     return reader.getMetadataStoreRoot(); 
     773    return store.getRoot(); 
    764774  } 
    765775 
     
    11461156 
    11471157    // populate metadata store 
    1148     MetadataStore s = reader.getMetadataStore(); 
     1158    store = reader.getMetadataStore(); 
    11491159    for (int i=0; i<core.sizeX.length; i++) { 
    11501160      if (seriesNames != null) { 
    1151         s.setImageName((String) seriesNames.get(i), i); 
    1152       } 
    1153     } 
    1154     MetadataTools.populatePixels(s, this); 
     1161        store.setImageName((String) seriesNames.get(i), i); 
     1162      } 
     1163    } 
     1164    MetadataTools.populatePixels(store, this); 
    11551165  } 
    11561166 
     
    12351245    readers[sno][fno].setSeries(seriesInFile ? getSeries() : 0); 
    12361246    readers[sno][fno].swapDimensions(reader.getDimensionOrder()); 
     1247    if (getSizeC() > 0) MetadataTools.populatePixels(store, this); 
    12371248  } 
    12381249 
  • trunk/loci/formats/MetadataTools.java

    r4257 r4268  
    236236      store.setPixelsBigEndian(new Boolean(!r.isLittleEndian()), i, 0); 
    237237      store.setPixelsDimensionOrder(r.getDimensionOrder(), i, 0); 
    238       Integer sampleCount = new Integer(r.getRGBChannelCount()); 
    239       for (int c=0; c<r.getEffectiveSizeC(); c++) { 
    240         store.setLogicalChannelSamplesPerPixel(sampleCount, i, c); 
     238      if (r.getSizeC() > 0) { 
     239        Integer sampleCount = new Integer(r.getRGBChannelCount()); 
     240        for (int c=0; c<r.getEffectiveSizeC(); c++) { 
     241          store.setLogicalChannelSamplesPerPixel(sampleCount, i, c); 
     242        } 
    241243      } 
    242244    } 
  • trunk/loci/formats/TiffTools.java

    r4209 r4268  
    9191    4, // FLOAT 
    9292    8, // DOUBLE 
    93     -1, // invalid type 
    9493    -1, // invalid type 
    9594    -1, // invalid type 
  • trunk/loci/formats/in/APLReader.java

    r4205 r4268  
    105105      String mtbFile = id.substring(0, underscore) + "_d.mtb"; 
    106106      if (!new Location(mtbFile).exists()) { 
    107  
    108       } 
    109       setId(new Location(mtbFile).getAbsolutePath()); 
    110       return; 
    111     } 
    112  
    113     Vector rows = MDBParser.parseDatabase(id)[0]; 
     107        throw new FormatException(".mtb file not found"); 
     108      } 
     109      currentId = new Location(mtbFile).getAbsolutePath(); 
     110    } 
     111 
     112    Vector rows = MDBParser.parseDatabase(currentId)[0]; 
    114113    String[] columnNames = (String[]) rows.get(0); 
    115114 
     
    125124    used = new Vector(); 
    126125    used.add(id); 
     126    if (!id.equals(currentId)) used.add(currentId); 
    127127 
    128128    // calculate indexes to relevant metadata 
     
    149149      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    150150 
    151     String parentDirectory = id.substring(0, id.lastIndexOf(File.separator)); 
     151    String parentDirectory = 
     152      currentId.substring(0, currentId.lastIndexOf(File.separator)); 
    152153 
    153154    for (int i=0; i<seriesCount; i++) { 
     
    221222      store.setDimensionsPhysicalSizeY(new Float(py), i, 0); 
    222223 
    223       MetadataTools.setDefaultCreationDate(store, id, i); 
     224      MetadataTools.setDefaultCreationDate(store, currentId, i); 
    224225      store.setImageName(row3[imageName], i); 
    225226    } 
  • trunk/loci/formats/in/APNGReader.java

    r4205 r4268  
    9090    int bytesPerChannel = w * h; 
    9191    if (t.length > bytesPerChannel) { 
    92       buf = new byte[bytesPerChannel * 3]; 
     92      buf = new byte[bytesPerChannel * getRGBChannelCount()]; 
    9393      for (int i=0; i<3; i++) { 
    9494        System.arraycopy(t, i * bytesPerChannel, buf, i * bytesPerChannel, 
     
    260260    core.sizeY[0] = img.getHeight(); 
    261261    core.rgb[0] = img.getRaster().getNumBands() > 1; 
    262     core.sizeC[0] = isRGB() ? 3 : 1; 
     262    core.sizeC[0] = img.getRaster().getNumBands(); 
    263263    core.pixelType[0] = ImageTools.getPixelType(img); 
    264264 
  • trunk/loci/formats/in/AVIReader.java

    r4205 r4268  
    144144    } 
    145145 
    146     int pad = bmpScanLineSize - getSizeX()*bytes; 
    147     int scanline = w * bytes; 
    148  
    149     in.skipBytes(scanline * (getSizeY() - h - y)); 
    150  
    151     if (getSizeX() == w) { 
     146    int pad = (bmpScanLineSize / getRGBChannelCount()) - getSizeX()*bytes; 
     147    int scanline = w * bytes * (isInterleaved() ? getRGBChannelCount() : 1); 
     148 
     149    in.skipBytes((getSizeX() + pad) * bytes * (getSizeY() - h - y)); 
     150 
     151    if (getSizeX() == w && pad == 0) { 
    152152      in.read(buf); 
     153      // swap channels 
     154      if (bmpBitsPerPixel == 24) { 
     155        for (int i=0; i<buf.length / getRGBChannelCount(); i++) { 
     156          byte r = buf[i * getRGBChannelCount() + 2]; 
     157          buf[i * getRGBChannelCount() + 2] = buf[i * getRGBChannelCount()]; 
     158          buf[i * getRGBChannelCount()] = r; 
     159        } 
     160      } 
    153161    } 
    154162    else { 
     
    163171          } 
    164172        } 
    165         in.skipBytes(bytes * (getSizeX() - w - x + pad)); 
     173        in.skipBytes(bytes * (getSizeX() - w - x + pad) * 
     174          (isInterleaved() ? getRGBChannelCount() : 1)); 
    166175      } 
    167176    } 
  • trunk/loci/formats/in/BMPReader.java

    r4205 r4268  
    109109    in.seek(global + rowsToSkip * rowLength); 
    110110 
    111     int planeSize = getSizeX() * getSizeY() * getSizeC(); 
     111    int pad = getSizeX() % 2; 
     112    int planeSize = (getSizeX() + pad) * getSizeY() * getSizeC(); 
     113    if (planeSize + in.getFilePointer() > in.length()) { 
     114      pad = 0; 
     115      planeSize = getSizeX() * getSizeY() * getSizeC(); 
     116    } 
    112117    if (bpp >= 8) planeSize *= (bpp / 8); 
    113118    else planeSize /= (8 / bpp); 
     
    123128          buf[row*w + i] = (byte) (bb.getBits(bpp) & 0xff); 
    124129        } 
    125         bb.skipBits((getSizeX() - w - x) * bpp); 
     130        if (row > 0) bb.skipBits((getSizeX() - w - x + pad) * bpp); 
    126131      } 
    127132    } 
     
    133138          buf[row*w*getSizeC() + i] = (byte) (bb.getBits(bpp) & 0xff); 
    134139        } 
    135         bb.skipBits(getSizeC() * (getSizeX() - w - x) * bpp); 
     140        bb.skipBits(getSizeC() * (getSizeX() - w - x + pad) * bpp); 
    136141      } 
    137142      for (int i=0; i<buf.length/getSizeC(); i++) { 
  • trunk/loci/formats/in/DeltavisionReader.java

    r4205 r4268  
    9696    int bytesPerPixel = FormatTools.getBytesPerPixel(getPixelType()); 
    9797    long offset = HEADER_LENGTH + extSize; 
    98     in.seek(offset + getSizeX() * getSizeY() * bytesPerPixel * no); 
     98    long planeOffset = (long) getSizeX() * getSizeY() * bytesPerPixel * no; 
     99    in.seek(offset + planeOffset); 
    99100    DataTools.readPlane(in, x, y, w, h, this, buf); 
    100101 
  • trunk/loci/formats/in/FV1000Reader.java

    r4208 r4268  
    312312          oifFile = oifFile.substring(0, oifFile.lastIndexOf(".")) + ".OIF"; 
    313313          tmp = new Location(oifFile); 
    314           if (!tmp.exists()) throw new FormatException("OIF file not found"); 
     314          if (!tmp.exists()) { 
     315            // check in parent directory 
     316            if (parent.endsWith(File.separator)) { 
     317              parent = parent.substring(0, parent.length() - 1); 
     318            } 
     319            String dir = parent.substring(parent.lastIndexOf(File.separator)); 
     320            tmp = new Location(parent); 
     321            parent = tmp.getParent(); 
     322            oifFile = parent + dir.substring(0, dir.lastIndexOf(".")); 
     323            if (!new Location(oifFile).exists()) { 
     324              throw new FormatException("OIF file not found"); 
     325            } 
     326          } 
    315327          currentId = oifFile; 
    316328        } 
     
    623635        for (int i=0; i<list.length; i++) { 
    624636          if (mappedOIF) usedFiles.add(list[i]); 
    625           else usedFiles.add(new Location(tiffPath, list[i]).getAbsolutePath()); 
     637          else { 
     638            String p = new Location(tiffPath, list[i]).getAbsolutePath(); 
     639            String check = p.toLowerCase(); 
     640            if (!check.endsWith(".tif") && !check.endsWith(".pty") && 
     641              !check.endsWith(".roi") && !check.endsWith(".lut") && 
     642              !check.endsWith(".bmp")) 
     643            { 
     644              continue; 
     645            } 
     646            usedFiles.add(p); 
     647          } 
    626648        } 
    627649      } 
  • trunk/loci/formats/in/ICSReader.java

    r4205 r4268  
    503503      StringTokenizer emTokens = new StringTokenizer(em); 
    504504      for (int i=0; i<getSizeC(); i++) { 
    505         emWave[i] = (int) Float.parseFloat(emTokens.nextToken().trim()); 
     505        if (emTokens.hasMoreTokens()) { 
     506          emWave[i] = (int) Float.parseFloat(emTokens.nextToken().trim()); 
     507        } 
    506508      } 
    507509    } 
     
    509511      StringTokenizer exTokens = new StringTokenizer(ex); 
    510512      for (int i=0; i<getSizeC(); i++) { 
    511         exWave[i] = (int) Float.parseFloat(exTokens.nextToken().trim()); 
     513        if (exTokens.hasMoreTokens()) { 
     514          exWave[i] = (int) Float.parseFloat(exTokens.nextToken().trim()); 
     515        } 
    512516      } 
    513517    } 
  • trunk/loci/formats/in/LeicaHandler.java

    r4203 r4268  
    310310    } 
    311311    else if (qName.equals("ATLConfocalSettingDefinition")) { 
     312      if (fullSeries == null) fullSeries = ""; 
    312313      if (fullSeries.endsWith(" - Master sequential setting")) { 
    313314        fullSeries = fullSeries.replaceAll("Master sequential setting", 
     
    321322      else { 
    322323        int ndx = fullSeries.indexOf("Sequential Setting ") + 19; 
    323         int n = Integer.parseInt(fullSeries.substring(ndx)) + 1; 
    324         fullSeries = fullSeries.substring(0, ndx) + String.valueOf(n); 
     324        try { 
     325          int n = Integer.parseInt(fullSeries.substring(ndx)) + 1; 
     326          fullSeries = fullSeries.substring(0, ndx) + String.valueOf(n); 
     327        } 
     328        catch (NumberFormatException exc) { 
     329          fullSeries = fullSeries.substring(0, fullSeries.indexOf("-")).trim(); 
     330        } 
    325331      } 
    326332 
  • trunk/loci/formats/in/MetamorphTiffReader.java

    r4254 r4268  
    181181      String id = attributes.getValue("id"); 
    182182      String value = attributes.getValue("value"); 
     183      String delim = "&#13;&#10;"; 
    183184      if (id != null && value != null) { 
    184185        if (id.equals("Description")) { 
     
    187188          String k = null, v = null; 
    188189 
    189           if (value.indexOf("&#13;&#10;") != -1) { 
    190             StringTokenizer tokens = new StringTokenizer(value, "&#130;&#10;"); 
    191             while (tokens.hasMoreTokens()) { 
    192               String line = tokens.nextToken(); 
     190          if (value.indexOf(delim) != -1) { 
     191            int currentIndex = -delim.length(); 
     192            while (currentIndex != -1) { 
     193              currentIndex += delim.length(); 
     194              int nextIndex = value.indexOf(delim, currentIndex); 
     195 
     196              String line = null; 
     197              if (nextIndex == -1) { 
     198                line = value.substring(currentIndex, value.length()); 
     199              } 
     200              else { 
     201                line = value.substring(currentIndex, nextIndex); 
     202              } 
     203              currentIndex = nextIndex; 
     204 
    193205              int colon = line.indexOf(":"); 
    194206              if (colon != -1) { 
  • trunk/loci/formats/in/MicromanagerReader.java

    r4205 r4268  
    6666  public boolean isThisType(String name, boolean open) { 
    6767    if (name.equals(METADATA) || name.endsWith(File.separator + METADATA)) { 
    68       return true; 
     68      try { 
     69        return new RandomAccessStream(name).length() > 0; 
     70      } 
     71      catch (IOException e) { 
     72        return false; 
     73      } 
    6974    } 
    7075    if (!open) return false; // not allowed to touch the file system 
  • trunk/loci/formats/in/MinimalTiffReader.java

    r4205 r4268  
    145145    super.initFile(id); 
    146146    in = new RandomAccessStream(id); 
    147     in.order(in.readShort() == 0x4949); 
     147    boolean little = in.readShort() == 0x4949; 
     148    in.order(little); 
    148149 
    149150    status("Reading IFDs"); 
  • trunk/loci/formats/in/OMEXMLReader.java

    r4227 r4268  
    206206 
    207207    DefaultHandler handler = new OMEXMLHandler(); 
    208     DataTools.parseXML(in.readString((int) in.length()), handler); 
     208    DataTools.parseXML(in, handler); 
    209209 
    210210    if (binDataOffsets.size() == 0) { 
  • trunk/loci/formats/in/OpenlabReader.java

    r4205 r4268  
    162162      in.read(b, 512, b.length - 512); 
    163163      Exception exc = null; 
     164      byte[] tmpBuf = 
     165        new byte[buf.length * (getRGBChannelCount() == 3 ? 1 : 3)]; 
    164166      try { 
    165167        Location.mapFile("OPENLAB_PICT", new RABytes(b)); 
    166168        pict.setId("OPENLAB_PICT"); 
    167         pict.openBytes(0, buf, x, y, w, h); 
     169        pict.openBytes(0, tmpBuf, x, y, w, h); 
     170        if (getRGBChannelCount() == 1) { 
     171          byte[] splitBuf = ImageTools.splitChannels(tmpBuf, 0, 3, 
     172            FormatTools.getBytesPerPixel(getPixelType()), false, 
     173            !pict.isInterleaved()); 
     174          System.arraycopy(splitBuf, 0, buf, 0, splitBuf.length); 
     175        } 
     176        else System.arraycopy(tmpBuf, 0, buf, 0, tmpBuf.length); 
    168177      } 
    169178      catch (FormatException e) { exc = e; } 
  • trunk/loci/formats/in/QTReader.java

    r4205 r4268  
    152152    String s = stream.readString(blockCheckLen); 
    153153    for (int i=0; i<CONTAINER_TYPES.length; i++) { 
    154       if (s.indexOf(CONTAINER_TYPES[i]) >= 0) return true; 
     154      if (s.indexOf(CONTAINER_TYPES[i]) >= 0 && 
     155        !CONTAINER_TYPES[i].equals("imag")) 
     156      { 
     157        return true; 
     158      } 
    155159    } 
    156160    return s.indexOf("wide") >= 0 || 
  • trunk/loci/formats/in/TiffReader.java

    r4209 r4268  
    7979        String token = st.nextToken(); 
    8080        int value = 0; 
    81         if (token.indexOf("=") != -1) { 
     81        int eq = token.indexOf("="); 
     82        if (eq != -1 && eq + 1 < token.length()) { 
    8283          try { 
    83             value = Integer.parseInt(token.substring(token.indexOf("=" + 1))); 
     84            value = Integer.parseInt(token.substring(eq + 1)); 
    8485          } 
    8586          catch (NumberFormatException e) { 
  • trunk/loci/formats/readers.txt

    r4180 r4268  
    4444loci.formats.in.LIFReader             # lif 
    4545loci.formats.in.AVIReader             # avi 
    46 loci.formats.in.QTReader              # mov 
    4746loci.formats.in.PictReader            # pict, pct 
    4847loci.formats.in.SDTReader             # sdt 
     
    6059loci.formats.in.NAFReader             # naf 
    6160loci.formats.in.MINCReader            # mnc 
     61loci.formats.in.QTReader              # mov 
    6262 
    6363# multi-extension messes 
Note: See TracChangeset for help on using the changeset viewer.