Changeset 5037


Ignore:
Timestamp:
04/28/09 13:15:31 (11 years ago)
Author:
melissa
Message:

When writing an IFD, try to preserve each value's type (e.g. don't convert shorts to bytes).

File:
1 edited

Legend:

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

    r4993 r5037  
    14531453    // write directory entry to output buffers 
    14541454    DataTools.writeShort(ifdOut, tag, littleEndian); // tag 
    1455     if (value instanceof short[]) { // BYTE 
    1456       short[] q = (short[]) value; 
    1457       DataTools.writeShort(ifdOut, BYTE, littleEndian); // type 
     1455    if (value instanceof byte[]) { 
     1456      byte[] q = (byte[]) value; 
     1457      DataTools.writeShort(ifdOut, BYTE, littleEndian); 
    14581458      if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
    14591459      else DataTools.writeInt(ifdOut, q.length, littleEndian); 
    14601460      if (q.length <= dataLength) { 
    1461         for (int i=0; i<q.length; i++) ifdOut.writeByte(q[i]); // value(s) 
    1462         for (int i=q.length; i<dataLength; i++) ifdOut.writeByte(0); // padding 
     1461        for (int i=0; i<q.length; i++) ifdOut.writeByte(q[i]); 
     1462        for (int i=q.length; i<dataLength; i++) ifdOut.writeByte(0); 
     1463      } 
     1464      else { 
     1465        if (bigTiff) { 
     1466          DataTools.writeLong(ifdOut, offset + extraBuf.size(), littleEndian); 
     1467        } 
     1468        else { 
     1469          DataTools.writeInt(ifdOut, (int) (offset + extraBuf.size()), 
     1470            littleEndian); 
     1471        } 
     1472        for (int i=0; i<q.length; i++) extraOut.writeByte(q[i]); 
     1473      } 
     1474    } 
     1475    else if (value instanceof short[]) { // SHORT 
     1476      short[] q = (short[]) value; 
     1477      DataTools.writeShort(ifdOut, SHORT, littleEndian); // type 
     1478      if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
     1479      else DataTools.writeInt(ifdOut, q.length, littleEndian); 
     1480      if (q.length <= dataLength / 2) { 
     1481        for (int i=0; i<q.length; i++) { 
     1482          DataTools.writeShort(ifdOut, q[i], littleEndian); 
     1483        } 
     1484        for (int i=q.length; i<dataLength / 2; i++) { 
     1485          DataTools.writeShort(ifdOut, 0, littleEndian); 
     1486        } 
    14631487      } 
    14641488      else { 
     
    14711495            littleEndian); 
    14721496        } 
    1473         for (int i=0; i<q.length; i++) extraOut.writeByte(q[i]); // values 
     1497        for (int i=0; i<q.length; i++) { 
     1498          DataTools.writeShort(extraOut, q[i], littleEndian); 
     1499        } 
    14741500      } 
    14751501    } 
     
    14961522      } 
    14971523    } 
    1498     else if (value instanceof int[]) { // SHORT 
     1524    else if (value instanceof int[]) { // LONG 
    14991525      int[] q = (int[]) value; 
    1500       DataTools.writeShort(ifdOut, SHORT, littleEndian); // type 
     1526      DataTools.writeShort(ifdOut, LONG, littleEndian); // type 
    15011527      if (bigTiff) DataTools.writeLong(ifdOut, q.length, littleEndian); 
    15021528      else DataTools.writeInt(ifdOut, q.length, littleEndian); 
    1503       if (q.length <= dataLength / 2) { 
     1529      if (q.length <= dataLength / 4) { 
    15041530        for (int i=0; i<q.length; i++) { 
    1505           DataTools.writeShort(ifdOut, q[i], littleEndian); // value(s) 
    1506         } 
    1507         for (int i=q.length; i<dataLength / 2; i++) { 
    1508           DataTools.writeShort(ifdOut, 0, littleEndian); // padding 
     1531          DataTools.writeInt(ifdOut, q[i], littleEndian); // value(s) 
     1532        } 
     1533        for (int i=q.length; i<dataLength / 4; i++) { 
     1534          DataTools.writeInt(ifdOut, 0, littleEndian); // padding 
    15091535        } 
    15101536      } 
     
    15191545        } 
    15201546        for (int i=0; i<q.length; i++) { 
    1521           DataTools.writeShort(extraOut, q[i], littleEndian); // values 
     1547          DataTools.writeInt(extraOut, q[i], littleEndian); // values 
    15221548        } 
    15231549      } 
Note: See TracChangeset for help on using the changeset viewer.