/* * Copyright (C) 2015 Patryk Strach * * This file is part of Virtual Slide Viewer. * * Virtual Slide Viewer is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later version. * * Virtual Slide Viewer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with Virtual Slide Viewer. * If not, see <http://www.gnu.org/licenses/>. */ package virtualslideviewer.bioformats; import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import loci.formats.IFormatReader; import loci.formats.in.OMETiffReader; import loci.formats.meta.IMetadata; import virtualslideviewer.UncheckedInterruptedException; public class OmeTiffLoader extends BioformatsLoader { public OmeTiffLoader(PaddingCalculator paddingCalculator) { super(paddingCalculator); } @Override public boolean canLoad(Path filePath) { try(IFormatReader reader = new OMETiffReader()) { return reader.isThisType(filePath.toString()); } catch(IOException e) { return false; } } @Override protected void loadImages(BioformatsVirtualSlide slide, ReaderPool readerPool) throws UncheckedInterruptedException { IFormatReader reader = readerPool.borrow(); try { List<Integer> seriesResolutionCount = getSeriesResolutionCount(slide.getBioformatsMetadata()); int readerSeriesIndex = 0; for(int seriesIndex = 0; seriesIndex < seriesResolutionCount.size(); seriesIndex++) { reader.setSeries(readerSeriesIndex); String imageName = slide.getBioformatsMetadata().getImageName(readerSeriesIndex); int resCount = seriesResolutionCount.get(seriesIndex); OmeTiffVirtualSlideImage image = new OmeTiffVirtualSlideImage(imageName, readerSeriesIndex, resCount, readerPool); computePaddingForEveryResolutionOfImage(image); slide.addImage(seriesIndex, image); readerSeriesIndex += seriesResolutionCount.get(seriesIndex); } } finally { readerPool.putBack(reader); } } private List<Integer> getSeriesResolutionCount(IMetadata metadata) { String lowerResolutionTagID = getLowerResolutionTagID(metadata); List<Integer> seriesResolutionCount = new ArrayList<>(); for(int i = 0; i < metadata.getImageCount() ;++i) { if(isLowerResolution(metadata, i, lowerResolutionTagID)) { int currentResolutionCount = seriesResolutionCount.get(seriesResolutionCount.size() - 1); seriesResolutionCount.set(seriesResolutionCount.size() - 1, currentResolutionCount + 1); } else { seriesResolutionCount.add(1); } } return seriesResolutionCount; } private String getLowerResolutionTagID(IMetadata metadata) { int lowerResolutionTagIndex = MetadataConstructor.getLowerResolutionTagIndex(metadata); return (lowerResolutionTagIndex != -1) ? metadata.getTagAnnotationID(lowerResolutionTagIndex) : null; } private boolean isLowerResolution(IMetadata metadata, int imageIndex, String lowerResolutionTagID) { if(lowerResolutionTagID == null) return false; for(int annotationIndex = 0; annotationIndex < metadata.getImageAnnotationRefCount(imageIndex) ;++annotationIndex) { String annotationID = metadata.getImageAnnotationRef(imageIndex, annotationIndex); if(annotationID.equals(lowerResolutionTagID)) { return true; } } return false; } }