Changeset 2792


Ignore:
Timestamp:
05/16/07 12:35:44 (13 years ago)
Author:
melissa
Message:

Fixed bug with files that have metadata interleaved with pixel data.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/SlidebookReader.java

    r2701 r2792  
    4242 
    4343  /** Offset to pixel data. */ 
    44   private long offset = 1792; 
     44  private long offset = 256; 
    4545 
    4646  /** Number of bytes per pixel. */ 
    4747  private int bpp; 
     48 
     49  private int uCount = 0; 
     50  private int planeCount = 0; 
    4851 
    4952  // -- Constructor -- 
     
    8083    } 
    8184    in.seek(offset + (no * core.sizeX[0] * core.sizeY[0] * 2)); 
     85     
     86    uCount = 0; 
     87    long fp1 = in.getFilePointer(); 
     88    skipDataBlocks(planeCount); 
     89    long fp2 = in.getFilePointer(); 
     90    offset += fp2 - fp1; 
     91    if (fp2 - fp1 > 0) planeCount = 1;  
     92    else planeCount++;  
     93 
    8294    in.read(buf); 
    8395    return buf; 
     
    104116    core.littleEndian[0] = in.read() == 0x49; 
    105117 
    106     bpp = 2; // this is a major assumption 
     118    bpp = 2; 
    107119 
    108120    // check if there are multiple "series" - note that each series has the 
     
    230242    if (core.sizeT[0] == 0) core.sizeT[0] = 1; 
    231243 
     244    if (core.imageCount[0] == 0) { 
     245      core.imageCount[0] = core.sizeZ[0] * core.sizeT[0] * core.sizeZ[0]; 
     246    } 
     247 
     248    if (core.sizeX[0] * core.sizeY[0] * 2 * core.imageCount[0] > in.length()) { 
     249      core.sizeX[0] /= 2;  
     250      core.sizeY[0] /= 2;  
     251    } 
     252 
    232253    MetadataStore store = getMetadataStore(); 
    233254    store.setPixels(new Integer(core.sizeX[0]), new Integer(core.sizeY[0]), 
     
    240261  } 
    241262 
     263  // -- Helper methods -- 
     264 
     265  private void skipDataBlocks(int n) throws IOException { 
     266    long fp = in.getFilePointer(); 
     267   
     268    int type = in.read();  
     269    in.skipBytes(3); 
     270    int one = in.read(); 
     271    int two = in.read(); 
     272 
     273    if ((one == 0x49 && two == 0x49) || (one == 0x4d && two == 0x4d)) { 
     274      if (type == 0x69) in.skipBytes(122);    
     275      else if (type == 0x75 && uCount == n - 1) { 
     276        in.skipBytes(250); 
     277        int len = in.read(); 
     278        while (((byte) len) > 0) { 
     279          int oldLen = len;  
     280          in.skipBytes(len + 4); 
     281          len = in.read(); 
     282          in.skipBytes(len + 3); 
     283          len = in.read(); 
     284          if (in.read() != 0x43 && ((byte) len) > 0) {  
     285            in.skipBytes(len + 2); 
     286            len = in.read(); 
     287          } 
     288          else in.seek(in.getFilePointer() - 1);  
     289        } 
     290        in.seek(in.getFilePointer() - 1);  
     291      } 
     292      else if (type == 0x75) { 
     293        uCount++; 
     294        in.skipBytes(250);  
     295      }  
     296      else in.skipBytes(250);  
     297      skipDataBlocks(n);  
     298    } 
     299    else in.seek(fp); 
     300  } 
     301 
    242302} 
Note: See TracChangeset for help on using the changeset viewer.