Changeset 5755


Ignore:
Timestamp:
12/18/09 12:20:51 (10 years ago)
Author:
melissa
Message:
  • Tweaked file length check.
  • Added support for JPEG-compressed PICT files. Closes #453.
Location:
trunk/components/bio-formats/src/loci/formats
Files:
2 edited

Legend:

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

    r5752 r5755  
    129129    } 
    130130 
    131     if (new Location(id).length() == 0) { 
     131    RandomAccessInputStream s = new RandomAccessInputStream(id); 
     132    long length = s.length(); 
     133    s.close(); 
     134    if (length == 0) { 
    132135      throw new FormatException("This file is invalid, as it has length 0."); 
    133136    } 
  • trunk/components/bio-formats/src/loci/formats/in/PictReader.java

    r5520 r5755  
    3333import loci.formats.FormatTools; 
    3434import loci.formats.MetadataTools; 
     35import loci.formats.codec.ByteVector; 
    3536import loci.formats.codec.CodecOptions; 
     37import loci.formats.codec.JPEGCodec; 
    3638import loci.formats.codec.PackbitsCodec; 
    3739import loci.formats.gui.AWTImageTools; 
     
    6365  private static final int PICT_END = 0xff; 
    6466  private static final int PICT_LONGCOMMENT = 0xa1; 
     67  private static final int PICT_JPEG = 0x18; 
     68  private static final int PICT_TYPE_1 = 0xa9f; 
     69  private static final int PICT_TYPE_2 = 0x9190; 
    6570 
    6671  /** Table used in expanding pixels that use less than 8 bits. */ 
     
    9499 
    95100  private boolean legacy = false; 
     101  private Vector<Long> jpegOffsets = new Vector<Long>(); 
    96102 
    97103  // -- Constructor -- 
     
    125131  { 
    126132    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
     133 
     134    if (jpegOffsets.size() > 0) { 
     135      ByteVector v = new ByteVector(); 
     136      in.seek(jpegOffsets.get(0)); 
     137      byte[] b = new byte[(int) (in.length() - in.getFilePointer())]; 
     138      in.read(b); 
     139      RandomAccessInputStream s = new RandomAccessInputStream(b); 
     140      for (long jpegOffset : jpegOffsets) { 
     141        s.seek(jpegOffset - jpegOffsets.get(0)); 
     142 
     143        CodecOptions options = new CodecOptions(); 
     144        options.interleaved = isInterleaved(); 
     145        options.littleEndian = isLittleEndian(); 
     146 
     147        v.add(new JPEGCodec().decompress(s, options)); 
     148      } 
     149 
     150      s = new RandomAccessInputStream(v.toByteArray()); 
     151      readPlane(s, x, y, w, h, buf); 
     152      s.close(); 
     153 
     154      return buf; 
     155    } 
     156 
    127157    if (legacy || strips.size() == 0) { 
    128158      in.seek(512); 
     
    206236      lookup = null; 
    207237      legacy = false; 
     238      jpegOffsets.clear(); 
    208239    } 
    209240  } 
     
    259290      int pixelsPerInchX = in.readInt(); 
    260291      int pixelsPerInchY = in.readInt(); 
    261       in.skipBytes(12); 
     292      in.skipBytes(4); 
     293      core[0].sizeY = in.readShort(); 
     294      core[0].sizeX = in.readShort(); 
     295      in.skipBytes(4); 
    262296    } 
    263297    else throw new FormatException("Invalid PICT file"); 
     
    271305          in.skipBytes(1); 
    272306        } 
    273         opcode = in.readShort(); 
     307        opcode = in.readShort() & 0xffff; 
    274308      } 
    275309    } 
     
    317351      case PICT_END: // end of PICT 
    318352        return false; 
     353      case PICT_TYPE_1: 
     354      case PICT_TYPE_2: 
     355        x = in.read(); 
     356        in.skipBytes(x); 
     357        break; 
     358      case PICT_JPEG: 
     359        jpegOffsets.add(in.getFilePointer() + 2); 
     360        core[0].sizeC = 3; 
     361        core[0].rgb = true; 
     362        while ((in.readShort() & 0xffff) != 0xffd9 && 
     363          in.getFilePointer() < in.length()); 
     364        while (in.getFilePointer() < in.length()) { 
     365          while ((in.readShort() & 0xffff) != 0xffd8 && 
     366            in.getFilePointer() < in.length()); 
     367          if (in.getFilePointer() < in.length()) { 
     368            jpegOffsets.add(in.getFilePointer() - 2); 
     369          } 
     370        } 
     371        core[0].interleaved = true; 
     372        break; 
    319373      default: 
    320374        if (opcode < 0) { 
    321           throw new FormatException("Invalid opcode: " + opcode); 
     375          //throw new FormatException("Invalid opcode: " + opcode); 
     376          warn("Invalid opcode: " + opcode); 
    322377        } 
    323378    } 
Note: See TracChangeset for help on using the changeset viewer.