Changeset 5686


Ignore:
Timestamp:
11/14/09 13:37:04 (10 years ago)
Author:
melissa
Message:

Tiling fixes.

Files:
2 edited

Legend:

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

    r5679 r5686  
    9797  private Vector<RandomAccessInputStream> tagsToParse; 
    9898  private int nextEmWave = 0, nextExWave = 0, nextChName = 0; 
    99   private double stageX = 0, stageY = 0; 
     99  private float stageX = 0, stageY = 0; 
    100100 
    101101  private int[] channelColors; 
     
    232232      int colOffset = 0; 
    233233 
    234       int count = 1; 
    235       String dimOrder = getDimensionOrder(); 
    236       for (int i=2; i<dimOrder.length(); i++) { 
    237         if (dimOrder.charAt(i) == 'Z') { 
    238           count *= getSizeZ(); 
    239         } 
    240         else if (dimOrder.charAt(i) == 'T') { 
    241           count *= getSizeT(); 
    242         } 
    243         else if (dimOrder.charAt(i) == 'C') { 
    244           count *= getEffectiveSizeC(); 
    245           break; 
    246         } 
    247       } 
    248       int firstTile = (no / count) * count * tileRows * tileColumns + 
    249         (no % count); 
     234      int count = getImageCount(); 
    250235 
    251236      byte[] tile = new byte[tileWidth * tileHeight * pixel]; 
     237 
     238      int channel = no % getEffectiveSizeC(); 
     239      int plane = (no / getEffectiveSizeC()) * getEffectiveSizeC(); 
     240      int scale = plane * tileRows * tileColumns + channel; 
     241      int firstTile = 
     242        firstImageTile == null ? 0 : Integer.parseInt(firstImageTile); 
     243      int prevIndex = -1; 
    252244 
    253245      for (int row=0; row<tileRows; row++) { 
     
    255247          int rowIndex = row * tileHeight; 
    256248          int colIndex = col * tileWidth; 
     249 
    257250          int tileIndex = row * tileColumns + col; 
    258251 
     
    272265 
    273266              int ii = row*tileColumns + col; 
    274               if (((row % 2) == 1 && getRGBChannelCount() == 1) || 
    275                 ((row % 2) == 0 && getRGBChannelCount() > 1)) 
    276               { 
     267              if (((row % 2) == 1 && getRGBChannelCount() == 1)) { 
    277268                ii = row*tileColumns + (tileColumns - col - 1); 
    278                 tileIndex = row * tileColumns + (tileColumns - col - 1); 
     269                tileIndex -= col; 
     270                tileIndex += (tileColumns - col - 1); 
     271              } 
     272              else if (getRGBChannelCount() > 1) { 
     273                ii = (tileRows - row - 1) * tileColumns + 1; 
     274                if ((row % 2) == 0) { 
     275                  ii += col; 
     276                } 
     277                else { 
     278                  ii += (tileColumns - col - 1); 
     279                } 
     280                tileIndex = 0; 
    279281              } 
    280282              Integer tileCount = tiles.get(new Integer(ii)); 
    281               boolean valid = tileCount != null && tileCount.intValue() > no; 
     283              boolean valid = tileCount != null; 
    282284              if (!valid) { 
    283285                colOffset += tileW; 
     
    286288                  rowOffset += tileH; 
    287289                } 
    288                 firstTile -= getImageCount(); 
    289290                continue; 
    290291              } 
    291               int p = ii; 
    292               for (int n=0; n<p; n++) { 
    293                 if (tiles.containsKey(new Integer(n))) { 
    294                   ii += tiles.get(new Integer(n)).intValue(); 
     292              if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     293                int p = ii; 
     294                for (int n=0; n<p; n++) { 
     295                  if (tiles.containsKey(new Integer(n))) { 
     296                    ii += tiles.get(new Integer(n)).intValue(); 
     297                  } 
    295298                } 
    296299              } 
    297               if (firstTile > 0) ii += firstTile; 
    298               ii -= tileIndex; 
    299               ii += no; 
     300              ii *= getEffectiveSizeC(); 
     301              if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     302                ii -= tileIndex; 
     303              } 
     304              else if (getEffectiveSizeC() > 1) { 
     305                ii += scale; 
     306              } 
     307              if (getImageCount() == 1) ii -= firstTile; 
     308              if (getEffectiveSizeC() == 1) ii += no; 
     309 
     310              if (ii < 0) { 
     311                if (prevIndex < 0) ii = no; 
     312                else { 
     313                  ii = prevIndex + getImageCount(); 
     314                } 
     315              } 
    300316 
    301317              if (ii >= imageFiles.length) { 
     
    307323                continue; 
    308324              } 
     325              if (((row % 2) == 1 && getRGBChannelCount() == 1) || 
     326                ((row % 2) == 0 && getRGBChannelCount() > 1)) 
     327              { 
     328                tileIndex -= (tileColumns - col - 1); 
     329                tileIndex += col; 
     330              } 
     331              prevIndex = ii; 
    309332              RandomAccessInputStream s = poi.getDocumentStream(imageFiles[ii]); 
    310333              s.seek(offsets[ii]); 
     
    550573 
    551574    // 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()]); 
     599 
    552600    int totalTiles = offsets.length / getImageCount(); 
    553601 
     
    575623      core[0].sizeY = tileHeight * tileRows; 
    576624    } 
     625 
    577626 
    578627    core[0].dimensionOrder = "XY"; 
     
    839888          if (cIndex != -1) { 
    840889            try { 
    841               float exp = Float.parseFloat(value) / 1000; 
     890              double exp = Double.parseDouble(value) / 1000; 
    842891              exposureTime.put(new Integer(cIndex), String.valueOf(exp)); 
    843892            } 
  • trunk/components/bio-formats/src/loci/formats/in/ZeissZVIReader.java

    r5679 r5686  
    232232      int colOffset = 0; 
    233233 
    234       int count = 1; 
    235       String dimOrder = getDimensionOrder(); 
    236       for (int i=2; i<dimOrder.length(); i++) { 
    237         if (dimOrder.charAt(i) == 'Z') { 
    238           count *= getSizeZ(); 
    239         } 
    240         else if (dimOrder.charAt(i) == 'T') { 
    241           count *= getSizeT(); 
    242         } 
    243         else if (dimOrder.charAt(i) == 'C') { 
    244           count *= getEffectiveSizeC(); 
    245           break; 
    246         } 
    247       } 
    248       int firstTile = (no / count) * count * tileRows * tileColumns + 
    249         (no % count); 
     234      int count = getImageCount(); 
    250235 
    251236      byte[] tile = new byte[tileWidth * tileHeight * pixel]; 
     237 
     238      int channel = no % getEffectiveSizeC(); 
     239      int plane = (no / getEffectiveSizeC()) * getEffectiveSizeC(); 
     240      int scale = plane * tileRows * tileColumns + channel; 
     241      int firstTile = 
     242        firstImageTile == null ? 0 : Integer.parseInt(firstImageTile); 
     243      int prevIndex = -1; 
    252244 
    253245      for (int row=0; row<tileRows; row++) { 
     
    255247          int rowIndex = row * tileHeight; 
    256248          int colIndex = col * tileWidth; 
     249 
    257250          int tileIndex = row * tileColumns + col; 
    258251 
     
    272265 
    273266              int ii = row*tileColumns + col; 
    274               if (((row % 2) == 1 && getRGBChannelCount() == 1) || 
    275                 ((row % 2) == 0 && getRGBChannelCount() > 1)) 
    276               { 
     267              if (((row % 2) == 1 && getRGBChannelCount() == 1)) { 
    277268                ii = row*tileColumns + (tileColumns - col - 1); 
    278                 tileIndex = row * tileColumns + (tileColumns - col - 1); 
     269                tileIndex -= col; 
     270                tileIndex += (tileColumns - col - 1); 
     271              } 
     272              else if (getRGBChannelCount() > 1) { 
     273                ii = (tileRows - row - 1) * tileColumns + 1; 
     274                if ((row % 2) == 0) { 
     275                  ii += col; 
     276                } 
     277                else { 
     278                  ii += (tileColumns - col - 1); 
     279                } 
     280                tileIndex = 0; 
    279281              } 
    280282              Integer tileCount = tiles.get(new Integer(ii)); 
    281               boolean valid = tileCount != null && tileCount.intValue() > no; 
     283              boolean valid = tileCount != null; 
    282284              if (!valid) { 
    283285                colOffset += tileW; 
     
    286288                  rowOffset += tileH; 
    287289                } 
    288                 firstTile -= getImageCount(); 
    289290                continue; 
    290291              } 
    291               int p = ii; 
    292               for (int n=0; n<p; n++) { 
    293                 if (tiles.containsKey(new Integer(n))) { 
    294                   ii += tiles.get(new Integer(n)).intValue(); 
     292              if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     293                int p = ii; 
     294                for (int n=0; n<p; n++) { 
     295                  if (tiles.containsKey(new Integer(n))) { 
     296                    ii += tiles.get(new Integer(n)).intValue(); 
     297                  } 
    295298                } 
    296299              } 
    297               if (firstTile > 0) ii += firstTile; 
    298               ii -= tileIndex; 
    299               ii += no; 
     300              ii *= getEffectiveSizeC(); 
     301              if (getImageCount() > 1 && getEffectiveSizeC() == 1) { 
     302                ii -= tileIndex; 
     303              } 
     304              else if (getEffectiveSizeC() > 1) { 
     305                ii += scale; 
     306              } 
     307              if (getImageCount() == 1) ii -= firstTile; 
     308              if (getEffectiveSizeC() == 1) ii += no; 
     309 
     310              if (ii < 0) { 
     311                if (prevIndex < 0) ii = no; 
     312                else { 
     313                  ii = prevIndex + getImageCount(); 
     314                } 
     315              } 
    300316 
    301317              if (ii >= imageFiles.length) { 
     
    307323                continue; 
    308324              } 
     325              if (((row % 2) == 1 && getRGBChannelCount() == 1) || 
     326                ((row % 2) == 0 && getRGBChannelCount() > 1)) 
     327              { 
     328                tileIndex -= (tileColumns - col - 1); 
     329                tileIndex += col; 
     330              } 
     331              prevIndex = ii; 
    309332              RandomAccessInputStream s = poi.getDocumentStream(imageFiles[ii]); 
    310333              s.seek(offsets[ii]); 
     
    550573 
    551574    // 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()]); 
     599 
    552600    int totalTiles = offsets.length / getImageCount(); 
    553601 
     
    575623      core[0].sizeY = tileHeight * tileRows; 
    576624    } 
     625 
    577626 
    578627    core[0].dimensionOrder = "XY"; 
Note: See TracChangeset for help on using the changeset viewer.