Changeset 3372


Ignore:
Timestamp:
11/15/07 14:27:39 (12 years ago)
Author:
melissa
Message:
  • Updated POI to use significantly less memory, which required a few changes to the POI API.
  • Removed dimension order/axis size hack from ZVI reader, and replaced it with much nicer logic.
Location:
trunk
Files:
5 edited

Legend:

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

    r3366 r3372  
    5959      r.exec("import org.apache.poi.poifs.filesystem.DocumentEntry"); 
    6060      r.exec("import org.apache.poi.poifs.filesystem.DocumentInputStream"); 
     61      r.exec("import org.apache.poi.util.RandomAccessStream"); 
    6162      r.exec("import java.util.Iterator"); 
    6263    } 
     
    8788    return (block[0] == 0xd0 && block[1] == 0xcf && 
    8889      block[2] == 0x11 && block[3] == 0xe0); 
     90  } 
     91 
     92  /* @see loci.formats.IFormatReader#get8BitLookupTable() */ 
     93  public byte[][] get8BitLookupTable() throws FormatException, IOException { 
     94    FormatTools.assertId(currentId, true, 1); 
     95    RandomAccessStream stream = getStream(0); 
     96    ifds = TiffTools.getIFDs(stream); 
     97    int[] bits = TiffTools.getBitsPerSample(ifds[0]); 
     98    if (bits[0] <= 8) { 
     99      int[] colorMap = 
     100        (int[]) TiffTools.getIFDValue(ifds[0], TiffTools.COLOR_MAP); 
     101      if (colorMap == null) return null; 
     102 
     103      byte[][] table = new byte[3][colorMap.length / 3]; 
     104      int next = 0; 
     105      for (int j=0; j<table.length; j++) { 
     106        for (int i=0; i<table[0].length; i++) { 
     107          table[j][i] = (byte) (colorMap[next++] >> 8); 
     108        } 
     109      } 
     110 
     111      return table; 
     112    } 
     113    return null; 
    89114  } 
    90115 
     
    102127    TiffTools.getSamples(ifds[0], stream, buf); 
    103128    stream.close(); 
     129 
     130    if (core.pixelType[0] == FormatTools.UINT16 || 
     131      core.pixelType[0] == FormatTools.INT16) 
     132    { 
     133      for (int i=0; i<buf.length; i+=2) { 
     134        byte b = buf[i]; 
     135        buf[i] = buf[i + 1]; 
     136        buf[i + 1] = b; 
     137      } 
     138    } 
     139    else if (core.pixelType[0] == FormatTools.UINT32 || 
     140      core.pixelType[0] == FormatTools.INT32) 
     141    { 
     142      for (int i=0; i<buf.length; i+=4) { 
     143        byte b = buf[i]; 
     144        buf[i] = buf[i + 3]; 
     145        buf[i + 3] = b; 
     146        b = buf[i + 1]; 
     147        buf[i + 1] = buf[i + 2]; 
     148        buf[i + 2] = b; 
     149      } 
     150    } 
     151 
    104152    return buf; 
    105153  } 
     
    116164    tags = null; 
    117165 
     166    try { r.exec("fis.close()"); } 
     167    catch (ReflectException e) { } 
    118168    String[] vars = {"dirName", "root", "dir", "document", "dis", 
    119169      "numBytes", "data", "fis", "fs", "iter", "isInstance", "isDocument", 
     
    142192      } 
    143193 
    144       r.exec("dis = new DocumentInputStream(document)"); 
     194      r.exec("dis = new DocumentInputStream(document, fis)"); 
    145195      r.exec("numBytes = dis.available()"); 
    146196      int numBytes = ((Integer) r.getVar("numBytes")).intValue(); 
    147       byte[] b = new byte[numBytes + 4]; // append 0 for final offset 
     197      byte[] b = new byte[numBytes]; 
    148198      r.setVar("data", b); 
    149199      r.exec("dis.read(data)"); 
     
    159209 
    160210    if (!core.rgb[0]) { 
    161       core.rgb[0] = TiffTools.getIFDIntValue(ifds[0], 
     211      core.indexed[0] = TiffTools.getIFDIntValue(ifds[0], 
    162212        TiffTools.PHOTOMETRIC_INTERPRETATION, false, 1) == 
    163213        TiffTools.RGB_PALETTE; 
     
    312362      in.seek(30); 
    313363      int size = (int) Math.pow(2, in.readShort()); 
    314       in.seek(0); 
    315       r.setVar("fis", in); 
     364      in.close(); 
     365      r.setVar("file", currentId); 
     366      r.exec("fis = new RandomAccessStream(file)"); 
     367      r.setVar("size", size); 
     368      r.setVar("littleEndian", true); 
     369      r.exec("fis.order(littleEndian)"); 
    316370      r.exec("fs = new POIFSFileSystem(fis, size)"); 
    317371      r.exec("dir = fs.getRoot()"); 
     
    352406        status("Parsing embedded file (" + depth + ")"); 
    353407        r.exec("entryName = entry.getName()"); 
    354         r.exec("dis = new DocumentInputStream(entry)"); 
     408        r.exec("dis = new DocumentInputStream(entry, fis)"); 
    355409        r.exec("numBytes = dis.available()"); 
    356410        int numbytes = ((Integer) r.getVar("numBytes")).intValue(); 
     
    430484      } 
    431485 
    432       r.exec("dis = new DocumentInputStream(document)"); 
     486      r.exec("dis = new DocumentInputStream(document, fis)"); 
    433487      r.exec("numBytes = dis.available()"); 
    434488      int numBytes = ((Integer) r.getVar("numBytes")).intValue(); 
  • trunk/loci/formats/in/OIBReader.java

    r3366 r3372  
    6060      r.exec("import org.apache.poi.poifs.filesystem.DocumentEntry"); 
    6161      r.exec("import org.apache.poi.poifs.filesystem.DocumentInputStream"); 
     62      r.exec("import org.apache.poi.util.RandomAccessStream"); 
    6263      r.exec("import java.util.Iterator"); 
    6364    } 
     
    138139      r.setVar("entryName", name); 
    139140      r.exec("document = dir.getEntry(entryName)"); 
    140       r.exec("dis = new DocumentInputStream(document)"); 
     141      r.exec("dis = new DocumentInputStream(document, fis)"); 
    141142      r.exec("numBytes = dis.available()"); 
    142143      int numBytes = ((Integer) r.getVar("numBytes")).intValue(); 
    143       byte[] b = new byte[numBytes + 4]; // append 0 for final offset 
     144      byte[] b = new byte[numBytes]; 
    144145      r.setVar("data", b); 
    145146      r.exec("dis.read(data)"); 
     
    149150      TiffTools.getSamples(ifds[0], stream, buf); 
    150151      stream.close(); 
     152 
     153      if (getPixelType() == FormatTools.UINT16) { 
     154        for (int i=0; i<buf.length; i+=2) { 
     155          byte s = buf[i]; 
     156          buf[i] = buf[i + 1]; 
     157          buf[i + 1] = s; 
     158        } 
     159      } 
     160 
    151161      return buf; 
    152162    } 
     
    161171  public void close() throws IOException { 
    162172    super.close(); 
     173    try { r.exec("fis.close()"); } 
     174    catch (ReflectException e) { } 
    163175    String[] vars = {"dirName", "root", "dir", "document", "dis", 
    164176      "numBytes", "data", "fis", "fs", "iter", "isInstance", "isDocument", 
     
    194206    try { 
    195207      in = new RandomAccessStream(id); 
    196       if (in.length() % 4096 != 0) { 
    197         in.setExtend(4096 - (int) (in.length() % 4096)); 
    198       } 
    199208 
    200209      in.order(true); 
    201210      in.seek(30); 
    202211      int blockSize = (int) Math.pow(2, in.readShort()); 
    203       in.seek(0); 
    204  
    205       r.setVar("fis", in); 
     212 
     213      int extend = blockSize - (int) (in.length() % blockSize); 
     214      if (extend == blockSize) extend = 0; 
     215      in.close(); 
     216 
     217      r.setVar("file", currentId); 
     218      r.setVar("extend", extend); 
     219      r.exec("fis = new RandomAccessStream(file)"); 
     220      r.setVar("littleEndian", true); 
     221      r.exec("fis.order(littleEndian)"); 
     222      r.exec("fis.setExtend(extend)"); 
    206223      r.setVar("size", blockSize); 
    207224      r.exec("fs = new POIFSFileSystem(fis, size)"); 
     
    329346      r.setVar("entryName", name); 
    330347      r.exec("document = dir.getEntry(entryName)"); 
    331       r.exec("dis = new DocumentInputStream(document)"); 
     348      r.exec("dis = new DocumentInputStream(document, fis)"); 
    332349      r.exec("numBytes = dis.available()"); 
    333350      int numBytes = ((Integer) r.getVar("numBytes")).intValue(); 
    334       byte[] b = new byte[numBytes + 4]; // append 0 for final offset 
     351      byte[] b = new byte[numBytes]; 
    335352      r.setVar("data", b); 
    336353      r.exec("dis.read(data)"); 
     
    456473          print(depth + 1, "Found document: " + r.getVar("entryName")); 
    457474        } 
    458         r.exec("dis = new DocumentInputStream(entry)"); 
     475        r.exec("dis = new DocumentInputStream(entry, fis)"); 
    459476        r.exec("numBytes = dis.available()"); 
    460477        int numbytes = ((Integer) r.getVar("numBytes")).intValue(); 
  • trunk/loci/formats/in/PCIReader.java

    r3366 r3372  
    5959      r.exec("import org.apache.poi.poifs.filesystem.DocumentEntry"); 
    6060      r.exec("import org.apache.poi.poifs.filesystem.DocumentInputStream"); 
     61      r.exec("import org.apache.poi.util.RandomAccessStream"); 
    6162      r.exec("import java.util.Iterator"); 
    6263    } 
     
    104105      r.setVar("entryName", name); 
    105106      r.exec("document = dir.getEntry(entryName)"); 
    106       r.exec("dis = new DocumentInputStream(document)"); 
     107      r.exec("dis = new DocumentInputStream(document, fis)"); 
    107108      r.exec("numBytes = dis.available()"); 
    108109      r.setVar("data", buf); 
     
    111112    catch (ReflectException e) { 
    112113      throw new FormatException(NO_POI_MSG, e); 
     114    } 
     115 
     116    if (core.pixelType[0] == FormatTools.UINT16) { 
     117      for (int i=0; i<buf.length; i+=2) { 
     118        byte b = buf[i]; 
     119        buf[i] = buf[i + 1]; 
     120        buf[i + 1] = b; 
     121      } 
     122    } 
     123    else if (core.pixelType[0] == FormatTools.UINT32) { 
     124      for (int i=0; i<buf.length; i+=4) { 
     125        byte b = buf[i]; 
     126        buf[i] = buf[i + 3]; 
     127        buf[i + 3] = b; 
     128        b = buf[i + 1]; 
     129        buf[i + 1] = buf[i + 2]; 
     130        buf[i + 2] = b; 
     131      } 
    113132    } 
    114133 
     
    123142    imageDirectories = imageFiles = null; 
    124143    currentParent = null; 
     144    try { r.exec("fis.close()"); } 
     145    catch (ReflectException e) { } 
    125146  } 
    126147 
     
    142163      in.seek(30); 
    143164      int size = (int) Math.pow(2, in.readShort()); 
    144       in.seek(0); 
    145  
    146       r.setVar("fis", in); 
     165      in.close(); 
     166 
     167      r.setVar("file", currentId); 
     168      r.setVar("size", size); 
     169      r.exec("fis = new RandomAccessStream(file)"); 
     170      r.setVar("littleEndian", true); 
     171      r.exec("fis.order(littleEndian)"); 
    147172      r.exec("fs = new POIFSFileSystem(fis, size)"); 
    148173      r.exec("dir = fs.getRoot()"); 
     
    202227        r.exec("entryName = entry.getName()"); 
    203228        if (debug) print(depth + 1, (String) r.getVar("entryName")); 
    204         r.exec("dis = new DocumentInputStream(entry)"); 
     229        r.exec("dis = new DocumentInputStream(entry, fis)"); 
    205230        r.exec("numBytes = dis.available()"); 
    206231        int numBytes = ((Integer) r.getVar("numBytes")).intValue(); 
  • trunk/loci/formats/in/ZeissZVIReader.java

    r3369 r3372  
    6161      r.exec("import org.apache.poi.poifs.filesystem.DocumentEntry"); 
    6262      r.exec("import org.apache.poi.poifs.filesystem.DocumentInputStream"); 
     63      r.exec("import org.apache.poi.util.RandomAccessStream"); 
    6364      r.exec("import java.util.Iterator"); 
    6465    } 
     
    9798 
    9899  private Hashtable offsets; 
     100  private Hashtable coordinates; 
    99101 
    100102  private int zIndex = -1, cIndex = -1, tIndex = -1; 
     
    178180        r.setVar("entryName", name); 
    179181        r.exec("document = dir.getEntry(entryName)"); 
    180         r.exec("dis = new DocumentInputStream(document)"); 
     182        r.exec("dis = new DocumentInputStream(document, fis)"); 
    181183        r.exec("numBytes = dis.available()"); 
    182184        r.setVar("skipBytes", ((Integer) offsets.get(ii)).longValue()); 
     
    214216        } 
    215217      } 
     218 
     219      if (bpp % 2 == 0) { 
     220        for (int i=0; i<buf.length; i+=2) { 
     221          byte b = buf[i]; 
     222          buf[i] = buf[i + 1]; 
     223          buf[i + 1] = b; 
     224        } 
     225      } 
     226 
    216227      return buf; 
    217228    } 
     
    239250 
    240251    if (legacy != null) legacy.close(); 
    241     pixels = names = offsets = null; 
     252    pixels = names = offsets = coordinates = null; 
    242253    zIndices = cIndices = tIndices = null; 
    243254    bpp = tileRows = tileColumns = 0; 
    244255    zIndex = cIndex = tIndex = -1; 
    245256    needLegacy = isTiled = isJPEG = false; 
     257 
     258    try { r.exec("fis.close()"); } 
     259    catch (ReflectException e) { } 
    246260 
    247261    String[] vars = {"dirName", "root", "dir", "document", "dis", 
     
    266280    names = new Hashtable(); 
    267281    offsets = new Hashtable(); 
     282    coordinates = new Hashtable(); 
    268283    zIndices = new Vector(); 
    269284    cIndices = new Vector(); 
     
    284299      in.seek(30); 
    285300      int size = (int) Math.pow(2, in.readShort()); 
    286       in.seek(0); 
    287  
    288       r.setVar("fis", in); 
     301      in.close(); 
     302 
     303      r.setVar("file", currentId); 
     304      r.exec("fis = new RandomAccessStream(file)"); 
     305      r.setVar("littleEndian", true); 
     306      r.exec("fis.order(littleEndian)"); 
    289307      r.setVar("size", size); 
    290308      r.exec("fs = new POIFSFileSystem(fis, size)"); 
     
    332350      } 
    333351 
    334       if (cIndex != -1) { 
    335         int[] dims = {core.sizeZ[0], core.sizeC[0], core.sizeT[0]}; 
    336         int max = 0, min = Integer.MAX_VALUE, maxNdx = 0, minNdx = 0; 
    337         String[] axes = {"Z", "C", "T"}; 
    338  
    339         for (int i=0; i<dims.length; i++) { 
    340           if (dims[i] > max) { 
    341             max = dims[i]; 
    342             maxNdx = i; 
    343           } 
    344           if (dims[i] < min) { 
    345             min = dims[i]; 
    346             minNdx = i; 
    347           } 
    348         } 
    349  
    350         int medNdx = 0; 
    351         for (int i=0; i<3; i++) { 
    352           if (i != maxNdx && i != minNdx) medNdx = i; 
    353         } 
    354  
    355         core.currentOrder[0] = 
    356           "XY" + axes[maxNdx] + axes[medNdx] + axes[minNdx]; 
    357  
    358         int num = core.sizeZ[0] * core.sizeT[0] - core.sizeC[0]; 
    359         if ((zIndex != -1 && tIndex != -1) && (zIndex != num && tIndex != num)) 
    360         { 
    361           if (zIndex != core.sizeZ[0]) { 
    362             if (core.sizeZ[0] != 1) { 
    363               core.currentOrder[0] = 
    364                 core.currentOrder[0].replaceAll("Z", "") + "Z"; 
    365             } 
    366             else { 
    367               core.currentOrder[0] = 
    368                 core.currentOrder[0].replaceAll("T", "") + "T"; 
    369             } 
    370           } 
    371         } 
    372  
    373         if (core.sizeZ[0] == core.sizeC[0] && core.sizeC[0] == core.sizeT[0]) { 
    374           legacy.setId(id); 
    375           core.currentOrder[0] = legacy.getDimensionOrder(); 
    376         } 
    377  
    378         char[] order = core.currentOrder[0].toCharArray(); 
    379         for (int i=0; i<order.length; i++) { 
    380           if (order[i] == 'Z') order[i] = 'T'; 
    381           else if (order[i] == 'T') order[i] = 'Z'; 
    382         } 
    383         core.currentOrder[0] = new String(order); 
    384       } 
    385       else if (core.rgb[0]) { 
    386         core.currentOrder[0] = 
    387           (core.sizeZ[0] > core.sizeT[0]) ? "XYCZT" : "XYCTZ"; 
    388       } 
    389       else { 
    390         if (metadata.get("MultiChannelEnabled") != null || 
    391           metadata.get("MultiChannelEnabled 0") != null) 
    392         { 
    393           core.currentOrder[0] = 
    394             (core.sizeZ[0] > core.sizeT[0]) ? "XYCZT" : "XYCTZ"; 
    395         } 
    396         else { 
    397           core.currentOrder[0] = 
    398             (core.sizeZ[0] > core.sizeT[0]) ? "XYZTC" : "XYTZC"; 
    399         } 
     352      core.currentOrder[0] = "XY"; 
     353      for (int i=0; i<coordinates.size()-1; i++) { 
     354        int[] zct1 = (int[]) coordinates.get(new Integer(i)); 
     355        int[] zct2 = (int[]) coordinates.get(new Integer(i + 1)); 
     356        int deltaZ = zct2[0] - zct1[0]; 
     357        int deltaC = zct2[1] - zct1[1]; 
     358        int deltaT = zct2[2] - zct1[2]; 
     359        if (deltaZ > 0 && core.currentOrder[0].indexOf("Z") == -1) { 
     360          core.currentOrder[0] += "Z"; 
     361        } 
     362        if (deltaC > 0 && core.currentOrder[0].indexOf("C") == -1) { 
     363          core.currentOrder[0] += "C"; 
     364        } 
     365        if (deltaT > 0 && core.currentOrder[0].indexOf("T") == -1) { 
     366          core.currentOrder[0] += "T"; 
     367        } 
     368      } 
     369      if (core.currentOrder[0].indexOf("C") == -1) { 
     370        core.currentOrder[0] += "C"; 
     371      } 
     372      if (core.currentOrder[0].indexOf("Z") == -1) { 
     373        core.currentOrder[0] += "Z"; 
     374      } 
     375      if (core.currentOrder[0].indexOf("T") == -1) { 
     376        core.currentOrder[0] += "T"; 
    400377      } 
    401378    } 
     
    557534          print(depth + 1, "Found document: " + r.getVar("entryName")); 
    558535        } 
    559         r.exec("dis = new DocumentInputStream(entry)"); 
     536        r.exec("dis = new DocumentInputStream(entry, fis)"); 
    560537        r.exec("numBytes = dis.available()"); 
    561538        int numbytes = ((Integer) r.getVar("numBytes")).intValue(); 
     
    691668                imageNum = Integer.parseInt(num); 
    692669              } 
     670 
     671              coordinates.put(new Integer(imageNum), 
     672                new int[] {zidx, cidx, tidx}); 
    693673 
    694674              offsets.put(new Integer(imageNum), new Integer((int) fp + 32)); 
Note: See TracChangeset for help on using the changeset viewer.