Changeset 7458


Ignore:
Timestamp:
12/24/10 11:54:38 (9 years ago)
Author:
melissa
Message:

A few small speed improvements for reading Openlab files.

File:
1 edited

Legend:

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

    r7433 r7458  
    155155    long first = planeInfo.planeOffset; 
    156156    long last = first + FormatTools.getPlaneSize(this) * 2; 
    157     in.seek(first); 
    158157 
    159158    int bpp = FormatTools.getBytesPerPixel(getPixelType()); 
     
    161160    if (!planeInfo.pict) { 
    162161      if (version == 2) { 
     162        in.seek(first); 
    163163        readPlane(in, x, y, w, h, buf); 
    164164      } 
    165165      else { 
    166         in.skipBytes(16); 
     166        in.seek(first + 16); 
    167167        int bytes = bpp * getRGBChannelCount(); 
    168168        byte[] b = new byte[(int) (last - first)]; 
     
    204204    else { 
    205205      // PICT plane 
    206       byte[] b = new byte[(int) (last - first) + 512]; 
    207       in.read(b, 512, b.length - 512); 
    208206      Exception exc = null; 
    209       IFormatReader r = 
    210         getRGBChannelCount() == 1 ? new ChannelSeparator(pict) : pict; 
    211       try { 
    212         Location.mapFile("OPENLAB_PICT", new ByteArrayHandle(b)); 
    213         r.setId("OPENLAB_PICT"); 
    214  
    215         if (getPixelType() != pict.getPixelType()) { 
    216           throw new FormatException("Pixel type of inner PICT does not match " + 
    217             "pixel type of Openlab file"); 
    218         } 
    219  
    220         if (isIndexed()) { 
    221           luts.setElementAt(pict.get8BitLookupTable(), 
    222             planeOffsets[series][lastPlane]); 
    223         } 
    224  
    225         r.openBytes(0, buf, x, y, w, h); 
    226         r.close(); 
    227         // remove file from map 
    228         Location.mapFile("OPENLAB_PICT", null); 
    229       } 
    230       catch (FormatException e) { exc = e; } 
    231       catch (IOException e) { exc = e; } 
    232       b = null; 
    233  
    234       if (exc != null) { 
    235         r.close(); 
     207      if (getPixelType() == FormatTools.UINT8) { 
     208        in.seek(first); 
     209        byte[] b = new byte[(int) (last - first) + 512]; 
     210        in.read(b, 512, b.length - 512); 
     211 
     212        IFormatReader r = 
     213          getRGBChannelCount() == 1 ? new ChannelSeparator(pict) : pict; 
     214        try { 
     215          Location.mapFile("OPENLAB_PICT", new ByteArrayHandle(b)); 
     216          r.setId("OPENLAB_PICT"); 
     217 
     218          if (getPixelType() != r.getPixelType()) { 
     219            throw new FormatException("Pixel type of inner PICT does not " + 
     220              "match pixel type of Openlab file"); 
     221          } 
     222 
     223          if (isIndexed()) { 
     224            luts.setElementAt(pict.get8BitLookupTable(), 
     225              planeOffsets[series][lastPlane]); 
     226          } 
     227 
     228          r.openBytes(0, buf, x, y, w, h); 
     229        } 
     230        catch (FormatException e) { exc = e; } 
     231        catch (IOException e) { exc = e; } 
     232        finally { 
     233          r.close(); 
     234          // remove file from map 
     235          Location.mapFile("OPENLAB_PICT", null); 
     236        } 
     237        b = null; 
     238      } 
     239      if (exc != null || getPixelType() != FormatTools.UINT8) { 
    236240        LOGGER.debug("", exc); 
    237241        in.seek(planeInfo.planeOffset - 298); 
    238242 
    239         if (in.readByte() == 1) in.skipBytes(128); 
    240         in.skipBytes(169); 
     243        if (in.readByte() == 1) in.skipBytes(297); 
     244        else in.skipBytes(169); 
    241245 
    242246        int size = 0, expectedBlock = 0, totalBlocks = -1, pixPos = 0; 
     
    244248        byte[] plane = new byte[FormatTools.getPlaneSize(this)]; 
    245249 
    246         while (expectedBlock != totalBlocks && 
    247           in.getFilePointer() + 32 < in.length()) 
     250        while (expectedBlock != totalBlocks && pixPos < plane.length && 
     251          in.getFilePointer() + 32 < last) 
    248252        { 
    249           while (in.readLong() != 0x4956454164627071L && 
    250             in.getFilePointer() < in.length()) 
    251           { 
    252             in.seek(in.getFilePointer() - 7); 
    253           } 
     253          findNextBlock(); 
    254254 
    255255          if (in.getFilePointer() + 4 >= in.length()) break; 
     
    261261 
    262262          expectedBlock++; 
    263           if (totalBlocks == -1) totalBlocks = in.readInt(); 
    264           else in.skipBytes(4); 
    265  
    266           in.skipBytes(8); 
     263          if (totalBlocks == -1) { 
     264            totalBlocks = in.readInt(); 
     265            in.skipBytes(8); 
     266          } 
     267          else in.skipBytes(12); 
     268 
    267269          size = in.readInt(); 
    268270          in.skipBytes(4); 
     
    274276        } 
    275277 
    276         int srcRow = getSizeX() * bpp * getRGBChannelCount(); 
    277         int rowLen = w * bpp * getRGBChannelCount(); 
    278         for (int row=0; row<h; row++) { 
    279           System.arraycopy(plane, (row + y) * srcRow + 
    280             x * bpp * getRGBChannelCount(), buf, row*rowLen, rowLen); 
    281         } 
     278        RandomAccessInputStream pix = new RandomAccessInputStream(plane); 
     279        readPlane(pix, x, y, w, h, buf); 
     280        pix.close(); 
    282281        plane = null; 
    283282      } 
     
    610609      Double stageZ = zPos == null ? null : new Double(zPos); 
    611610 
    612       for (int series=0; series<getSeriesCount(); series++) { 
    613         setSeries(series); 
    614         for (int plane=0; plane<getImageCount(); plane++) { 
    615           if (stageX != null) { 
    616             store.setPlanePositionX(stageX, series, plane); 
    617           } 
    618           if (stageY != null) { 
    619             store.setPlanePositionY(stageY, series, plane); 
    620           } 
    621           if (stageZ != null) { 
    622             store.setPlanePositionZ(stageZ, series, plane); 
     611      if (stageX != null || stageY != null || stageZ != null) { 
     612        for (int series=0; series<getSeriesCount(); series++) { 
     613          setSeries(series); 
     614          for (int plane=0; plane<getImageCount(); plane++) { 
     615            if (stageX != null) { 
     616              store.setPlanePositionX(stageX, series, plane); 
     617            } 
     618            if (stageY != null) { 
     619              store.setPlanePositionY(stageY, series, plane); 
     620            } 
     621            if (stageZ != null) { 
     622              store.setPlanePositionZ(stageZ, series, plane); 
     623            } 
    623624          } 
    624625        } 
     
    815816    } 
    816817    return null; 
     818  } 
     819 
     820  private void findNextBlock() throws IOException { 
     821    byte[] buf = new byte[8192]; 
     822    in.read(buf); 
     823    boolean found = false; 
     824 
     825    while (!found) { 
     826      for (int i=0; i<buf.length-7; i++) { 
     827        if (buf[i] == 0x49 && buf[i + 1] == 0x56 && buf[i + 2] == 0x45 && 
     828          buf[i + 3] == 0x41 && buf[i + 4] == 0x64 && buf[i + 5] == 0x62 && 
     829          buf[i + 6] == 0x70 && buf[i + 7] == 0x71) 
     830        { 
     831          found = true; 
     832          in.seek(in.getFilePointer() - buf.length + i + 8); 
     833          break; 
     834        } 
     835      } 
     836      if (!found) { 
     837        for (int i=6; i>=0; i--) { 
     838          buf[6 - i] = buf[buf.length - i]; 
     839        } 
     840        in.read(buf, 7, buf.length - 7); 
     841      } 
     842    } 
    817843  } 
    818844 
Note: See TracChangeset for help on using the changeset viewer.