diff --git a/pom.xml b/pom.xml index 4b9c67f..ac8db6c 100644 --- a/pom.xml +++ b/pom.xml @@ -144,6 +144,7 @@ 0.8.1 0.7.3 + 8.0.0-SNAPSHOT @@ -166,6 +167,7 @@ ome formats-bsd + ${bf.version} @@ -183,6 +185,7 @@ ome formats-api + ${bf.version} @@ -200,6 +203,7 @@ ome formats-gpl + ${bf.version} diff --git a/src/main/java/ch/epfl/biop/bdv/img/pyramidize/PyramidizeSetupLoader.java b/src/main/java/ch/epfl/biop/bdv/img/pyramidize/PyramidizeSetupLoader.java index 154c236..0412546 100644 --- a/src/main/java/ch/epfl/biop/bdv/img/pyramidize/PyramidizeSetupLoader.java +++ b/src/main/java/ch/epfl/biop/bdv/img/pyramidize/PyramidizeSetupLoader.java @@ -101,70 +101,80 @@ protected PyramidizeSetupLoader(PyramidizeOpener opener, int channelIdx, int mmResolutions[iLevel][2] = 1; } + } - T t = (T) opener.getPixelType(); - - - PyramidizeArrayLoaders.PyramidizeArrayLoader loader; - if (t instanceof UnsignedByteType) { - loader = new PyramidizeArrayLoaders.PyramidizeByteArrayLoader(this); - } else if (t instanceof UnsignedShortType) { - loader = new PyramidizeArrayLoaders.PyramidizeShortArrayLoader(this); - } else if (t instanceof FloatType) { - loader = new PyramidizeArrayLoaders.PyramidizeFloatArrayLoader(this); - } else if (t instanceof IntType) { - loader = new PyramidizeArrayLoaders.PyramidizeIntArrayLoader(this); - } else if (t instanceof ARGBType) { - loader = new PyramidizeArrayLoaders.PyramidizeARGBArrayLoader(this); - } else { - throw new UnsupportedOperationException("Pixel type " + t.getClass() - .getName() + " unsupported in " + PyramidizeSetupLoader.class - .getName()); - } - - for (int tp = 0; tp< opener.getNTimePoints(); tp++) { - raiTL.add(new ArrayList<>()); - raiTLV.add(new ArrayList<>()); - - for (int level = 1; level< opener.nResolutionLevels; level++) { - int tileSizeLevel = tileSize(level); - final int[] cellDimensions = new int[]{ tileSizeLevel, tileSizeLevel, 1 }; - final RandomAccessibleInterval raiBelow; - if (level==1) { - raiBelow = getImage(tp,0); - } else { - raiBelow = raiTL.get(tp).get(level-2); - } - long[] newDimensions = new long[3]; - newDimensions[0] = raiBelow.dimensionsAsLongArray()[0]/2; - newDimensions[1] = raiBelow.dimensionsAsLongArray()[1]/2; - newDimensions[2] = raiBelow.dimensionsAsLongArray()[2]; - CellGrid grid = new CellGrid(newDimensions, cellDimensions); - - int priority = opener.nResolutionLevels - level; - CacheHints cacheHints = new CacheHints(LoadingStrategy.BLOCKING, - priority, false); - - raiTL.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level, - cacheHints, (CacheArrayLoader) loader, type)); - - priority = opener.nResolutionLevels - level; - cacheHints = new CacheHints(LoadingStrategy.BUDGETED, - priority, false); + volatile boolean hasBeenInitialised = false; + + void ensureInitialisation() { + // delayed initialisation to allow the override of the cache + if (hasBeenInitialised) return; + // here: not initialisation + synchronized (this) { + if (hasBeenInitialised) return; + + T t = (T) opener.getPixelType(); + + PyramidizeArrayLoaders.PyramidizeArrayLoader loader; + if (t instanceof UnsignedByteType) { + loader = new PyramidizeArrayLoaders.PyramidizeByteArrayLoader(this); + } else if (t instanceof UnsignedShortType) { + loader = new PyramidizeArrayLoaders.PyramidizeShortArrayLoader(this); + } else if (t instanceof FloatType) { + loader = new PyramidizeArrayLoaders.PyramidizeFloatArrayLoader(this); + } else if (t instanceof IntType) { + loader = new PyramidizeArrayLoaders.PyramidizeIntArrayLoader(this); + } else if (t instanceof ARGBType) { + loader = new PyramidizeArrayLoaders.PyramidizeARGBArrayLoader(this); + } else { + throw new UnsupportedOperationException("Pixel type " + t.getClass() + .getName() + " unsupported in " + PyramidizeSetupLoader.class + .getName()); + } - raiTLV.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level, - cacheHints, (CacheArrayLoader) loader, volatileType)); + for (int tp = 0; tp< opener.getNTimePoints(); tp++) { + raiTL.add(new ArrayList<>()); + raiTLV.add(new ArrayList<>()); + + for (int level = 1; level< opener.nResolutionLevels; level++) { + int tileSizeLevel = tileSize(level); + final int[] cellDimensions = new int[]{ tileSizeLevel, tileSizeLevel, 1 }; + final RandomAccessibleInterval raiBelow; + if (level==1) { + raiBelow = getImage(tp,0); + } else { + raiBelow = raiTL.get(tp).get(level-2); + } + long[] newDimensions = new long[3]; + newDimensions[0] = raiBelow.dimensionsAsLongArray()[0]/2; + newDimensions[1] = raiBelow.dimensionsAsLongArray()[1]/2; + newDimensions[2] = raiBelow.dimensionsAsLongArray()[2]; + CellGrid grid = new CellGrid(newDimensions, cellDimensions); + + int priority = opener.nResolutionLevels - level; + CacheHints cacheHints = new CacheHints(LoadingStrategy.BLOCKING, + priority, false); + + raiTL.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level, + cacheHints, (CacheArrayLoader) loader, type)); + + priority = opener.nResolutionLevels - level; + cacheHints = new CacheHints(LoadingStrategy.BUDGETED, + priority, false); + + raiTLV.get(tp).add(cacheSupplier.get().createImg(grid, tp, setup, level, + cacheHints, (CacheArrayLoader) loader, volatileType)); + } } + hasBeenInitialised = true; + loader.init(); } - - loader.init(); - } @Override public RandomAccessibleInterval getVolatileImage(int timepointId, int level, ImgLoaderHint... hints) { if (level == 0) return level0SetupLoader.getVolatileImage(timepointId, level, hints); + ensureInitialisation(); return raiTLV.get(timepointId).get(level-1); } @@ -176,6 +186,7 @@ public Dimensions getImageSize(int timepointId, int level) { @Override public RandomAccessibleInterval getImage(int timepointId, int level, ImgLoaderHint... hints) { if (level==0) return level0SetupLoader.getImage(timepointId, level, hints); + ensureInitialisation(); return raiTL.get(timepointId).get(level-1); }