Changeset 2366


Ignore:
Timestamp:
03/01/07 12:23:02 (13 years ago)
Author:
melissa
Message:

Fixed endianness detection and issue with 32-channel dataset.

File:
1 edited

Legend:

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

    r2320 r2366  
    123123    throws FormatException, IOException 
    124124  { 
    125     if (!id.equals(currentIdsId) && !id.equals(currentIcsId)) initFile(id); 
    126  
    127     int width = dimensions[1]; 
    128     int height = dimensions[2]; 
    129  
    130     int offset = width * height * (dimensions[0] / 8) * no * 
    131       (rgb ? dimensions[4] : 1); 
    132     byte[] plane = 
    133       new byte[width*height * (dimensions[0] / 8) * (rgb ? dimensions[4] : 1)]; 
    134     System.arraycopy(data, offset, plane, 0, plane.length); 
     125    if (!id.equals(currentId)) initFile(id);  
     126    byte[] buf = new byte[sizeX[0] * sizeY[0] * (dimensions[0] / 8) *  
     127      getRGBChannelCount(id)]; 
     128    return openBytes(id, no, buf); 
     129  } 
     130 
     131  public byte[] openBytes(String id, int no, byte[] buf) 
     132    throws FormatException, IOException 
     133  { 
     134    if (!id.equals(currentIdsId) && !id.equals(currentIcsId)) initFile(id); 
     135    if (no < 0 || no >= getImageCount(currentId)) { 
     136      throw new FormatException("Invalid image number: " + no); 
     137    } 
     138    if (buf.length < sizeX[0] * sizeY[0] * (dimensions[0] / 8) *  
     139      getRGBChannelCount(id))  
     140    { 
     141      throw new FormatException("Buffer too small."); 
     142    } 
     143   
     144    int bpp = dimensions[0] / 8; 
     145 
     146    int len = sizeX[0] * sizeY[0] * bpp * getRGBChannelCount(id); 
     147    int offset = len * no; 
     148    if (!rgb && sizeC[0] > 4) { 
     149      int pt = 0; 
     150      for (int i=no*bpp; i<data.length; i+=sizeC[0]*bpp) { 
     151        System.arraycopy(data, i, buf, pt, bpp); 
     152        pt += bpp; 
     153      } 
     154    } 
     155    else System.arraycopy(data, offset, buf, 0, len);  
    135156 
    136157    // if it's version two, we need to flip the plane upside down 
    137158    if (versionTwo) { 
    138       byte[] t = new byte[plane.length]; 
    139       int len = width * (dimensions[0] / 8) * (rgb ? dimensions[4] : 1); 
    140       int off = (height - 1) * len; 
    141       int newOff = 0; 
    142       for (int i=0; i<height; i++) { 
    143         System.arraycopy(plane, off, t, newOff, len); 
    144         off -= len; 
    145         newOff += len; 
    146       } 
    147       updateMinMax(t, no); 
    148       return t; 
    149     } 
    150     updateMinMax(plane, no); 
    151     return plane; 
     159      int scanline = sizeX[0] * bpp * sizeC[0];  
     160      for (int y=0; y<sizeY[0]; y++) { 
     161        for (int x=0; x<scanline; x++) { 
     162          byte bottom = buf[y*scanline + x]; 
     163          buf[y*scanline + x] = buf[(sizeY[0] - y - 1)*scanline + x]; 
     164          buf[(sizeY[0] - y - 1)*scanline + x] = bottom;  
     165        } 
     166      } 
     167    } 
     168    updateMinMax(buf, no); 
     169    return buf; 
    152170  } 
    153171 
     
    326344      else if(orderToken.equals("ch")) { 
    327345        dimensions[4] = Integer.parseInt(imageToken); 
     346        if (dimensions[4] > 4) rgb = false;  
    328347      } 
    329348      else { 
     
    343362    if (endian != null) { 
    344363      StringTokenizer endianness = new StringTokenizer(endian); 
    345       int firstByte = 0; 
    346       int lastByte = 0; 
    347  
    348       for(int i=0; i<endianness.countTokens(); i++) { 
    349         if (i == 0) firstByte = Integer.parseInt(endianness.nextToken()); 
    350         else lastByte = Integer.parseInt(endianness.nextToken()); 
    351       } 
    352       if (lastByte < firstByte) littleEndian = false; 
     364      String firstByte = endianness.nextToken(); 
     365      int first = Integer.parseInt(firstByte); 
     366      littleEndian = ((String) getMeta("format")).equals("real") ?  
     367        first == 1 : first != 1; 
    353368    } 
    354369 
Note: See TracChangeset for help on using the changeset viewer.