diff --git a/components/formats-bsd/src/loci/formats/Memoizer.java b/components/formats-bsd/src/loci/formats/Memoizer.java index c085622f45d..b73f3e7fb4a 100644 --- a/components/formats-bsd/src/loci/formats/Memoizer.java +++ b/components/formats-bsd/src/loci/formats/Memoizer.java @@ -46,6 +46,8 @@ import loci.common.services.DependencyException; import loci.common.services.ServiceException; import loci.common.services.ServiceFactory; +import loci.formats.in.DynamicMetadataOptions; +import loci.formats.in.MetadataOptions; import loci.formats.meta.MetadataRetrieve; import loci.formats.meta.MetadataStore; import loci.formats.services.OMEXMLService; @@ -430,6 +432,7 @@ public void saveStop() throws IOException { */ public Memoizer() { this(DEFAULT_MINIMUM_ELAPSED); + configure(reader.getMetadataOptions()); } /** @@ -444,6 +447,7 @@ public Memoizer() { public Memoizer(long minimumElapsed) { this(minimumElapsed, null); this.doInPlaceCaching = true; + configure(reader.getMetadataOptions()); } /** @@ -462,6 +466,7 @@ public Memoizer(long minimumElapsed, File directory) { super(); this.minimumElapsed = minimumElapsed; this.directory = directory; + configure(reader.getMetadataOptions()); } /** @@ -474,6 +479,7 @@ public Memoizer(long minimumElapsed, File directory) { */ public Memoizer(IFormatReader r) { this(r, DEFAULT_MINIMUM_ELAPSED); + configure(reader.getMetadataOptions()); } /** @@ -490,6 +496,7 @@ public Memoizer(IFormatReader r) { public Memoizer(IFormatReader r, long minimumElapsed) { this(r, minimumElapsed, null); this.doInPlaceCaching = true; + configure(reader.getMetadataOptions()); } /** @@ -509,8 +516,57 @@ public Memoizer(IFormatReader r, long minimumElapsed, File directory) { super(r); this.minimumElapsed = minimumElapsed; this.directory = directory; + configure(reader.getMetadataOptions()); } + /** + * Used to inject all the properties necessary for {@link Memoizer} + * creation into {@link MetadataOptions}. This is called by every + * constructor so that {@link IFormatReader} instances created + * internally can also make use of memoization. + * + * @param options + */ + public void configure(MetadataOptions options) { + String k = Memoizer.class.getName(); + if (options instanceof DynamicMetadataOptions) { + ((DynamicMetadataOptions) options).setFile(k + ".cacheDirectory", this.directory); + ((DynamicMetadataOptions) options).setBoolean(k + ".inPlace", this.doInPlaceCaching); + ((DynamicMetadataOptions) options).setLong(k + ".minimumElapsed", this.minimumElapsed); + } + } + + /** + * If {@link MetadataOptions} have been configured per + * {@link #configure(MetadataOptions)}, then wrap the given + * {@link IFormatReader} with a {@link Memoizer} instance and return. + * Otherwise, return the {@link IFormatReader} unchanged. + * + * @param options If null, return the reader + * @param r + * @return Either a {@link Memoizer} or the {@link IFormatReader} argument. + */ + public static IFormatReader wrap(MetadataOptions options, IFormatReader r) { + if (options == null || !(options instanceof DynamicMetadataOptions)) { + return r; + } + String k = Memoizer.class.getName(); + Long elapsed = ((DynamicMetadataOptions) options).getLong(k + ".minimumElapsed"); + Boolean inplace = ((DynamicMetadataOptions) options).getBoolean(k + ".inPlace"); + File cachedir = ((DynamicMetadataOptions) options).getFile(k + ".cacheDirectory"); + if (elapsed == null || inplace == null) { + LOGGER.warn("config: memoizer options not found, reader will not be wrapped"); + return r; + } + if (inplace) { + return new Memoizer(r, elapsed); + } else if (cachedir != null) { + return new Memoizer(r, elapsed, cachedir); + } + else { + return r; + } + } /** * Returns whether the {@link #reader} instance currently active was loaded diff --git a/components/formats-bsd/src/loci/formats/in/DicomReader.java b/components/formats-bsd/src/loci/formats/in/DicomReader.java index db4ba98b2a3..e9061eddeec 100644 --- a/components/formats-bsd/src/loci/formats/in/DicomReader.java +++ b/components/formats-bsd/src/loci/formats/in/DicomReader.java @@ -53,6 +53,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.UnsupportedCompressionException; import loci.formats.codec.Codec; @@ -153,7 +155,7 @@ public class DicomReader extends FormatReader { private int originalSeries; private int originalX, originalY; - private DicomReader helper; + private IFormatReader helper; private List companionFiles = new ArrayList(); @@ -494,6 +496,7 @@ protected void initFile(String id) throws FormatException, IOException { attachCompanionFiles(); helper = new DicomReader(); + helper = Memoizer.wrap(getMetadataOptions(), helper); helper.setGroupFiles(false); m.littleEndian = true; diff --git a/components/formats-bsd/src/loci/formats/in/MicromanagerReader.java b/components/formats-bsd/src/loci/formats/in/MicromanagerReader.java index 94ad52798c5..0b744541c50 100644 --- a/components/formats-bsd/src/loci/formats/in/MicromanagerReader.java +++ b/components/formats-bsd/src/loci/formats/in/MicromanagerReader.java @@ -50,6 +50,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; @@ -99,7 +101,7 @@ public class MicromanagerReader extends FormatReader { // -- Fields -- /** Helper reader for TIFF files. */ - private MinimalTiffReader tiffReader; + private IFormatReader tiffReader; private Vector positions; private int start = 0; @@ -260,6 +262,7 @@ public int getOptimalTileHeight() { public void initFile(String id) throws FormatException, IOException { super.initFile(id); tiffReader = new MinimalTiffReader(); + tiffReader = Memoizer.wrap(getMetadataOptions(), tiffReader); positions = new Vector(); LOGGER.info("Reading metadata file"); diff --git a/components/formats-bsd/src/loci/formats/in/NRRDReader.java b/components/formats-bsd/src/loci/formats/in/NRRDReader.java index b414f42d2d6..164c713b5b5 100644 --- a/components/formats-bsd/src/loci/formats/in/NRRDReader.java +++ b/components/formats-bsd/src/loci/formats/in/NRRDReader.java @@ -48,6 +48,7 @@ import loci.formats.FormatTools; import loci.formats.IFormatReader; import loci.formats.ImageReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.UnknownFormatException; import loci.formats.UnsupportedCompressionException; @@ -67,7 +68,7 @@ public class NRRDReader extends FormatReader { // -- Fields -- /** Helper reader. */ - private ImageReader helper; + private IFormatReader helper; /** Name of data file, if the current extension is 'nhdr'. */ private String dataFile; @@ -259,6 +260,7 @@ protected void initFile(String id) throws FormatException, IOException { } } helper = new ImageReader(newClasses); + helper = Memoizer.wrap(getMetadataOptions(), helper); helper.setMetadataOptions( new DefaultMetadataOptions(MetadataLevel.MINIMUM)); diff --git a/components/formats-bsd/src/loci/formats/in/OMETiffReader.java b/components/formats-bsd/src/loci/formats/in/OMETiffReader.java index 7d726947ba9..d0815b0b5df 100644 --- a/components/formats-bsd/src/loci/formats/in/OMETiffReader.java +++ b/components/formats-bsd/src/loci/formats/in/OMETiffReader.java @@ -53,6 +53,7 @@ import loci.formats.FormatException; import loci.formats.FormatTools; import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.MissingLibraryException; import loci.formats.Modulo; @@ -548,6 +549,7 @@ protected void initFile(String id) throws FormatException, IOException { if (!isGroupFiles() && !isSingleFile(currentId)) { IFormatReader reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); initializeReader(reader, currentId); core.set(0, 0, new OMETiffCoreMetadata(reader.getCoreMetadataList().get(0))); int ifdCount = reader.getImageCount(); @@ -1021,6 +1023,7 @@ else if (t == 0) { } if (info[s][0].reader == null) { info[s][0].reader = new MinimalTiffReader(); + info[s][0].reader = Memoizer.wrap(getMetadataOptions(), info[s][0].reader); } String firstFile = info[s][0].id; if (firstFile == null || diff --git a/components/formats-bsd/src/loci/formats/in/ZipReader.java b/components/formats-bsd/src/loci/formats/in/ZipReader.java index dcbb8efc000..8a5ed9b5818 100644 --- a/components/formats-bsd/src/loci/formats/in/ZipReader.java +++ b/components/formats-bsd/src/loci/formats/in/ZipReader.java @@ -45,7 +45,9 @@ import loci.formats.CoreMetadata; import loci.formats.FormatException; import loci.formats.FormatReader; +import loci.formats.IFormatReader; import loci.formats.ImageReader; +import loci.formats.Memoizer; /** * Reader for Zip files. @@ -54,7 +56,7 @@ public class ZipReader extends FormatReader { // -- Fields -- - private transient ImageReader reader; + private transient IFormatReader reader; private String entryName; private ArrayList mappedFiles = new ArrayList(); @@ -125,6 +127,7 @@ public void reopenFile() throws IOException { } else { reader = new ImageReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); } findZipEntries(); } @@ -139,6 +142,7 @@ protected void initFile(String id) throws FormatException, IOException { reader.close(); } reader = new ImageReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); reader.setMetadataOptions(getMetadataOptions()); reader.setMetadataFiltered(isMetadataFiltered()); diff --git a/components/formats-gpl/src/loci/formats/in/BDReader.java b/components/formats-gpl/src/loci/formats/in/BDReader.java index 721b08445eb..b6f104bb484 100644 --- a/components/formats-gpl/src/loci/formats/in/BDReader.java +++ b/components/formats-gpl/src/loci/formats/in/BDReader.java @@ -48,6 +48,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; @@ -81,7 +83,7 @@ public class BDReader extends FormatReader { private List wellLabels = new ArrayList(); private String plateName, plateDescription; private String[][] tiffs; - private MinimalTiffReader reader; + private IFormatReader reader; private String roiFile; private double[] emWave, exWave; @@ -344,6 +346,7 @@ protected void initFile(String id) throws FormatException, IOException { tiffs = getTiffs(); reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); reader.setId(tiffs[0][0]); int sizeX = reader.getSizeX(); diff --git a/components/formats-gpl/src/loci/formats/in/CV7000Reader.java b/components/formats-gpl/src/loci/formats/in/CV7000Reader.java index 159b9c1d572..c228f71413c 100644 --- a/components/formats-gpl/src/loci/formats/in/CV7000Reader.java +++ b/components/formats-gpl/src/loci/formats/in/CV7000Reader.java @@ -42,6 +42,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; @@ -79,7 +81,7 @@ public class CV7000Reader extends FormatReader { private String[] allFiles; private Location parent; - private MinimalTiffReader reader; + private IFormatReader reader; private String wppPath; private String detailPath; private String measurementPath; @@ -334,6 +336,7 @@ protected void initFile(String id) throws FormatException, IOException { } reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); reader.setId(firstFile); core.clear(); core.add(new CoreMetadata(reader.getCoreMetadataList().get(0))); diff --git a/components/formats-gpl/src/loci/formats/in/CellSensReader.java b/components/formats-gpl/src/loci/formats/in/CellSensReader.java index c56f4df6bbc..f262166c945 100644 --- a/components/formats-gpl/src/loci/formats/in/CellSensReader.java +++ b/components/formats-gpl/src/loci/formats/in/CellSensReader.java @@ -42,6 +42,7 @@ import loci.formats.FormatReader; import loci.formats.FormatTools; import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.codec.Codec; import loci.formats.codec.CodecOptions; @@ -1076,12 +1077,13 @@ else if (dim.equals("T")) { case PNG: file = "tile.png"; reader = new APNGReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); case BMP: if (reader == null) { file = "tile.bmp"; reader = new BMPReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); } - byte[] b = new byte[(int) (end - offset)]; ets.read(b); Location.mapFile(file, new ByteArrayHandle(b)); diff --git a/components/formats-gpl/src/loci/formats/in/CellVoyagerReader.java b/components/formats-gpl/src/loci/formats/in/CellVoyagerReader.java index 889f352c00e..9a5cb8a4b17 100644 --- a/components/formats-gpl/src/loci/formats/in/CellVoyagerReader.java +++ b/components/formats-gpl/src/loci/formats/in/CellVoyagerReader.java @@ -44,6 +44,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.ome.OMEXMLMetadata; @@ -146,7 +148,7 @@ public byte[] openBytes( final int no, final byte[] buf, final int x, final int final int areaIndex = indices[ 1 ]; final WellInfo well = wells.get( wellIndex ); final AreaInfo area = well.areas.get( areaIndex ); - final MinimalTiffReader tiffReader = new MinimalTiffReader(); + final IFormatReader tiffReader = Memoizer.wrap(getMetadataOptions(), new MinimalTiffReader()); imageFolder = new Location(currentId).getAbsoluteFile().getParentFile(); imageFolder = new Location(imageFolder, "Image"); diff --git a/components/formats-gpl/src/loci/formats/in/CellWorxReader.java b/components/formats-gpl/src/loci/formats/in/CellWorxReader.java index 0585c31e76e..ae93d2db929 100644 --- a/components/formats-gpl/src/loci/formats/in/CellWorxReader.java +++ b/components/formats-gpl/src/loci/formats/in/CellWorxReader.java @@ -43,6 +43,7 @@ import loci.formats.FormatReader; import loci.formats.FormatTools; import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.IMetadata; import loci.formats.meta.MetadataStore; @@ -856,6 +857,7 @@ protected IFormatReader getReader(String file, boolean omexml) throws FormatException, IOException { IFormatReader pnl = new DeltavisionReader(); + pnl = Memoizer.wrap(getMetadataOptions(), pnl); initReader(pnl, file, omexml); return pnl; } diff --git a/components/formats-gpl/src/loci/formats/in/ColumbusReader.java b/components/formats-gpl/src/loci/formats/in/ColumbusReader.java index 8dd66d72d7e..73bbcdbb756 100644 --- a/components/formats-gpl/src/loci/formats/in/ColumbusReader.java +++ b/components/formats-gpl/src/loci/formats/in/ColumbusReader.java @@ -43,6 +43,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; @@ -80,7 +82,7 @@ public class ColumbusReader extends FormatReader { private ArrayList metadataFiles = new ArrayList(); private ArrayList planes = new ArrayList(); - private MinimalTiffReader reader; + private IFormatReader reader; private int nFields = 0; private String acquisitionDate; @@ -296,6 +298,7 @@ public int compare(Plane p1, Plane p2) { planes.clear(); reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); reader.setId(tmpPlanes[0].file); core = reader.getCoreMetadataList(); diff --git a/components/formats-gpl/src/loci/formats/in/HamamatsuVMSReader.java b/components/formats-gpl/src/loci/formats/in/HamamatsuVMSReader.java index 34fa3c0d0a8..8d43c159f63 100644 --- a/components/formats-gpl/src/loci/formats/in/HamamatsuVMSReader.java +++ b/components/formats-gpl/src/loci/formats/in/HamamatsuVMSReader.java @@ -43,6 +43,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.codec.JPEGTileDecoder; import loci.formats.meta.MetadataStore; @@ -148,7 +150,8 @@ public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) } if (getSizeX() <= MAX_SIZE || getSizeY() <= MAX_SIZE) { - JPEGReader reader = new JPEGReader(); + IFormatReader reader = new JPEGReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); reader.setId(file); reader.openBytes(0, buf, x, y, w, h); reader.close(); diff --git a/components/formats-gpl/src/loci/formats/in/InCellReader.java b/components/formats-gpl/src/loci/formats/in/InCellReader.java index c01ac6b0046..00b9860ddd1 100644 --- a/components/formats-gpl/src/loci/formats/in/InCellReader.java +++ b/components/formats-gpl/src/loci/formats/in/InCellReader.java @@ -41,6 +41,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.IMinMaxStore; import loci.formats.meta.MetadataStore; @@ -80,7 +82,7 @@ public class InCellReader extends FormatReader { private boolean[][] plateMap; private Image[][][][] imageFiles; - private MinimalTiffReader tiffReader; + private IFormatReader tiffReader; private List emWaves, exWaves; private List channelNames; private int totalImages; @@ -508,6 +510,7 @@ protected void initFile(String id) throws FormatException, IOException { if (isTiff && filename != null) { tiffReader = new MinimalTiffReader(); + tiffReader = Memoizer.wrap(getMetadataOptions(), tiffReader); tiffReader.setId(filename); for (int i=0; i[] metadataFiles; - private MinimalTiffReader reader; + private IFormatReader reader; private int[] tileWidth, tileHeight; // -- Constructor -- @@ -219,6 +221,7 @@ else if (!isGroupFiles()) { } r.close(); reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); return; } @@ -301,6 +304,7 @@ else if (key.equals("ScanChannels")) { setSeries(0); reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), reader); MetadataStore store = makeFilterMetadata(); diff --git a/components/formats-gpl/src/loci/formats/in/LeicaReader.java b/components/formats-gpl/src/loci/formats/in/LeicaReader.java index 2ec4d813d53..894f6f3e26c 100644 --- a/components/formats-gpl/src/loci/formats/in/LeicaReader.java +++ b/components/formats-gpl/src/loci/formats/in/LeicaReader.java @@ -44,6 +44,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; @@ -114,7 +116,7 @@ public class LeicaReader extends FormatReader { protected IFDList headerIFDs; /** Helper readers. */ - protected MinimalTiffReader tiff; + protected IFormatReader tiff; /** Array of image file names. */ protected List[] files; @@ -385,6 +387,7 @@ protected void initFile(String id) throws FormatException, IOException { files = new List[] {new ArrayList()}; files[0].add(id); tiff = new MinimalTiffReader(); + tiff = Memoizer.wrap(getMetadataOptions(), tiff); return; } @@ -539,6 +542,7 @@ protected void initFile(String id) throws FormatException, IOException { } tiff = new MinimalTiffReader(); + tiff = Memoizer.wrap(getMetadataOptions(), tiff); LOGGER.info("Populating metadata"); diff --git a/components/formats-gpl/src/loci/formats/in/MIASReader.java b/components/formats-gpl/src/loci/formats/in/MIASReader.java index fb525045c4c..8d0e8b57ee8 100644 --- a/components/formats-gpl/src/loci/formats/in/MIASReader.java +++ b/components/formats-gpl/src/loci/formats/in/MIASReader.java @@ -45,7 +45,9 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; import loci.formats.ImageTools; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.codec.BitWriter; import loci.formats.meta.MetadataStore; @@ -74,7 +76,7 @@ public class MIASReader extends FormatReader { private String[][] tiffs; /** Delegate readers. */ - private MinimalTiffReader[][] readers; + private IFormatReader[][] readers; /** Path to file containing analysis results for all plates. */ private String resultFile = null; @@ -320,8 +322,8 @@ public String[] getSeriesUsedFiles(boolean noPixels) { public void close(boolean fileOnly) throws IOException { super.close(fileOnly); if (readers != null) { - for (MinimalTiffReader[] images : readers) { - for (MinimalTiffReader r : images) { + for (IFormatReader[] images : readers) { + for (IFormatReader r : images) { if (r != null) r.close(fileOnly); } } @@ -424,7 +426,7 @@ protected void initFile(String id) throws FormatException, IOException { if (!isGroupFiles()) { tiffs = new String[][] {{id}}; readers = new MinimalTiffReader[1][1]; - readers[0][0] = new MinimalTiffReader(); + readers[0][0] = Memoizer.wrap(getMetadataOptions(), new MinimalTiffReader()); TiffReader r = new TiffReader(); r.setMetadataStore(getMetadataStore()); @@ -675,7 +677,7 @@ else if (block == 1) { LOGGER.debug("Well {} has {} files.", j, tiffFiles.length); readers[j] = new MinimalTiffReader[tiffFiles.length]; for (int k=0; k 0) { stkReaders[i][j].setMetadataOptions( new DefaultMetadataOptions(MetadataLevel.MINIMUM)); diff --git a/components/formats-gpl/src/loci/formats/in/NDPISReader.java b/components/formats-gpl/src/loci/formats/in/NDPISReader.java index 75502af856b..583396e0064 100644 --- a/components/formats-gpl/src/loci/formats/in/NDPISReader.java +++ b/components/formats-gpl/src/loci/formats/in/NDPISReader.java @@ -36,6 +36,8 @@ import loci.formats.CoreMetadata; import loci.formats.FormatException; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; @@ -57,7 +59,7 @@ public class NDPISReader extends FormatReader { // -- Fields -- private String[] ndpiFiles; - private ChannelSeparator[] readers; + private IFormatReader[] readers; private int[] bandUsed; private static final int TAG_CHANNEL = 65434; private static final int TAG_EMISSION_WAVELENGTH = 65451; @@ -144,7 +146,7 @@ public void close(boolean fileOnly) throws IOException { if (!fileOnly) { ndpiFiles = null; if (readers != null) { - for (ChannelSeparator reader : readers) { + for (IFormatReader reader : readers) { if (reader != null) { reader.close(); } @@ -180,13 +182,13 @@ protected void initFile(String id) throws FormatException, IOException { else if (key.startsWith("Image")) { int index = Integer.parseInt(key.replaceAll("Image", "")); ndpiFiles[index] = new Location(parent, value).getAbsolutePath(); - readers[index] = new ChannelSeparator(new NDPIReader()); + readers[index] = Memoizer.wrap(getMetadataOptions(), new ChannelSeparator(new NDPIReader())); readers[index].setFlattenedResolutions(hasFlattenedResolutions()); } } MetadataStore store = makeFilterMetadata(); - readers[0].getReader().setMetadataStore(store); + readers[0].setMetadataStore(store); readers[0].setId(ndpiFiles[0]); core = new ArrayList(readers[0].getCoreMetadataList()); diff --git a/components/formats-gpl/src/loci/formats/in/OpenlabReader.java b/components/formats-gpl/src/loci/formats/in/OpenlabReader.java index edfe7da01cf..ee0c3f8e0d5 100644 --- a/components/formats-gpl/src/loci/formats/in/OpenlabReader.java +++ b/components/formats-gpl/src/loci/formats/in/OpenlabReader.java @@ -38,6 +38,7 @@ import loci.formats.FormatReader; import loci.formats.FormatTools; import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.codec.CodecOptions; import loci.formats.codec.LZOCodec; @@ -87,7 +88,7 @@ public class OpenlabReader extends FormatReader { // -- Static fields -- /** Helper reader to read PICT data. */ - private PictReader pict = new PictReader(); + private IFormatReader pict = Memoizer.wrap(getMetadataOptions(), new PictReader()); // -- Fields -- diff --git a/components/formats-gpl/src/loci/formats/in/OperettaReader.java b/components/formats-gpl/src/loci/formats/in/OperettaReader.java index f50dc75f905..def9a312861 100644 --- a/components/formats-gpl/src/loci/formats/in/OperettaReader.java +++ b/components/formats-gpl/src/loci/formats/in/OperettaReader.java @@ -38,6 +38,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; @@ -72,7 +74,7 @@ public class OperettaReader extends FormatReader { // -- Fields -- private Plane[][] planes; - private MinimalTiffReader reader; + private IFormatReader reader; private ArrayList metadataFiles = new ArrayList(); // -- Constructor -- @@ -225,7 +227,7 @@ public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) if (p != null && p.filename != null && new Location(p.filename).exists()) { if (reader == null) { - reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), new MinimalTiffReader()); } reader.setId(p.filename); if (reader.getSizeX() >= getSizeX() && reader.getSizeY() >= getSizeY()) { @@ -405,7 +407,7 @@ protected void initFile(String id) throws FormatException, IOException { } } - reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), new MinimalTiffReader()); for (int i=0; i row2) { nPos = realPosCount; } - reader = new MinimalTiffReader(); + reader = Memoizer.wrap(getMetadataOptions(), new MinimalTiffReader()); for (String tiff : tiffs) { if (tiff != null) { reader.setId(tiff); diff --git a/components/formats-gpl/src/loci/formats/in/TCSReader.java b/components/formats-gpl/src/loci/formats/in/TCSReader.java index 951a5fe05d2..b07062fa907 100644 --- a/components/formats-gpl/src/loci/formats/in/TCSReader.java +++ b/components/formats-gpl/src/loci/formats/in/TCSReader.java @@ -42,6 +42,8 @@ import loci.formats.FormatException; import loci.formats.FormatReader; import loci.formats.FormatTools; +import loci.formats.IFormatReader; +import loci.formats.Memoizer; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; @@ -73,7 +75,7 @@ public class TCSReader extends FormatReader { private List tiffs; /** Helper readers. */ - private TiffReader[] tiffReaders; + private IFormatReader[] tiffReaders; private TiffParser tiffParser; @@ -224,7 +226,7 @@ public void close(boolean fileOnly) throws IOException { if (!fileOnly) { tiffs = null; if (tiffReaders != null) { - for (TiffReader r : tiffReaders) { + for (IFormatReader r : tiffReaders) { if (r != null) r.close(); } } @@ -282,7 +284,7 @@ else if (checkSuffix(file, TiffReader.TIFF_SUFFIXES) && isXML) { tiffReaders = new TiffReader[tiffs.size()]; for (int i=0; i planes; /** Helper reader for TIFF files. */ - private MinimalTiffReader tiffReader; + private IFormatReader tiffReader; private transient HashMap directoryCache = new HashMap(); @@ -451,7 +453,7 @@ else if (rawCount != nplanes) planes.add(np); if (bpp == 0) { tiffReader.setId(np.filename); - IFDList ifds = tiffReader.getIFDs(); + IFDList ifds = ((MinimalTiffReader)tiffReader).getIFDs(); tiffReader.close(); IFD firstIFD = ifds.get(0); int bits = firstIFD.getBitsPerSample()[0]; @@ -499,6 +501,8 @@ else if (rawCount != nplanes) int total = tileIndices.size() * channelIndices.size() * zIndices.size() * timepointIndices.size(); if(total != planes.size()) LOGGER.warn("Number of image planes not detected correctly: total={} planes.size={}", total, planes.size()); + + tiffReader = Memoizer.wrap(getMetadataOptions(), tiffReader); }