Changeset 5709


Ignore:
Timestamp:
11/19/09 16:13:17 (10 years ago)
Author:
melissa
Message:
  • Various bug fixes.
  • Reduced amount of memory required by ZeissZVIReader and ChannelSeparator. Closes #434.
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • branches/4.1/components/bio-formats/src/loci/formats/ChannelSeparator.java

    r5615 r5709  
    170170      } 
    171171 
    172       byte[] n = ImageTools.splitChannels(lastImage, channel, c, 
     172      ImageTools.splitChannels(lastImage, buf, channel, c, 
    173173        FormatTools.getBytesPerPixel(getPixelType()), false, isInterleaved()); 
    174       System.arraycopy(n, 0, buf, 0, n.length); 
    175174      return buf; 
    176175    } 
  • branches/4.1/components/bio-formats/src/loci/formats/FileStitcher.java

    r5696 r5709  
    928928      // reader subclass is handling file grouping 
    929929      noStitch = true; 
    930       reader.setId(currentId); 
     930      if (patternIds && fp.isValid()) { 
     931        reader.setId(fp.getFiles()[0]); 
     932      } 
     933      else reader.setId(currentId); 
    931934      return; 
    932935    } 
     
    936939    } 
    937940    reader.setId(fp.getFiles()[0]); 
     941    if (reader.getUsedFiles().length > 1) { 
     942      noStitch = true; 
     943      return; 
     944    } 
    938945 
    939946    AxisGuesser guesser = new AxisGuesser(fp, reader.getDimensionOrder(), 
  • branches/4.1/components/bio-formats/src/loci/formats/ImageTools.java

    r5365 r5709  
    187187   * channels are in BGR order. 
    188188   */ 
    189   public static byte[] splitChannels(byte[] array, int index, int c, int bytes, 
    190     boolean reverse, boolean interleaved) 
     189  public static byte[] splitChannels(byte[] array, int index, int c, 
     190    int bytes, boolean reverse, boolean interleaved) 
     191  { 
     192    return splitChannels(array, null, index, c, bytes, reverse, interleaved); 
     193  } 
     194 
     195  /** 
     196   * Splits the given multi-channel array into a 2D array. 
     197   * The "reverse" parameter is false if channels are in RGB order, true if 
     198   * channels are in BGR order.  If the 'rtn' parameter is not null, the 
     199   * specified channel will be copied into 'rtn'. 
     200   */ 
     201  public static byte[] splitChannels(byte[] array, byte[] rtn, int index, int c, 
     202    int bytes, boolean reverse, boolean interleaved) 
    191203  { 
    192204    if (c == 1) return array; 
    193     byte[] rtn = new byte[array.length / c]; 
     205    if (rtn == null) rtn = new byte[array.length / c]; 
    194206 
    195207    if (reverse) index = c - index - 1; 
  • branches/4.1/components/bio-formats/src/loci/formats/POITools.java

    r5552 r5709  
    2525 
    2626import java.io.File; 
     27import java.io.InputStream; 
    2728import java.io.IOException; 
    2829import java.util.Hashtable; 
     
    7677 
    7778  // -- Document retrieval methods -- 
     79 
     80  public InputStream getInputStream(String name) 
     81    throws FormatException, IOException 
     82  { 
     83    setupFile(name); 
     84    try { 
     85      return (InputStream) r.getVar(makeVarName("dis")); 
     86    } 
     87    catch (ReflectException e) { 
     88      throw new FormatException(e); 
     89    } 
     90  } 
    7891 
    7992  public RandomAccessInputStream getDocumentStream(String name) 
  • branches/4.1/components/bio-formats/src/loci/formats/in/BioRadReader.java

    r5703 r5709  
    147147  /* @see loci.formats.IFormatReader#fileGroupOption(String) */ 
    148148  public int fileGroupOption(String id) throws FormatException, IOException { 
    149     Location parent = new Location(id).getAbsoluteFile().getParentFile(); 
     149    Location thisFile = new Location(id).getAbsoluteFile(); 
     150    Location parent = thisFile.getParentFile(); 
    150151    String[] list = parent.list(); 
    151152    for (String f : list) { 
     
    760761          switch (axisType) { 
    761762            case 1: 
    762               String dx = values[2]; 
    763               String dy = values[3]; 
    764               addGlobalMeta(key + " distance (X) in microns", dx); 
    765               addGlobalMeta(key + " distance (Y) in microns", dy); 
     763              addGlobalMeta(key + " distance (X) in microns", values[2]); 
     764              addGlobalMeta(key + " distance (Y) in microns", values[3]); 
    766765              break; 
    767766            case 3: 
     
    791790              addGlobalMeta(key + " RGB type (Y)", values[3]); 
    792791 
    793               // NB: This logic has not been tested, so it may be broken. 
    794792              if (key.equals("AXIS_4")) { 
    795793                // this is a single section multi-channel dataset 
     
    854852    else picFiles = null; 
    855853 
     854    if (getEffectiveSizeC() != getSizeC() && !isRGB()) { 
     855      core[0].sizeC = 1; 
     856    } 
     857 
    856858    status("Reading lookup tables"); 
    857859 
     
    930932    while (notes) { 
    931933      // read in note 
     934 
     935      if (s.getFilePointer() >= s.length()) { 
     936        brokenNotes = true; 
     937        break; 
     938      } 
    932939 
    933940      Note n = new Note(); 
  • branches/4.1/components/bio-formats/src/loci/formats/in/TCSReader.java

    r5614 r5709  
    382382 
    383383    if (isRGB()) core[0].imageCount /= (getSizeC() / channelCount); 
     384    if (getSizeZ() * getSizeT() * getEffectiveSizeC() != 
     385      (ifds.size() * tiffReaders.length)) 
     386    { 
     387      core[0].sizeZ = 1; 
     388      int c = getEffectiveSizeC(); 
     389      if (c == 0) c = 1; 
     390      core[0].sizeT = (ifds.size() * tiffReaders.length) / c; 
     391      core[0].imageCount = getSizeT() * c; 
     392    } 
    384393 
    385394    MetadataTools.populatePixels(store, this, true); 
  • branches/4.1/components/bio-formats/src/loci/formats/in/ZeissZVIReader.java

    r5694 r5709  
    2424package loci.formats.in; 
    2525 
     26import java.io.ByteArrayInputStream; 
    2627import java.io.File; 
     28import java.io.InputStream; 
    2729import java.io.IOException; 
    2830import java.util.Arrays; 
     
    4042import loci.formats.MetadataTools; 
    4143import loci.formats.POITools; 
     44import loci.formats.codec.Codec; 
    4245import loci.formats.codec.CodecOptions; 
    4346import loci.formats.codec.JPEGCodec; 
     
    233236 
    234237      int count = getImageCount(); 
    235  
    236       byte[] tile = new byte[tileWidth * tileHeight * pixel]; 
    237238 
    238239      int channel = no % getEffectiveSizeC(); 
     
    290291                continue; 
    291292              } 
    292               if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     293              int c = getEffectiveSizeC(); 
     294              if (c > 1) c = 2 - (tileRows % 2); 
     295              if (getImageCount() > 1 && c == 1) { 
    293296                int p = ii; 
    294297                for (int n=0; n<p; n++) { 
     
    298301                } 
    299302              } 
    300               ii *= getEffectiveSizeC(); 
    301               if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     303              ii *= c; 
     304              if (getImageCount() > 1 && c == 1) { 
    302305                ii -= tileIndex; 
    303306              } 
    304               else if (getEffectiveSizeC() > 1) { 
     307              else if (c > 1) { 
    305308                ii += scale; 
    306309              } 
    307310              if (getImageCount() == 1) ii -= firstTile; 
    308               if (getEffectiveSizeC() == 1) ii += no; 
     311              if (c == 1) ii += no; 
    309312 
    310313              if (ii < 0) { 
     
    330333              } 
    331334              prevIndex = ii; 
    332               RandomAccessInputStream s = poi.getDocumentStream(imageFiles[ii]); 
    333               s.seek(offsets[ii]); 
    334               int nread = s.read(tile); 
    335  
    336               if (isJPEG) { 
    337                 tile = new JPEGCodec().decompress(tile, options); 
     335              InputStream s = poi.getInputStream(imageFiles[ii]); 
     336              s.skip(offsets[ii]); 
     337 
     338              if (isJPEG || isZlib) { 
     339                byte[] tile = new byte[s.available()]; 
     340                s.read(tile); 
     341                Codec codec = isJPEG ? new JPEGCodec() : new ZlibCodec(); 
     342                s = new ByteArrayInputStream(codec.decompress(tile, options)); 
    338343              } 
    339               else if (isZlib) { 
    340                 tile = new ZlibCodec().decompress(tile, options); 
    341               } 
    342               s.close(); 
    343  
    344               int actualRowsInTile = tile.length / (tileWidth * pixel); 
     344 
     345              int actualRowsInTile = 
     346                (tileWidth * tileHeight * pixel) / (tileWidth * pixel); 
    345347              int blankRows = tileHeight - actualRowsInTile; 
    346348              tileH -= blankRows; 
    347349 
    348350              for (int r=tileY; r<tileY + tileH; r++) { 
    349                 int src = pixel * (r * tileWidth + tileX); 
    350351                int dest = 
    351352                  pixel * (w * (rowOffset + r - tileY + blankRows) + colOffset); 
    352353                int len = pixel * tileW; 
    353                 System.arraycopy(tile, src, buf, dest, len); 
     354                s.skip(pixel * tileX); 
     355                s.read(buf, dest, len); 
     356                s.skip(pixel * (tileWidth - tileW - tileX)); 
    354357              } 
     358              s.close(); 
    355359 
    356360              colOffset += tileW; 
     
    573577 
    574578    // calculate tile dimensions and number of tiles 
    575     Integer[] t = tiles.keySet().toArray(new Integer[0]); 
    576     Arrays.sort(t); 
    577     Vector<Integer> tmpOffsets = new Vector<Integer>(); 
    578     Vector<String> tmpFiles = new Vector<String>(); 
    579     int index = 0; 
    580     for (Integer key : t) { 
    581       int nTiles = tiles.get(key).intValue(); 
    582       if (nTiles < getImageCount()) { 
    583         tiles.remove(key); 
    584       } 
    585       else { 
    586         for (int p=0; p<nTiles; p++) { 
    587           tmpOffsets.add(new Integer(offsets[index + p])); 
    588           tmpFiles.add(imageFiles[index + p]); 
    589         } 
    590       } 
    591       index += nTiles; 
    592     } 
    593  
    594     offsets = new int[tmpOffsets.size()]; 
    595     for (int i=0; i<offsets.length; i++) { 
    596       offsets[i] = tmpOffsets.get(i).intValue(); 
    597     } 
    598     imageFiles = tmpFiles.toArray(new String[tmpFiles.size()]); 
     579    if (isTiled) { 
     580      Integer[] t = tiles.keySet().toArray(new Integer[0]); 
     581      Arrays.sort(t); 
     582      Vector<Integer> tmpOffsets = new Vector<Integer>(); 
     583      Vector<String> tmpFiles = new Vector<String>(); 
     584      int index = 0; 
     585      for (Integer key : t) { 
     586        int nTiles = tiles.get(key).intValue(); 
     587        if (nTiles < getImageCount()) { 
     588          tiles.remove(key); 
     589        } 
     590        else { 
     591          for (int p=0; p<nTiles; p++) { 
     592            tmpOffsets.add(new Integer(offsets[index + p])); 
     593            tmpFiles.add(imageFiles[index + p]); 
     594          } 
     595        } 
     596        index += nTiles; 
     597      } 
     598 
     599      offsets = new int[tmpOffsets.size()]; 
     600      for (int i=0; i<offsets.length; i++) { 
     601        offsets[i] = tmpOffsets.get(i).intValue(); 
     602      } 
     603      imageFiles = tmpFiles.toArray(new String[tmpFiles.size()]); 
     604    } 
    599605 
    600606    int totalTiles = offsets.length / getImageCount(); 
  • trunk/components/bio-formats/src/loci/formats/ChannelSeparator.java

    r5590 r5709  
    170170      } 
    171171 
    172       byte[] n = ImageTools.splitChannels(lastImage, channel, c, 
     172      ImageTools.splitChannels(lastImage, buf, channel, c, 
    173173        FormatTools.getBytesPerPixel(getPixelType()), false, isInterleaved()); 
    174       System.arraycopy(n, 0, buf, 0, n.length); 
    175174      return buf; 
    176175    } 
  • trunk/components/bio-formats/src/loci/formats/FileStitcher.java

    r5696 r5709  
    928928      // reader subclass is handling file grouping 
    929929      noStitch = true; 
    930       reader.setId(currentId); 
     930      if (patternIds && fp.isValid()) { 
     931        reader.setId(fp.getFiles()[0]); 
     932      } 
     933      else reader.setId(currentId); 
    931934      return; 
    932935    } 
     
    936939    } 
    937940    reader.setId(fp.getFiles()[0]); 
     941    if (reader.getUsedFiles().length > 1) { 
     942      noStitch = true; 
     943      return; 
     944    } 
    938945 
    939946    AxisGuesser guesser = new AxisGuesser(fp, reader.getDimensionOrder(), 
  • trunk/components/bio-formats/src/loci/formats/ImageTools.java

    r5365 r5709  
    190190    boolean reverse, boolean interleaved) 
    191191  { 
     192    return splitChannels(array, null, index, c, bytes, reverse, interleaved); 
     193  } 
     194 
     195  /** 
     196   * Splits the given multi-channel array into a 2D array. 
     197   * The "reverse" parameter is false if channels are in RGB order, true if 
     198   * channels are in BGR order.  If the 'rtn' parameter is not null, the 
     199   * specified channel will be copied into 'rtn'. 
     200   */ 
     201  public static byte[] splitChannels(byte[] array, byte[] rtn, int index, int c, 
     202    int bytes, boolean reverse, boolean interleaved) 
     203  { 
    192204    if (c == 1) return array; 
    193     byte[] rtn = new byte[array.length / c]; 
     205    if (rtn == null) rtn = new byte[array.length / c]; 
    194206 
    195207    if (reverse) index = c - index - 1; 
  • trunk/components/bio-formats/src/loci/formats/POITools.java

    r5552 r5709  
    2525 
    2626import java.io.File; 
     27import java.io.InputStream; 
    2728import java.io.IOException; 
    2829import java.util.Hashtable; 
     
    7677 
    7778  // -- Document retrieval methods -- 
     79 
     80  public InputStream getInputStream(String name) 
     81    throws FormatException, IOException 
     82  { 
     83    setupFile(name); 
     84    try { 
     85      return (InputStream) r.getVar(makeVarName("dis")); 
     86    } 
     87    catch (ReflectException e) { 
     88      throw new FormatException(e); 
     89    } 
     90  } 
    7891 
    7992  public RandomAccessInputStream getDocumentStream(String name) 
  • trunk/components/bio-formats/src/loci/formats/in/BioRadReader.java

    r5703 r5709  
    147147  /* @see loci.formats.IFormatReader#fileGroupOption(String) */ 
    148148  public int fileGroupOption(String id) throws FormatException, IOException { 
    149     Location parent = new Location(id).getAbsoluteFile().getParentFile(); 
     149    Location thisFile = new Location(id).getAbsoluteFile(); 
     150    Location parent = thisFile.getParentFile(); 
    150151    String[] list = parent.list(); 
    151152    for (String f : list) { 
     
    532533                addGlobalMeta("Scan area height", values[5]); 
    533534 
    534                 float width = 
    535                   Float.parseFloat(values[4]) - Float.parseFloat(values[2]); 
     535                double width = 
     536                  Double.parseDouble(values[4]) - Double.parseDouble(values[2]); 
    536537                width /= getSizeX(); 
    537                 float height = 
    538                   Float.parseFloat(values[5]) - Float.parseFloat(values[3]); 
     538                double height = 
     539                  Double.parseDouble(values[5]) - Double.parseDouble(values[3]); 
    539540                height /= getSizeY(); 
    540541 
     
    760761          switch (axisType) { 
    761762            case 1: 
    762               String dx = values[2]; 
    763               String dy = values[3]; 
    764               addGlobalMeta(key + " distance (X) in microns", dx); 
    765               addGlobalMeta(key + " distance (Y) in microns", dy); 
     763              addGlobalMeta(key + " distance (X) in microns", values[2]); 
     764              addGlobalMeta(key + " distance (Y) in microns", values[3]); 
    766765              break; 
    767766            case 3: 
     
    791790              addGlobalMeta(key + " RGB type (Y)", values[3]); 
    792791 
    793               // NB: This logic has not been tested, so it may be broken. 
    794792              if (key.equals("AXIS_4")) { 
    795793                // this is a single section multi-channel dataset 
     
    854852    else picFiles = null; 
    855853 
     854    if (getEffectiveSizeC() != getSizeC() && !isRGB()) { 
     855      core[0].sizeC = 1; 
     856    } 
     857 
    856858    status("Reading lookup tables"); 
    857859 
     
    930932    while (notes) { 
    931933      // read in note 
     934 
     935      if (s.getFilePointer() >= s.length()) { 
     936        brokenNotes = true; 
     937        break; 
     938      } 
    932939 
    933940      Note n = new Note(); 
  • trunk/components/bio-formats/src/loci/formats/in/TCSReader.java

    r5668 r5709  
    376376 
    377377    if (isRGB()) core[0].imageCount /= (getSizeC() / channelCount); 
     378    if (getSizeZ() * getSizeT() * getEffectiveSizeC() != 
     379      (ifds.size() * tiffReaders.length)) 
     380    { 
     381      core[0].sizeZ = 1; 
     382      int c = getEffectiveSizeC(); 
     383      if (c == 0) c = 1; 
     384      core[0].sizeT = (ifds.size() * tiffReaders.length) / c; 
     385      core[0].imageCount = getSizeT() * c; 
     386    } 
    378387 
    379388    MetadataTools.populatePixels(store, this, true); 
  • trunk/components/bio-formats/src/loci/formats/in/ZeissZVIReader.java

    r5694 r5709  
    2424package loci.formats.in; 
    2525 
     26import java.io.ByteArrayInputStream; 
    2627import java.io.File; 
     28import java.io.InputStream; 
    2729import java.io.IOException; 
    2830import java.util.Arrays; 
     
    4042import loci.formats.MetadataTools; 
    4143import loci.formats.POITools; 
     44import loci.formats.codec.Codec; 
    4245import loci.formats.codec.CodecOptions; 
    4346import loci.formats.codec.JPEGCodec; 
     
    233236 
    234237      int count = getImageCount(); 
    235  
    236       byte[] tile = new byte[tileWidth * tileHeight * pixel]; 
    237238 
    238239      int channel = no % getEffectiveSizeC(); 
     
    290291                continue; 
    291292              } 
    292               if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     293              int c = getEffectiveSizeC(); 
     294              if (c > 1) c = 2 - (tileRows % 2); 
     295              if (getImageCount() > 1 && c == 1) { 
    293296                int p = ii; 
    294297                for (int n=0; n<p; n++) { 
     
    298301                } 
    299302              } 
    300               ii *= getEffectiveSizeC(); 
    301               if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     303              ii *= c; 
     304              if (getImageCount() > 1 && c == 1) { 
    302305                ii -= tileIndex; 
    303306              } 
    304               else if (getEffectiveSizeC() > 1) { 
     307              else if (c > 1) { 
    305308                ii += scale; 
    306309              } 
    307310              if (getImageCount() == 1) ii -= firstTile; 
    308               if (getEffectiveSizeC() == 1) ii += no; 
     311              if (c == 1) ii += no; 
    309312 
    310313              if (ii < 0) { 
     
    330333              } 
    331334              prevIndex = ii; 
    332               RandomAccessInputStream s = poi.getDocumentStream(imageFiles[ii]); 
    333               s.seek(offsets[ii]); 
    334               int nread = s.read(tile); 
    335  
    336               if (isJPEG) { 
    337                 tile = new JPEGCodec().decompress(tile, options); 
     335              InputStream s = poi.getInputStream(imageFiles[ii]); 
     336              s.skip(offsets[ii]); 
     337 
     338              if (isJPEG || isZlib) { 
     339                byte[] tile = new byte[s.available()]; 
     340                s.read(tile); 
     341                Codec codec = isJPEG ? new JPEGCodec() : new ZlibCodec(); 
     342                s = new ByteArrayInputStream(codec.decompress(tile, options)); 
    338343              } 
    339               else if (isZlib) { 
    340                 tile = new ZlibCodec().decompress(tile, options); 
    341               } 
    342               s.close(); 
    343  
    344               int actualRowsInTile = tile.length / (tileWidth * pixel); 
     344 
     345              int actualRowsInTile = 
     346                (tileWidth * tileHeight * pixel) / (tileWidth * pixel); 
    345347              int blankRows = tileHeight - actualRowsInTile; 
    346348              tileH -= blankRows; 
    347349 
    348350              for (int r=tileY; r<tileY + tileH; r++) { 
    349                 int src = pixel * (r * tileWidth + tileX); 
    350351                int dest = 
    351352                  pixel * (w * (rowOffset + r - tileY + blankRows) + colOffset); 
    352353                int len = pixel * tileW; 
    353                 System.arraycopy(tile, src, buf, dest, len); 
     354                s.skip(pixel * tileX); 
     355                s.read(buf, dest, len); 
     356                s.skip(pixel * (tileWidth - tileW - tileX)); 
    354357              } 
     358              s.close(); 
    355359 
    356360              colOffset += tileW; 
     
    573577 
    574578    // calculate tile dimensions and number of tiles 
    575     Integer[] t = tiles.keySet().toArray(new Integer[0]); 
    576     Arrays.sort(t); 
    577     Vector<Integer> tmpOffsets = new Vector<Integer>(); 
    578     Vector<String> tmpFiles = new Vector<String>(); 
    579     int index = 0; 
    580     for (Integer key : t) { 
    581       int nTiles = tiles.get(key).intValue(); 
    582       if (nTiles < getImageCount()) { 
    583         tiles.remove(key); 
    584       } 
    585       else { 
    586         for (int p=0; p<nTiles; p++) { 
    587           tmpOffsets.add(new Integer(offsets[index + p])); 
    588           tmpFiles.add(imageFiles[index + p]); 
    589         } 
    590       } 
    591       index += nTiles; 
    592     } 
    593  
    594     offsets = new int[tmpOffsets.size()]; 
    595     for (int i=0; i<offsets.length; i++) { 
    596       offsets[i] = tmpOffsets.get(i).intValue(); 
    597     } 
    598     imageFiles = tmpFiles.toArray(new String[tmpFiles.size()]); 
     579    if (isTiled) { 
     580      Integer[] t = tiles.keySet().toArray(new Integer[0]); 
     581      Arrays.sort(t); 
     582      Vector<Integer> tmpOffsets = new Vector<Integer>(); 
     583      Vector<String> tmpFiles = new Vector<String>(); 
     584      int index = 0; 
     585      for (Integer key : t) { 
     586        int nTiles = tiles.get(key).intValue(); 
     587        if (nTiles < getImageCount()) { 
     588          tiles.remove(key); 
     589        } 
     590        else { 
     591          for (int p=0; p<nTiles; p++) { 
     592            tmpOffsets.add(new Integer(offsets[index + p])); 
     593            tmpFiles.add(imageFiles[index + p]); 
     594          } 
     595        } 
     596        index += nTiles; 
     597      } 
     598 
     599      offsets = new int[tmpOffsets.size()]; 
     600      for (int i=0; i<offsets.length; i++) { 
     601        offsets[i] = tmpOffsets.get(i).intValue(); 
     602      } 
     603      imageFiles = tmpFiles.toArray(new String[tmpFiles.size()]); 
     604    } 
    599605 
    600606    int totalTiles = offsets.length / getImageCount(); 
Note: See TracChangeset for help on using the changeset viewer.