Changeset 4853


Ignore:
Timestamp:
02/27/09 13:25:26 (11 years ago)
Author:
melissa
Message:

Fixed how PictReader detects the pixel type and channel count.

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

Legend:

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

    r4826 r4853  
    196196        pict.setId("OPENLAB_PICT"); 
    197197 
    198         if (FormatTools.getBytesPerPixel(pict.getPixelType()) == 2 && 
    199           FormatTools.getBytesPerPixel(getPixelType()) == 1) 
    200         { 
    201           // Pixel counts don't match -- e.g. the Openlab file said 8 bit 
    202           // grey, but the PICTs inside contained a 16-bit lookup table 
    203           // and we now have 48-bit RGB planar. 
    204           // Reduce to 8 bit grey (or 24 bit RGB) by dropping every other byte. 
    205           byte[] tmpBuf2 = new byte[tmpBuf.length * 2]; 
    206           pict.openBytes(0, tmpBuf2, x, y, w, h); 
    207           for (int i=0; i<tmpBuf.length; i++) { 
    208             tmpBuf[i] = tmpBuf2[i * 2]; 
    209           } 
    210         } 
    211         else if (getPixelType() != pict.getPixelType()) { 
     198        if (getPixelType() != pict.getPixelType()) { 
    212199          throw new FormatException("Pixel type of inner PICT does not match " + 
    213200            "pixel type of Openlab file"); 
    214201        } 
    215         else pict.openBytes(0, tmpBuf, x, y, w, h); 
     202 
     203        if (isIndexed()) { 
     204          luts.setElementAt(pict.get8BitLookupTable(), 
     205            planeOffsets[series][lastPlane]); 
     206        } 
     207 
     208        pict.openBytes(0, tmpBuf, x, y, w, h); 
    216209 
    217210        if (getRGBChannelCount() == 1) { 
     
    527520        case MAC_256_GREYS: 
    528521          core[i].pixelType = FormatTools.UINT8; 
    529           if (core[i].imageCount > 1 && (core[i].sizeX * core[i].sizeY < 
    530             (planes[planeOffsets[i][1]].planeOffset - 
    531             planes[planeOffsets[i][0]].planeOffset))) 
    532           { 
    533             core[i].pixelType = FormatTools.UINT16; 
    534           } 
    535522          core[i].rgb = false; 
    536523          core[i].sizeC = 1; 
    537524          core[i].interleaved = false; 
     525          core[i].indexed = planes[planeOffsets[i][0]].pict; 
    538526          break; 
    539527        case MAC_256_COLORS: 
  • trunk/components/bio-formats/src/loci/formats/in/PictReader.java

    r4681 r4853  
    8080 
    8181  /** Color lookup table for palette color images. */ 
    82   protected short[][] lookup; 
     82  protected byte[][] lookup; 
    8383 
    8484  /** Helper reader in case this one fails. */ 
     
    100100  public void setLegacy(boolean legacy) { 
    101101    this.legacy = legacy; 
     102  } 
     103 
     104 
     105  /** 
     106   * @see loci.formats.IFormatReader#get8BitLookupTable() 
     107   */ 
     108  public byte[][] get8BitLookupTable() throws FormatException, IOException { 
     109    FormatTools.assertId(currentId, true, 0); 
     110    return lookup; 
    102111  } 
    103112 
     
    136145      byte[] row; 
    137146 
    138       plane *= 2; 
    139  
    140       for (int i=0; i<getSizeY(); i++) { 
     147      for (int i=y; i<y+h; i++) { 
    141148        row = (byte[]) strips.get(i); 
    142  
    143         for (int j=0; j<row.length; j++) { 
    144           if (j < getSizeX()) { 
    145             int ndx = row[j]; 
    146             if (ndx < 0) ndx += lookup[0].length; 
    147             ndx = ndx % lookup[0].length; 
    148  
    149             int outIndex = i*getSizeX()*2 + j*2; 
    150  
    151             if (2*plane + outIndex + 2 < buf.length) { 
    152               DataTools.unpackShort(lookup[0][ndx], buf, outIndex, false); 
    153               DataTools.unpackShort(lookup[1][ndx], buf, plane + outIndex, 
    154                 false); 
    155               DataTools.unpackShort(lookup[2][ndx], buf, 2*plane + outIndex, 
    156                 false); 
    157             } 
    158           } 
    159           else j = row.length; 
    160         } 
     149        int len = (int) Math.min(row.length, w); 
     150        System.arraycopy(row, x, buf, (i - y) * w, len); 
    161151      } 
    162152    } 
     
    216206    core[0].sizeX = in.readShort(); 
    217207    core[0].sizeZ = 1; 
    218     core[0].sizeC = 3; 
     208    core[0].sizeC = 1; 
    219209    core[0].sizeT = 1; 
    220210    core[0].dimensionOrder = "XYCZT"; 
    221     core[0].rgb = true; 
    222211    core[0].imageCount = 1; 
    223     core[0].indexed = false; 
    224212    core[0].falseColor = false; 
    225213    core[0].metadataComplete = true; 
    226214    core[0].interleaved = false; 
     215    core[0].pixelType = FormatTools.UINT8; 
    227216 
    228217    strips = new Vector(); 
     
    267256    while (drivePictDecoder(opcode)); 
    268257 
    269     core[0].pixelType = lookup != null ? FormatTools.UINT16 : FormatTools.UINT8; 
     258    core[0].rgb = getSizeC() > 1; 
     259    core[0].indexed = !isRGB() && lookup != null; 
    270260 
    271261    // The metadata store we're working with. 
     
    374364 
    375365      count++; 
    376       lookup = new short[3][count]; 
     366      lookup = new byte[3][count]; 
    377367 
    378368      for (int i=0; i<count; i++) { 
    379369        int index = in.readShort(); 
    380370        if ((flags & 0x8000) != 0) index = i; 
    381         lookup[0][index] = in.readShort(); 
    382         lookup[1][index] = in.readShort(); 
    383         lookup[2][index] = in.readShort(); 
     371        lookup[0][index] = in.readByte(); 
     372        in.skipBytes(1); 
     373        lookup[1][index] = in.readByte(); 
     374        in.skipBytes(1); 
     375        lookup[2][index] = in.readByte(); 
     376        in.skipBytes(1); 
    384377      } 
    385378    } 
     
    448441            } 
    449442            strips.add(uBufI); 
     443            core[0].sizeC = 3; 
    450444            break; 
    451445          case 8: 
     
    485479          unpackBits(buf, uBufI); 
    486480          strips.add(uBufI); 
     481          core[0].sizeC = 3; 
    487482        } 
    488483        else { 
     
    497492          strips.add(outBuf); 
    498493        } 
    499         else if (pixelSize == 8) strips.add(uBuf); 
     494        else if (pixelSize == 8) { 
     495          strips.add(uBuf); 
     496        } 
    500497        else if (pixelSize == 24 || pixelSize == 32) { 
    501498          byte[] newBuf = null; 
     
    510507            strips.add(newBuf); 
    511508          } 
     509          core[0].sizeC = 3; 
    512510        } 
    513511      } 
Note: See TracChangeset for help on using the changeset viewer.