Changeset 5741


Ignore:
Timestamp:
12/15/09 13:54:01 (10 years ago)
Author:
curtis
Message:

Fix ND2 padding issue for images with odd widths.

Location:
trunk/components/bio-formats/src/loci/formats
Files:
2 edited

Legend:

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

    r5708 r5741  
    317317    int w, int h, byte[] buf) throws IOException 
    318318  { 
     319    return readPlane(s, x, y, w, h, 0, buf); 
     320  } 
     321 
     322  /** Reads a raw plane from disk. */ 
     323  protected byte[] readPlane(RandomAccessInputStream s, int x, int y, 
     324    int w, int h, int scanlinePad, byte[] buf) throws IOException 
     325  { 
    319326    int c = getRGBChannelCount(); 
    320327    int bpp = FormatTools.getBytesPerPixel(getPixelType()); 
    321     if (x == 0 && y == 0 && w == getSizeX() && h == getSizeY()) { 
     328    if (x == 0 && y == 0 && w == getSizeX() && h == getSizeY() && 
     329      scanlinePad == 0) 
     330    { 
    322331      s.read(buf); 
    323332    } 
    324     else if (x == 0 && w == getSizeX()) { 
     333    else if (x == 0 && w == getSizeX() && scanlinePad == 0) { 
    325334      if (isInterleaved()) { 
    326335        s.skipBytes(y * w * bpp * c); 
     
    332341          s.skipBytes(y * rowLen); 
    333342          s.read(buf, channel * h * rowLen, h * rowLen); 
    334           s.skipBytes((getSizeY() - y - h) * rowLen); 
     343          if (channel < c - 1) { 
     344            // no need to skip bytes after reading final channel 
     345            s.skipBytes((getSizeY() - y - h) * rowLen); 
     346          } 
    335347        } 
    336348      } 
    337349    } 
    338350    else { 
     351      int scanlineWidth = getSizeX() + scanlinePad; 
    339352      if (isInterleaved()) { 
    340         s.skipBytes(y * getSizeX() * bpp * c); 
     353        s.skipBytes(y * scanlineWidth * bpp * c); 
    341354        for (int row=0; row<h; row++) { 
    342355          s.skipBytes(x * bpp * c); 
    343356          s.read(buf, row * w * bpp * c, w * bpp * c); 
    344           s.skipBytes(bpp * c * (getSizeX() - w - x)); 
     357          if (row < h - 1) { 
     358            // no need to skip bytes after reading final row 
     359            s.skipBytes(bpp * c * (scanlineWidth - w - x)); 
     360          } 
    345361        } 
    346362      } 
    347363      else { 
    348364        for (int channel=0; channel<c; channel++) { 
    349           s.skipBytes(y * getSizeX() * bpp); 
     365          s.skipBytes(y * scanlineWidth * bpp); 
    350366          for (int row=0; row<h; row++) { 
    351367            s.skipBytes(x * bpp); 
    352368            s.read(buf, channel * w * h * bpp + row * w * bpp, w * bpp); 
    353             s.skipBytes(bpp * (getSizeX() - w - x)); 
     369            if (row < h - 1 || channel < c - 1) { 
     370              // no need to skip bytes after reading final row of final channel 
     371              s.skipBytes(bpp * (scanlineWidth - w - x)); 
     372            } 
    354373          } 
    355           s.skipBytes(getSizeX() * bpp * (getSizeY() - y - h)); 
     374          if (channel < c - 1) { 
     375            // no need to skip bytes after reading final channel 
     376            s.skipBytes(scanlineWidth * bpp * (getSizeY() - y - h)); 
     377          } 
    356378        } 
    357379      } 
  • trunk/components/bio-formats/src/loci/formats/in/NativeND2Reader.java

    r5732 r5741  
    163163    else { 
    164164      // plane is not compressed 
    165       readPlane(in, x, y, w, h, buf); 
     165      int scanlinePad = getSizeX() % 2 == 0 ? 0 : 1; // round up to even width 
     166      readPlane(in, x, y, w, h, scanlinePad, buf); 
    166167    } 
    167168 
Note: See TracChangeset for help on using the changeset viewer.