Changeset 2690


Ignore:
Timestamp:
04/27/07 07:48:29 (13 years ago)
Author:
melissa
Message:

Bug fixes.

Location:
trunk/loci/formats/in
Files:
3 edited

Legend:

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

    r2687 r2690  
    6262  private byte[] pg = null; 
    6363  private byte[] pb = null; 
     64  private boolean isRLE = false; 
    6465 
    6566  // -- Constructor -- 
     
    9596  public byte[] openBytes(int no) throws FormatException, IOException { 
    9697    byte[] buf = 
    97       new byte[core.sizeX[0] * bmpScanLineSize * (bmpBitsPerPixel / 8)]; 
     98      new byte[core.sizeY[0] * bmpScanLineSize * (bmpBitsPerPixel / 8)]; 
    9899    return openBytes(no, buf); 
    99100  } 
     
    114115    in.seek(fileOff); 
    115116 
     117    if (isRLE) { 
     118      long nextOff = no < core.imageCount[0] - 1 ?  
     119        ((Long) offsets.get(no + 1)).longValue() : in.length();     
     120      byte[] b = new byte[(int) (nextOff - fileOff)]; 
     121      in.read(b); 
     122      return decodeRLE(b); 
     123    } 
     124 
    116125    int pad = bmpScanLineSize - core.sizeX[0]*(bmpBitsPerPixel / 8); 
    117126    int scanline = core.sizeX[0] * (bmpBitsPerPixel / 8); 
    118  
     127     
    119128    for (int i=core.sizeY[0] - 1; i>=0; i--) { 
    120129      in.read(buf, i*scanline, scanline); 
     
    303312                } 
    304313 
    305                 if (bmpCompression != 0) { 
     314                if (bmpCompression == 1) { 
     315                  // MS RLE compression scheme 
     316 
     317                  isRLE = true; 
     318                }  
     319                else if (bmpCompression != 0) { 
    306320                  whine("Sorry, compressed AVI files not supported."); 
    307321                } 
     
    383397                  type.substring(2).equals("dc")) 
    384398                { 
    385                   offsets.add(new Long(in.getFilePointer())); 
    386                   in.skipBytes(core.sizeY[0] * bmpScanLineSize); 
     399                  if (size > 1000) offsets.add(new Long(in.getFilePointer())); 
     400                  in.skipBytes(size); 
    387401                } 
    388402 
     
    458472  } 
    459473 
     474  /** Decodes an RLE-encoded frame. */ 
     475  private byte[] decodeRLE(byte[] in) { 
     476    /* debug */ System.out.println("decoding input stream (" + in.length + ")");  
     477     
     478    int pt = 0; 
     479    int code = 0; 
     480    int extra = 0; 
     481    byte stream = 0; 
     482 
     483    int pixelPt = 0; 
     484    int row = core.sizeX[0] * core.sizeC[0]; 
     485    int rowPt = (core.sizeY[0] - 1) * row; 
     486    int frameSize = core.sizeY[0] * row; 
     487 
     488    byte[] output = new byte[frameSize]; 
     489 
     490    while (rowPt >= 0) { 
     491      code = stream; 
     492 
     493      if (code == 0) { 
     494        stream = in[pt++]; 
     495        if (stream == 0) { 
     496          rowPt -= row; 
     497          pixelPt = 0; 
     498        } 
     499        else if (stream == 1) return output;  
     500        else if (stream == 2) { 
     501          stream = in[pt++]; 
     502          pixelPt += stream; 
     503          stream = in[pt++]; 
     504          rowPt -= stream * row; 
     505        } 
     506        else { 
     507          if ((rowPt + pixelPt + stream > frameSize) || (rowPt < 0)) { 
     508            return output; 
     509          } 
     510           
     511          code = stream; 
     512          extra = stream & 0x01; 
     513          if (stream + code + extra > in.length) return output; 
     514 
     515          while (code-- > 0) { 
     516            stream = in[pt++]; 
     517            output[rowPt + pixelPt] = stream; 
     518            pixelPt++; 
     519          } 
     520         
     521          if (extra != 0) pt++;  
     522        } 
     523      } 
     524      else { 
     525        if ((rowPt + pixelPt + stream > frameSize) || (rowPt < 0)) { 
     526          return output; 
     527        } 
     528            
     529        stream = in[pt++]; 
     530        
     531        while (code-- > 0) { 
     532          output[rowPt + pixelPt] = stream; 
     533          pixelPt++; 
     534        } 
     535      } 
     536    } 
     537 
     538    return output;  
     539  } 
     540 
    460541} 
  • trunk/loci/formats/in/EPSReader.java

    r2687 r2690  
    210210 
    211211    if (bps == 0) bps = 8; 
     212 
     213    if (core.sizeC[0] == 0) core.sizeC[0] = 1; 
    212214 
    213215    core.sizeZ[0] = 1; 
  • trunk/loci/formats/in/QTReader.java

    r2687 r2690  
    260260 
    261261      for (int row=0; row<core.sizeY[0]; row++) { 
    262         System.arraycopy(prevPixels, row*(core.sizeY[0]+pad), bytes, 
     262        System.arraycopy(prevPixels, row*(core.sizeX[0]+pad), bytes, 
    263263          row*core.sizeX[0], core.sizeX[0]); 
    264264      } 
Note: See TracChangeset for help on using the changeset viewer.