Changeset 6096


Ignore:
Timestamp:
04/06/10 18:59:58 (10 years ago)
Author:
melissa
Message:

Moved plane index parsing; this substantially reduces parsing time.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/NativeND2Reader.java

    r6084 r6096  
    233233      // assemble offsets to each block 
    234234 
     235      Vector<String> imageNames = new Vector<String>(); 
    235236      Vector<Long> imageOffsets = new Vector<Long>(); 
    236237      Vector<int[]> imageLengths = new Vector<int[]>(); 
    237       Vector<Long> xmlOffsets = new Vector<Long>(); 
    238       Vector<int[]> xmlLengths = new Vector<int[]>(); 
    239238      Vector<Long> customDataOffsets = new Vector<Long>(); 
    240239      Vector<int[]> customDataLengths = new Vector<int[]>(); 
     240 
     241      ByteVector xml = new ByteVector(); 
     242      StringBuffer name = new StringBuffer(); 
    241243 
    242244      // search for blocks 
     
    261263        int skip = len - 12 - lenOne * 2; 
    262264        if (skip <= 0) skip += lenOne * 2; 
    263         in.skipBytes(skip); 
    264265 
    265266        if (blockType.startsWith("ImageDataSeq")) { 
    266267          imageOffsets.add(new Long(fp)); 
    267268          imageLengths.add(new int[] {lenOne, lenTwo}); 
     269          char b = (char) in.readByte(); 
     270          while (b != '!') { 
     271            name.append(b); 
     272            b = (char) in.readByte(); 
     273          } 
     274          imageNames.add(name.toString()); 
     275          name = name.delete(0, name.length()); 
    268276        } 
    269277        else if (blockType.startsWith("Image")) { 
    270           xmlOffsets.add(new Long(fp)); 
    271           xmlLengths.add(new int[] {lenOne, lenTwo}); 
    272         } 
    273         else if (blockType.startsWith("CustomData|A")) { 
    274           customDataOffsets.add(new Long(fp)); 
    275           customDataLengths.add(new int[] {lenOne, lenTwo}); 
    276         } 
    277         else if (blockType.startsWith("CustomData|Z")) { 
    278           int nDoubles = (lenOne + lenTwo) / 8; 
    279           zOffset = fp + 8 * (nDoubles - imageOffsets.size()); 
    280         } 
    281         else if (blockType.startsWith("CustomData|X")) { 
    282           int nDoubles = (lenOne + lenTwo) / 8; 
    283           xOffset = fp + 8 * (nDoubles - imageOffsets.size()); 
    284         } 
    285         else if (blockType.startsWith("CustomData|Y")) { 
    286           int nDoubles = (lenOne + lenTwo) / 8; 
    287           yOffset = fp + 8 * (nDoubles - imageOffsets.size()); 
    288         } 
     278          int length = lenOne + lenTwo - 12; 
     279          byte[] b = new byte[length]; 
     280          in.read(b); 
     281 
     282          // strip out invalid characters 
     283          int off = 0; 
     284          for (int j=0; j<length; j++) { 
     285            char c = (char) b[j]; 
     286            if ((off == 0 && c == '!') || c == 0) off = j + 1; 
     287            if (Character.isISOControl(c) || !Character.isDefined(c)) { 
     288              b[j] = (byte) ' '; 
     289            } 
     290          } 
     291 
     292          if (length - off >= 5 && b[off] == '<' && b[off + 1] == '?' && 
     293            b[off + 2] == 'x' && b[off + 3] == 'm' && b[off + 4] == 'l') 
     294          { 
     295            boolean endBracketFound = false; 
     296            while (!endBracketFound) { 
     297              if (b[off++] == '>') { 
     298                endBracketFound = true; 
     299              } 
     300            } 
     301            xml.add(b, off, b.length - off); 
     302          } 
     303          skip = 0; 
     304        } 
     305        else if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     306          if (blockType.startsWith("CustomData|A")) { 
     307            customDataOffsets.add(new Long(fp)); 
     308            customDataLengths.add(new int[] {lenOne, lenTwo}); 
     309          } 
     310          else if (blockType.startsWith("CustomData|Z")) { 
     311            int nDoubles = (lenOne + lenTwo) / 8; 
     312            zOffset = fp + 8 * (nDoubles - imageOffsets.size()); 
     313          } 
     314          else if (blockType.startsWith("CustomData|X")) { 
     315            int nDoubles = (lenOne + lenTwo) / 8; 
     316            xOffset = fp + 8 * (nDoubles - imageOffsets.size()); 
     317          } 
     318          else if (blockType.startsWith("CustomData|Y")) { 
     319            int nDoubles = (lenOne + lenTwo) / 8; 
     320            yOffset = fp + 8 * (nDoubles - imageOffsets.size()); 
     321          } 
     322        } 
     323        in.skipBytes(skip); 
    289324      } 
    290325 
     
    292327 
    293328      DefaultHandler handler = new ND2Handler(); 
    294       ByteVector xml = new ByteVector(); 
    295  
    296       for (int i=0; i<xmlOffsets.size(); i++) { 
    297         long offset = xmlOffsets.get(i).longValue(); 
    298         int[] p = xmlLengths.get(i); 
    299         int length = p[0] + p[1]; 
    300  
    301         byte[] b = new byte[length]; 
    302         in.seek(offset); 
    303         in.read(b); 
    304  
    305         // strip out invalid characters 
    306         int off = 0; 
    307         for (int j=0; j<length; j++) { 
    308           char c = (char) b[j]; 
    309           if ((off == 0 && c == '!') || c == 0) off = j + 1; 
    310           if (Character.isISOControl(c) || !Character.isDefined(c)) { 
    311             b[j] = (byte) ' '; 
    312           } 
    313         } 
    314  
    315         if (length - off >= 5 && b[off] == '<' && b[off + 1] == '?' && 
    316           b[off + 2] == 'x' && b[off + 3] == 'm' && b[off + 4] == 'l') 
    317         { 
    318           boolean endBracketFound = false; 
    319           while (!endBracketFound) { 
    320             if (b[off++] == '>') { 
    321               endBracketFound = true; 
    322             } 
    323           } 
    324           xml.add(b, off, b.length - off); 
    325         } 
    326       } 
    327329 
    328330      String xmlString = new String(xml.toByteArray()); 
     
    432434        int length = p[0] + p[1]; 
    433435 
    434         in.seek(offset); 
    435         byte[] b = new byte[p[0]]; 
    436         in.read(b); 
    437  
    438         StringBuffer sb = new StringBuffer(); 
    439         int pt = 13; 
    440         while (b[pt] != '!') { 
    441           sb.append((char) b[pt++]); 
    442         } 
    443         b = null; 
    444         int ndx = Integer.parseInt(sb.toString()); 
    445  
    446436        if (getSizeC() == 0) { 
    447437          int sizeC = length / (getSizeX() * getSizeY() * 
     
    451441          } 
    452442        } 
     443 
     444        String imageName = imageNames.get(i); 
     445        int ndx = Integer.parseInt(imageName.replaceAll("\\D", "")); 
    453446 
    454447        int[] pos = FormatTools.rasterToPosition(lengths, ndx); 
Note: See TracChangeset for help on using the changeset viewer.