Changeset 5862 for branches/cleanup


Ignore:
Timestamp:
02/01/10 06:17:33 (10 years ago)
Author:
callan
Message:

#463 Ported TIFF saver to use RandomAccessOutputStream for writeIFDValue

File:
1 edited

Legend:

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

    r5852 r5862  
    2424package loci.formats.tiff; 
    2525 
    26 import java.io.ByteArrayOutputStream; 
    27 import java.io.DataOutput; 
    28 import java.io.DataOutputStream; 
    2926import java.io.IOException; 
    3027 
     28import loci.common.ByteArrayHandle; 
    3129import loci.common.DataTools; 
    3230import loci.common.RandomAccessInputStream; 
     
    7876    throws IOException 
    7977  { 
     78    out.order(littleEndian); 
    8079    // write endianness indicator 
    8180    if (littleEndian) { 
     
    8988    // write magic number 
    9089    if (bigTiff) { 
    91       DataTools.writeShort(out, 
    92         TiffConstants.BIG_TIFF_MAGIC_NUMBER, littleEndian); 
    93     } 
    94     else DataTools.writeShort(out, TiffConstants.MAGIC_NUMBER, littleEndian); 
     90      out.writeShort(TiffConstants.BIG_TIFF_MAGIC_NUMBER); 
     91    } 
     92    else out.writeShort(TiffConstants.MAGIC_NUMBER); 
    9593 
    9694    // write the offset to the first IFD 
     
    9896    // for vanilla TIFFs, 8 is the offset to the first IFD 
    9997    // for BigTIFFs, 8 is the number of bytes in an offset 
    100     DataTools.writeInt(out, 8, littleEndian); 
     98    out.writeInt(8); 
    10199    if (bigTiff) { 
    102100      // write the offset to the first IFD for BigTIFF files 
    103       DataTools.writeLong(out, 16, littleEndian); 
     101      out.writeLong(16); 
    104102    } 
    105103  } 
     
    110108   * Writes the given IFD value to the given output object. 
    111109   * @param ifdOut output object for writing IFD stream 
    112    * @param extraBuf buffer to which "extra" IFD information should be written 
    113    * @param extraOut data output wrapper for extraBuf (passed for efficiency) 
     110   * @param extraOut buffer to which "extra" IFD information should be written 
    114111   * @param offset global offset to use for IFD offset values 
    115112   * @param tag IFD tag to write 
    116113   * @param value IFD value to write 
     114   * @param bigTiff Whether or not this is a big TIFF. 
    117115   */ 
    118   public static void writeIFDValue(DataOutput ifdOut, 
    119     ByteArrayOutputStream extraBuf, DataOutputStream extraOut, long offset, 
    120     int tag, Object value, boolean bigTiff, boolean littleEndian) 
    121     throws FormatException, IOException 
     116  public static void writeIFDValue(RandomAccessOutputStream ifdOut, 
     117    RandomAccessOutputStream extraOut, long offset, int tag, Object value, 
     118    boolean bigTiff) throws FormatException, IOException 
    122119  { 
    123120    // convert singleton objects into arrays, for simplicity 
     
    144141 
    145142    // write directory entry to output buffers 
    146     DataTools.writeShort(ifdOut, tag, littleEndian); // tag 
     143    ifdOut.writeShort(tag); // tag 
    147144    if (value instanceof short[]) { 
    148145      short[] q = (short[]) value; 
    149       DataTools.writeShort(ifdOut, IFD.BYTE, littleEndian); 
    150       if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
    151       else DataTools.writeInt(ifdOut, q.length, littleEndian); 
     146      ifdOut.writeShort(IFD.BYTE); 
     147      if (bigTiff) ifdOut.writeLong(q.length); 
     148      else ifdOut.writeInt(q.length); 
    152149      if (q.length <= dataLength) { 
    153150        for (int i=0; i<q.length; i++) ifdOut.writeByte(q[i]); 
     
    156153      else { 
    157154        if (bigTiff) { 
    158           DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
    159         } 
    160         else { 
    161           DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
    162             littleEndian); 
     155          ifdOut.writeLong(offset + extraOut.length()); 
     156        } 
     157        else { 
     158          ifdOut.writeInt((int) (offset + extraOut.length())); 
    163159        } 
    164160        for (int i=0; i<q.length; i++) extraOut.writeByte(q[i]); 
     
    167163    else if (value instanceof String) { // ASCII 
    168164      char[] q = ((String) value).toCharArray(); 
    169       DataTools.writeShort(ifdOut, IFD.ASCII, littleEndian); // type 
    170       if (bigTiff) DataTools.writeLong(ifdOut, q.length + 1, littleEndian); 
    171       else DataTools.writeInt(ifdOut, q.length + 1, littleEndian); 
     165      ifdOut.writeShort(IFD.ASCII); // type 
     166      if (bigTiff) ifdOut.writeLong(q.length + 1); 
     167      else ifdOut.writeInt(q.length + 1); 
    172168      if (q.length < dataLength) { 
    173169        for (int i=0; i<q.length; i++) ifdOut.writeByte(q[i]); // value(s) 
     
    176172      else { 
    177173        if (bigTiff) { 
    178           DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
     174          ifdOut.writeLong(offset + extraOut.length()); 
    179175        } 
    180176        else { 
    181177          // offset 
    182           DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
    183             littleEndian); 
     178          ifdOut.writeInt((int) (offset + extraOut.length())); 
    184179        } 
    185180        for (int i=0; i<q.length; i++) extraOut.writeByte(q[i]); // values 
     
    189184    else if (value instanceof int[]) { // SHORT 
    190185      int[] q = (int[]) value; 
    191       DataTools.writeShort(ifdOut, IFD.SHORT, littleEndian); // type 
    192       if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
    193       else DataTools.writeInt(ifdOut, q.length, littleEndian); 
     186      ifdOut.writeShort(IFD.SHORT); // type 
     187      if (bigTiff) ifdOut.writeLong(q.length); 
     188      else ifdOut.writeInt(q.length); 
    194189      if (q.length <= dataLength / 2) { 
    195190        for (int i=0; i<q.length; i++) { 
    196           DataTools.writeShort(ifdOut, q[i], littleEndian); // value(s) 
     191          ifdOut.writeShort(q[i]); // value(s) 
    197192        } 
    198193        for (int i=q.length; i<dataLength / 2; i++) { 
    199           DataTools.writeShort(ifdOut, 0, littleEndian); // padding 
    200         } 
    201       } 
    202       else { 
    203         if (bigTiff) { 
    204           DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
     194          ifdOut.writeShort(0); // padding 
     195        } 
     196      } 
     197      else { 
     198        if (bigTiff) { 
     199          ifdOut.writeLong(offset + extraOut.length()); 
    205200        } 
    206201        else { 
    207202          // offset 
    208           DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
    209             littleEndian); 
     203          ifdOut.writeInt((int) (offset + extraOut.length())); 
    210204        } 
    211205        for (int i=0; i<q.length; i++) { 
    212           DataTools.writeShort(extraOut, q[i], littleEndian); // values 
     206          extraOut.writeShort(q[i]); // values 
    213207        } 
    214208      } 
     
    218212 
    219213      if (bigTiff) { 
    220         DataTools.writeShort(ifdOut, IFD.LONG8, littleEndian); 
    221         DataTools.writeLong(ifdOut, q.length, littleEndian); 
     214        ifdOut.writeShort(IFD.LONG8); 
     215        ifdOut.writeLong(q.length); 
    222216 
    223217        if (q.length <= dataLength / 4) { 
    224218          for (int i=0; i<q.length; i++) { 
    225             DataTools.writeLong(ifdOut, q[0], littleEndian); 
     219            ifdOut.writeLong(q[0]); 
    226220          } 
    227221          for (int i=q.length; i<dataLength / 4; i++) { 
    228             DataTools.writeLong(ifdOut, 0, littleEndian); 
    229           } 
    230         } 
    231         else { 
    232           DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
     222            ifdOut.writeLong(0); 
     223          } 
     224        } 
     225        else { 
     226          ifdOut.writeLong(offset + extraOut.length()); 
    233227          for (int i=0; i<q.length; i++) { 
    234             DataTools.writeLong(extraOut, q[i], littleEndian); 
    235           } 
    236         } 
    237       } 
    238       else { 
    239         DataTools.writeShort(ifdOut, IFD.LONG, littleEndian); 
    240         DataTools.writeInt(ifdOut, q.length, littleEndian); 
     228            extraOut.writeLong(q[i]); 
     229          } 
     230        } 
     231      } 
     232      else { 
     233        ifdOut.writeShort(IFD.LONG); 
     234        ifdOut.writeInt(q.length); 
    241235        if (q.length <= dataLength / 4) { 
    242236          for (int i=0; i<q.length; i++) { 
    243             DataTools.writeInt(ifdOut, (int) q[0], littleEndian); 
     237            ifdOut.writeInt((int) q[0]); 
    244238          } 
    245239          for (int i=q.length; i<dataLength / 4; i++) { 
    246             DataTools.writeInt(ifdOut, 0, littleEndian); // padding 
    247           } 
    248         } 
    249         else { 
    250           DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
    251             littleEndian); 
     240            ifdOut.writeInt(0); // padding 
     241          } 
     242        } 
     243        else { 
     244          ifdOut.writeInt((int) (offset + extraOut.length())); 
    252245          for (int i=0; i<q.length; i++) { 
    253             DataTools.writeInt(extraOut, (int) q[i], littleEndian); 
     246            extraOut.writeInt((int) q[i]); 
    254247          } 
    255248        } 
     
    258251    else if (value instanceof TiffRational[]) { // RATIONAL 
    259252      TiffRational[] q = (TiffRational[]) value; 
    260       DataTools.writeShort(ifdOut, IFD.RATIONAL, littleEndian); // type 
    261       if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
    262       else DataTools.writeInt(ifdOut, q.length, littleEndian); 
     253      ifdOut.writeShort(IFD.RATIONAL); // type 
     254      if (bigTiff) ifdOut.writeLong(q.length); 
     255      else ifdOut.writeInt(q.length); 
    263256      if (bigTiff && q.length == 1) { 
    264         DataTools.writeInt(ifdOut, (int) q[0].getNumerator(), littleEndian); 
    265         DataTools.writeInt(ifdOut, (int) q[0].getDenominator(), littleEndian); 
    266       } 
    267       else { 
    268         if (bigTiff) { 
    269           DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
     257        ifdOut.writeInt((int) q[0].getNumerator()); 
     258        ifdOut.writeInt((int) q[0].getDenominator()); 
     259      } 
     260      else { 
     261        if (bigTiff) { 
     262          ifdOut.writeLong(offset + extraOut.length()); 
    270263        } 
    271264        else { 
    272265          // offset 
    273           DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
    274             littleEndian); 
     266          ifdOut.writeInt((int) (offset + extraOut.length())); 
    275267        } 
    276268        for (int i=0; i<q.length; i++) { 
    277           DataTools.writeInt(extraOut, (int) q[i].getNumerator(), littleEndian); 
    278           DataTools.writeInt(extraOut, (int) q[i].getDenominator(), 
    279             littleEndian); 
     269          extraOut.writeInt((int) q[i].getNumerator()); 
     270          extraOut.writeInt((int) q[i].getDenominator()); 
    280271        } 
    281272      } 
     
    283274    else if (value instanceof float[]) { // FLOAT 
    284275      float[] q = (float[]) value; 
    285       DataTools.writeShort(ifdOut, IFD.FLOAT, littleEndian); // type 
    286       if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
    287       else DataTools.writeInt(ifdOut, q.length, littleEndian); 
     276      ifdOut.writeShort(IFD.FLOAT); // type 
     277      if (bigTiff) ifdOut.writeLong(q.length); 
     278      else ifdOut.writeInt(q.length); 
    288279      if (q.length <= dataLength / 4) { 
    289280        for (int i=0; i<q.length; i++) { 
    290           DataTools.writeFloat(ifdOut, q[0], littleEndian); // value 
     281          ifdOut.writeFloat(q[0]); // value 
    291282        } 
    292283        for (int i=q.length; i<dataLength / 4; i++) { 
    293           DataTools.writeInt(ifdOut, 0, littleEndian); // padding 
    294         } 
    295       } 
    296       else { 
    297         if (bigTiff) { 
    298           DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
    299         } 
    300         else { 
    301           DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
    302             littleEndian); 
     284          ifdOut.writeInt(0); // padding 
     285        } 
     286      } 
     287      else { 
     288        if (bigTiff) { 
     289          ifdOut.writeLong(offset + extraOut.length()); 
     290        } 
     291        else { 
     292          ifdOut.writeInt((int) (offset + extraOut.length())); 
    303293        } 
    304294        for (int i=0; i<q.length; i++) { 
    305           DataTools.writeFloat(extraOut, q[i], littleEndian); // values 
     295          extraOut.writeFloat(q[i]); // values 
    306296        } 
    307297      } 
     
    309299    else if (value instanceof double[]) { // DOUBLE 
    310300      double[] q = (double[]) value; 
    311       DataTools.writeShort(ifdOut, IFD.DOUBLE, littleEndian); // type 
    312       if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
    313       else DataTools.writeInt(ifdOut, q.length, littleEndian); 
     301      ifdOut.writeShort(IFD.DOUBLE); // type 
     302      if (bigTiff) ifdOut.writeLong(q.length); 
     303      else ifdOut.writeInt(q.length); 
    314304      if (bigTiff) { 
    315         DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
    316       } 
    317       else { 
    318         DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
    319           littleEndian); 
     305        ifdOut.writeLong(offset + extraOut.length()); 
     306      } 
     307      else { 
     308        ifdOut.writeInt((int) (extraOut.length())); 
    320309      } 
    321310      for (int i=0; i<q.length; i++) { 
    322         DataTools.writeDouble(extraOut, q[i], littleEndian); // values 
     311        extraOut.writeDouble(q[i]); // values 
    323312      } 
    324313    } 
     
    365354 
    366355    raf.seek(offset); 
     356    raf.order(little); 
    367357 
    368358    // skip to the correct IFD 
    369359    for (int i=0; i<=ifd; i++) { 
    370       offset = bigTiff ? DataTools.read8SignedBytes(raf, little) : 
    371         DataTools.read4UnsignedBytes(raf, little); 
     360      offset = bigTiff ? raf.readLong() : raf.readInt(); 
    372361      if (offset <= 0) { 
    373362        throw new FormatException("No such IFD (" + ifd + " of " + i + ")"); 
    374363      } 
    375364      raf.seek(offset); 
    376       num = bigTiff ? DataTools.read8SignedBytes(raf, little) : 
    377         DataTools.read2UnsignedBytes(raf, little); 
     365      num = bigTiff ? raf.readLong() : raf.readInt(); 
    378366      if (i < ifd) raf.seek(offset + baseOffset + bytesPerEntry * num); 
    379367    } 
     
    381369    // search directory entries for proper tag 
    382370    for (int i=0; i<num; i++) { 
    383       int oldTag = DataTools.read2UnsignedBytes(raf, little); 
    384       int oldType = DataTools.read2UnsignedBytes(raf, little); 
     371      int oldTag = raf.readUnsignedShort(); 
     372      int oldType = raf.readUnsignedShort(); 
    385373      int oldCount = 
    386         bigTiff ? (int) (DataTools.read8SignedBytes(raf, little) & 0xffffffff) : 
    387         DataTools.read4SignedBytes(raf, little); 
    388       long oldOffset = bigTiff ? DataTools.read8SignedBytes(raf, little) : 
    389         DataTools.read4SignedBytes(raf, little); 
     374        bigTiff ? (int) (raf.readLong() & 0xffffffff) : raf.readInt(); 
     375      long oldOffset = bigTiff ? raf.readLong() : raf.readInt(); 
    390376      if (oldTag == tag) { 
    391377        // write new value to buffers 
    392         ByteArrayOutputStream ifdBuf = new ByteArrayOutputStream(bytesPerEntry); 
    393         DataOutputStream ifdOut = new DataOutputStream(ifdBuf); 
    394         ByteArrayOutputStream extraBuf = new ByteArrayOutputStream(); 
    395         DataOutputStream extraOut = new DataOutputStream(extraBuf); 
    396         writeIFDValue(ifdOut, extraBuf, extraOut, oldOffset, tag, value, 
    397           bigTiff, little); 
    398         byte[] bytes = ifdBuf.toByteArray(); 
    399         byte[] extra = extraBuf.toByteArray(); 
     378        ByteArrayHandle ifdBuf = new ByteArrayHandle(bytesPerEntry); 
     379        RandomAccessOutputStream ifdOut = new RandomAccessOutputStream(ifdBuf); 
     380        ifdOut.order(little); 
     381        ByteArrayHandle extraBuf = new ByteArrayHandle(); 
     382        RandomAccessOutputStream extraOut =  
     383          new RandomAccessOutputStream(extraBuf); 
     384        extraOut.order(little); 
     385        writeIFDValue(ifdOut, extraOut, oldOffset, tag, value, 
     386          bigTiff); 
     387        // FIXME: BEGIN block to review for Stream --> Stream "buffered". 
     388        ifdBuf.seek(0); 
     389        byte[] bytes = new byte[(int) ifdBuf.length()]; 
     390        ifdBuf.read(bytes); 
     391        extraBuf.seek(0); 
     392        byte[] extra = new byte[(int) extraBuf.length()]; 
     393        extraBuf.read(extra); 
     394        // END block to review 
    400395 
    401396        // extract new directory entry parameters 
     
    413408          newOffset = DataTools.bytesToInt(bytes, 8, little); 
    414409        } 
    415         boolean terminate = false; 
    416410        LOGGER.debug("overwriteIFDValue:"); 
    417411        LOGGER.debug("\told: (tag={}; type={}; count={}; offset={});", 
     
    431425          // old entry was already at EOF; overwrite it 
    432426          newOffset = oldOffset; 
    433           terminate = true; 
    434427          LOGGER.debug("overwriteIFDValue: old entry is at EOF"); 
    435428        } 
     
    449442 
    450443        RandomAccessOutputStream out = new RandomAccessOutputStream(file); 
     444        out.order(little); 
    451445 
    452446        // overwrite old entry 
    453447        out.seek(filePointer - (bigTiff ? 18 : 10)); // jump back 
    454         DataTools.writeShort(out, newType, little); 
    455         if (bigTiff) DataTools.writeLong(out, newCount, little); 
    456         else DataTools.writeInt(out, newCount, little); 
    457         if (bigTiff) DataTools.writeLong(out, newOffset, little); 
    458         else DataTools.writeInt(out, (int) newOffset, little); 
     448        out.writeShort(newType); 
     449        if (bigTiff) out.writeLong(newCount); 
     450        else out.writeInt(newCount); 
     451        if (bigTiff) out.writeLong(newOffset); 
     452        else out.writeInt((int) newOffset); 
    459453        if (extra.length > 0) { 
    460454          out.seek(newOffset); 
Note: See TracChangeset for help on using the changeset viewer.