Changeset 3848


Ignore:
Timestamp:
03/26/08 14:13:55 (12 years ago)
Author:
melissa
Message:

Big-endian Slidebook files are now supported.

File:
1 edited

Legend:

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

    r3757 r3848  
    103103    super.initFile(id); 
    104104    in = new RandomAccessStream(id); 
    105     in.order(true); 
    106105 
    107106    status("Finding offsets to pixel data"); 
     
    109108    in.skipBytes(4); 
    110109    core.littleEndian[0] = in.read() == 0x49; 
     110    in.order(core.littleEndian[0]); 
    111111 
    112112    metadataOffsets = new Vector(); 
     
    120120      int checkOne = in.read(); 
    121121      int checkTwo = in.read(); 
    122       if (checkOne == 'I' && checkTwo == 'I') { 
     122      if ((checkOne == 'I' && checkTwo == 'I') || 
     123        (checkOne == 'M' && checkTwo == 'M')) 
     124      { 
    123125        metadataOffsets.add(new Long(in.getFilePointer() - 6)); 
    124         if (in.read() == 0) in.skipBytes(249); 
    125         else in.skipBytes(121); 
     126        in.skipBytes(in.readShort() - 8); 
    126127      } 
    127128      else { 
     
    172173            while (!found && in.getFilePointer() < in.length()) { 
    173174              for (int i=0; i<buf.length-6; i++) { 
    174                 if (buf[i] == 'h' && buf[i+4] == 'I' && buf[i+5] == 'I') { 
     175                if ((buf[i] == 'h' && buf[i+4] == 'I' && buf[i+5] == 'I') || 
     176                  (buf[i+1] == 'h' && buf[i+4] == 'M' && buf[i+5] == 'M')) 
     177                { 
    175178                  found = true; 
    176179                  in.seek(in.getFilePointer() - n + i - 20); 
     
    198201    } 
    199202 
    200     core = new CoreMetadata(pixelOffsets.size() - 1); 
     203    for (int i=0; i<pixelOffsets.size(); i++) { 
     204      long length = ((Long) pixelLengths.get(i)).longValue(); 
     205      long offset = ((Long) pixelOffsets.get(i)).longValue(); 
     206      in.seek(offset); 
     207      byte checkByte = in.readByte(); 
     208      if (length + offset >= in.length()) { 
     209        pixelOffsets.remove(i); 
     210        pixelLengths.remove(i); 
     211        i--; 
     212      } 
     213      else if (checkByte == 'l') { 
     214        long lengthSum = ((Long) pixelLengths.get(0)).longValue(); 
     215        while (pixelLengths.size() > 1) { 
     216          int size = pixelLengths.size() - 1; 
     217          lengthSum += ((Long) pixelLengths.get(size)).longValue(); 
     218          pixelLengths.remove(size); 
     219          pixelOffsets.remove(size); 
     220        } 
     221 
     222        for (int q=0; q<metadataOffsets.size(); q++) { 
     223          long mOffset = ((Long) metadataOffsets.get(q)).longValue(); 
     224          if (mOffset > lengthSum) { 
     225            lengthSum = mOffset - offset; 
     226            break; 
     227          } 
     228        } 
     229 
     230        pixelLengths.setElementAt(new Long(lengthSum), 0); 
     231        break; 
     232      } 
     233    } 
     234 
     235    if (pixelOffsets.size() > 1) { 
     236      core = new CoreMetadata(pixelOffsets.size()); 
     237    } 
    201238 
    202239    status("Determining dimensions"); 
     
    218255      long off = ((Long) metadataOffsets.get(i)).longValue(); 
    219256      in.seek(off); 
    220       int n = in.read(); 
     257      char n = (char) in.readShort(); 
    221258      if (n == 'i') { 
    222259        iCount++; 
    223260        in.skipBytes(81); 
    224         for (int j=1; j<pixelOffsets.size(); j++) { 
    225           if ((in.getFilePointer() < 
    226             ((Long) pixelOffsets.get(j)).longValue()) || 
    227             (j == pixelOffsets.size() - 1)) 
     261        int start = 0; 
     262        for (int j=start; j<pixelOffsets.size(); j++) { 
     263          long length = ((Long) pixelLengths.get(j)).longValue(); 
     264          long offset = ((Long) pixelOffsets.get(j)).longValue(); 
     265          long end = j == pixelOffsets.size() - 1 ? in.length() : 
     266            ((Long) pixelOffsets.get(j + 1)).longValue(); 
     267          if (in.getFilePointer() >= (length + offset) && 
     268            in.getFilePointer() < end) 
    228269          { 
    229             core.sizeY[j - 1] = in.readShort(); 
    230             int div = (int) Math.pow(2, in.readShort() & 1); 
    231             if (div < core.sizeY[j - 1]) { 
    232               core.sizeY[j - 1] /= div; 
    233             } 
    234             if (prevSeries != j - 1) { 
     270            if ((in.getFilePointer() % 2) == 1) { 
     271              in.seek(in.getFilePointer() - 1); 
     272            } 
     273            if (core.sizeY[j - start] == 0) { 
     274              core.sizeY[j - start] = in.readShort(); 
     275              if (core.sizeY[j - start] < 256 && core.sizeY[j - start] != 128) { 
     276                in.seek(in.getFilePointer() - 3); 
     277                core.sizeY[j - start] = in.readShort(); 
     278              } 
     279              else if ((core.sizeY[j - start] % 8) != 0) { 
     280                in.skipBytes(2); 
     281                core.sizeY[j - start] = in.readShort(); 
     282              } 
     283              int div = (int) Math.pow(2, in.readShort() & 1); 
     284              if (div < core.sizeY[j - start]) { 
     285                core.sizeY[j - start] /= div; 
     286              } 
     287            } 
     288            if (prevSeries != j - start) { 
    235289              iCount = 1; 
    236290            } 
    237             prevSeries = j - 1; 
    238             core.sizeC[j - 1] = iCount; 
     291            prevSeries = j - start; 
     292            core.sizeC[j - start] = iCount; 
    239293            break; 
    240294          } 
     
    243297      else if (n == 'u') { 
    244298        uCount++; 
    245         for (int j=1; j<pixelOffsets.size(); j++) { 
    246           if ((in.getFilePointer() < 
    247             ((Long) pixelOffsets.get(j)).longValue()) || 
    248             (j == pixelOffsets.size() - 1)) 
     299        int start = 0; 
     300        for (int j=start; j<pixelOffsets.size(); j++) { 
     301          long length = ((Long) pixelLengths.get(j)).longValue(); 
     302          long offset = ((Long) pixelOffsets.get(j)).longValue(); 
     303          long end = j == pixelOffsets.size() - 1 ? in.length() : 
     304            ((Long) pixelOffsets.get(j + 1)).longValue(); 
     305          if (in.getFilePointer() >= (length + offset) && 
     306            in.getFilePointer() < end) 
    249307          { 
    250             if (prevSeriesU != j - 1) { 
     308            if (prevSeriesU != j - start) { 
    251309              uCount = 1; 
    252310            } 
    253             prevSeriesU = j - 1; 
    254             core.sizeT[j - 1] = uCount; 
     311            prevSeriesU = j - start; 
     312            core.sizeT[j - start] = uCount; 
    255313            break; 
    256314          } 
     
    263321      long pixels = ((Long) pixelLengths.get(i)).longValue() / 2; 
    264322      core.sizeZ[i] = 1; 
     323      if (core.sizeT[i] == 0) core.sizeT[i] = 1; 
    265324      core.imageCount[i] = core.sizeZ[i] * core.sizeT[i] * core.sizeC[i]; 
    266325      core.sizeX[i] = (int) (pixels / (core.imageCount[i] * core.sizeY[i])); 
     
    281340      store.setImageCreationDate( 
    282341        DataTools.convertDate(System.currentTimeMillis(), DataTools.UNIX), i); 
    283       // CTR CHECK 
    284 //      for (int j=0; j<core.sizeC[i]; j++) { 
    285 //        store.setLogicalChannel(j, null, null, null, null, null, null, null, 
    286 //          null, null, null, null, null, null, null, null, null, null, null, 
    287 //          null, null, null, null, null, ii); 
    288 //      } 
    289342    } 
    290343  } 
Note: See TracChangeset for help on using the changeset viewer.