Changeset 5986


Ignore:
Timestamp:
03/03/10 13:48:20 (10 years ago)
Author:
melissa
Message:

Consolidated value offset/data length writing logic into a single helper method and made a few minor adjustments so that TiffSaver takes advantage of new TiffParser methods. See #466.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/cleanup/components/bio-formats/src/loci/formats/tiff/TiffSaver.java

    r5964 r5986  
    144144      short[] q = (short[]) value; 
    145145      ifdOut.writeShort(IFDType.BYTE.getCode()); 
    146       if (bigTiff) ifdOut.writeLong(q.length); 
    147       else ifdOut.writeInt(q.length); 
     146      writeIntValue(ifdOut, q.length, bigTiff); 
    148147      if (q.length <= dataLength) { 
    149148        for (int i=0; i<q.length; i++) ifdOut.writeByte(q[i]); 
     
    151150      } 
    152151      else { 
    153         if (bigTiff) { 
    154           ifdOut.writeLong(offset + extraOut.length()); 
    155         } 
    156         else { 
    157           ifdOut.writeInt((int) (offset + extraOut.length())); 
    158         } 
     152        writeIntValue(ifdOut, offset + extraOut.length(), bigTiff); 
    159153        for (int i=0; i<q.length; i++) extraOut.writeByte(q[i]); 
    160154      } 
     
    163157      char[] q = ((String) value).toCharArray(); 
    164158      ifdOut.writeShort(IFDType.ASCII.getCode()); // type 
    165       if (bigTiff) ifdOut.writeLong(q.length + 1); 
    166       else ifdOut.writeInt(q.length + 1); 
     159      writeIntValue(ifdOut, q.length + 1, bigTiff); 
    167160      if (q.length < dataLength) { 
    168161        for (int i=0; i<q.length; i++) ifdOut.writeByte(q[i]); // value(s) 
     
    170163      } 
    171164      else { 
    172         if (bigTiff) { 
    173           ifdOut.writeLong(offset + extraOut.length()); 
    174         } 
    175         else { 
    176           // offset 
    177           ifdOut.writeInt((int) (offset + extraOut.length())); 
    178         } 
     165        writeIntValue(ifdOut, offset + extraOut.length(), bigTiff); 
    179166        for (int i=0; i<q.length; i++) extraOut.writeByte(q[i]); // values 
    180167        extraOut.writeByte(0); // concluding NULL byte 
     
    184171      int[] q = (int[]) value; 
    185172      ifdOut.writeShort(IFDType.SHORT.getCode()); // type 
    186       if (bigTiff) ifdOut.writeLong(q.length); 
    187       else ifdOut.writeInt(q.length); 
     173      writeIntValue(ifdOut, q.length + 1, bigTiff); 
    188174      if (q.length <= dataLength / 2) { 
    189175        for (int i=0; i<q.length; i++) { 
     
    195181      } 
    196182      else { 
    197         if (bigTiff) { 
    198           ifdOut.writeLong(offset + extraOut.length()); 
    199         } 
    200         else { 
    201           // offset 
    202           ifdOut.writeInt((int) (offset + extraOut.length())); 
    203         } 
     183        writeIntValue(ifdOut, offset + extraOut.length(), bigTiff); 
    204184        for (int i=0; i<q.length; i++) { 
    205185          extraOut.writeShort(q[i]); // values 
     
    210190      long[] q = (long[]) value; 
    211191 
    212       if (bigTiff) { 
    213         ifdOut.writeShort(IFDType.LONG8.getCode()); 
    214         ifdOut.writeLong(q.length); 
    215  
    216         if (q.length <= dataLength / 4) { 
    217           for (int i=0; i<q.length; i++) { 
    218             ifdOut.writeLong(q[0]); 
    219           } 
    220           for (int i=q.length; i<dataLength / 4; i++) { 
    221             ifdOut.writeLong(0); 
    222           } 
    223         } 
    224         else { 
    225           ifdOut.writeLong(offset + extraOut.length()); 
    226           for (int i=0; i<q.length; i++) { 
    227             extraOut.writeLong(q[i]); 
    228           } 
    229         } 
    230       } 
    231       else { 
    232         ifdOut.writeShort(IFDType.LONG.getCode()); 
    233         ifdOut.writeInt(q.length); 
    234         if (q.length <= dataLength / 4) { 
    235           for (int i=0; i<q.length; i++) { 
    236             ifdOut.writeInt((int) q[0]); 
    237           } 
    238           for (int i=q.length; i<dataLength / 4; i++) { 
    239             ifdOut.writeInt(0); // padding 
    240           } 
    241         } 
    242         else { 
    243           ifdOut.writeInt((int) (offset + extraOut.length())); 
    244           for (int i=0; i<q.length; i++) { 
    245             extraOut.writeInt((int) q[i]); 
    246           } 
     192      int type = bigTiff ? IFDType.LONG8.getCode() : IFDType.LONG.getCode(); 
     193      ifdOut.writeShort(type); 
     194      writeIntValue(ifdOut, q.length, bigTiff); 
     195 
     196      if (q.length <= dataLength / 4) { 
     197        for (int i=0; i<q.length; i++) { 
     198          writeIntValue(ifdOut, q[0], bigTiff); 
     199        } 
     200        for (int i=q.length; i<dataLength / 4; i++) { 
     201          writeIntValue(ifdOut, 0, bigTiff); 
     202        } 
     203      } 
     204      else { 
     205        writeIntValue(ifdOut, offset + extraOut.length(), bigTiff); 
     206        for (int i=0; i<q.length; i++) { 
     207          writeIntValue(extraOut, q[i], bigTiff); 
    247208        } 
    248209      } 
     
    251212      TiffRational[] q = (TiffRational[]) value; 
    252213      ifdOut.writeShort(IFDType.RATIONAL.getCode()); // type 
    253       if (bigTiff) ifdOut.writeLong(q.length); 
    254       else ifdOut.writeInt(q.length); 
     214      writeIntValue(ifdOut, q.length, bigTiff); 
    255215      if (bigTiff && q.length == 1) { 
    256216        ifdOut.writeInt((int) q[0].getNumerator()); 
     
    258218      } 
    259219      else { 
    260         if (bigTiff) { 
    261           ifdOut.writeLong(offset + extraOut.length()); 
    262         } 
    263         else { 
    264           // offset 
    265           ifdOut.writeInt((int) (offset + extraOut.length())); 
    266         } 
     220        writeIntValue(ifdOut, offset + extraOut.length(), bigTiff); 
    267221        for (int i=0; i<q.length; i++) { 
    268222          extraOut.writeInt((int) q[i].getNumerator()); 
     
    274228      float[] q = (float[]) value; 
    275229      ifdOut.writeShort(IFDType.FLOAT.getCode()); // type 
    276       if (bigTiff) ifdOut.writeLong(q.length); 
    277       else ifdOut.writeInt(q.length); 
     230      writeIntValue(ifdOut, q.length, bigTiff); 
    278231      if (q.length <= dataLength / 4) { 
    279232        for (int i=0; i<q.length; i++) { 
     
    285238      } 
    286239      else { 
    287         if (bigTiff) { 
    288           ifdOut.writeLong(offset + extraOut.length()); 
    289         } 
    290         else { 
    291           ifdOut.writeInt((int) (offset + extraOut.length())); 
    292         } 
     240        writeIntValue(ifdOut, offset + extraOut.length(), bigTiff); 
    293241        for (int i=0; i<q.length; i++) { 
    294242          extraOut.writeFloat(q[i]); // values 
     
    299247      double[] q = (double[]) value; 
    300248      ifdOut.writeShort(IFDType.DOUBLE.getCode()); // type 
    301       if (bigTiff) ifdOut.writeLong(q.length); 
    302       else ifdOut.writeInt(q.length); 
    303       if (bigTiff) { 
    304         ifdOut.writeLong(offset + extraOut.length()); 
    305       } 
    306       else { 
    307         ifdOut.writeInt((int) (extraOut.length())); 
    308       } 
     249      writeIntValue(ifdOut, q.length, bigTiff); 
     250      writeIntValue(ifdOut, offset + extraOut.length(), bigTiff); 
    309251      for (int i=0; i<q.length; i++) { 
    310252        extraOut.writeDouble(q[i]); // values 
     
    354296 
    355297    // skip to the correct IFD 
    356     for (int i=0; i<=ifd; i++) { 
    357       offset = bigTiff ? raf.readLong() : raf.readInt(); 
    358       if (offset <= 0) { 
    359         throw new FormatException("No such IFD (" + ifd + " of " + i + ")"); 
    360       } 
    361       raf.seek(offset); 
    362       num = bigTiff ? raf.readLong() : raf.readInt(); 
    363       if (i < ifd) raf.seek(offset + baseOffset + bytesPerEntry * num); 
    364     } 
     298    long[] offsets = parser.getIFDOffsets(); 
     299    if (ifd >= offsets.length) { 
     300      throw new FormatException( 
     301        "No such IFD (" + ifd + " of " + offsets.length + ")"); 
     302    } 
     303    raf.seek(offsets[ifd]); 
    365304 
    366305    // search directory entries for proper tag 
     
    436375        out.seek(filePointer - (bigTiff ? 18 : 10)); // jump back 
    437376        out.writeShort(newType); 
    438         if (bigTiff) out.writeLong(newCount); 
    439         else out.writeInt(newCount); 
    440         if (bigTiff) out.writeLong(newOffset); 
    441         else out.writeInt((int) newOffset); 
     377        writeIntValue(out, newCount, bigTiff); 
     378        writeIntValue(out, newOffset, bigTiff); 
    442379        if (extraBuf.length() > 0) { 
    443380          out.seek(newOffset); 
     
    458395  } 
    459396 
     397  // -- Helper methods -- 
     398 
     399  /** 
     400   * Write the given value to the given RandomAccessOutputStream. 
     401   * If the 'bigTiff' flag is set, then the value will be written as an 8 byte 
     402   * long; otherwise, it will be written as a 4 byte integer. 
     403   */ 
     404  private static void writeIntValue(RandomAccessOutputStream out, long offset, 
     405    boolean bigTiff) throws IOException 
     406  { 
     407    if (bigTiff) { 
     408      out.writeLong(offset); 
     409    } 
     410    else { 
     411      out.writeInt((int) offset); 
     412    } 
     413  } 
     414 
    460415} 
Note: See TracChangeset for help on using the changeset viewer.