Changeset 4814


Ignore:
Timestamp:
02/17/09 14:12:35 (11 years ago)
Author:
melissa
Message:

Sync 4.0 branch with trunk. r4803 is omitted because it breaks some signed data - see ticket #359.

Location:
branches/4.0.0/components
Files:
24 edited
3 copied

Legend:

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

    r4681 r4814  
    192192      // verify key contains at least one alphabetic character 
    193193      if (!key.matches(".*[a-zA-Z].*")) return; 
     194 
     195      // remove <, > and & to prevent XML parsing errors 
     196      String[] invalidSequences = new String[] { 
     197        "&lt;", "&gt;", "&amp;", "<", ">", "&" 
     198      }; 
     199      for (int i=0; i<invalidSequences.length; i++) { 
     200        key = key.replaceAll(invalidSequences[i], ""); 
     201        val = val.replaceAll(invalidSequences[i], ""); 
     202      } 
    194203    } 
    195204 
  • branches/4.0.0/components/bio-formats/src/loci/formats/IFormatWriter.java

    r4359 r4814  
    4040  /** 
    4141   * Saves the given image to the current file. 
     42   * Note that this method will append the image to the file; it will not 
     43   * overwrite previously saved images. 
    4244   * If this image is the last one in the file, the last flag must be set. 
    4345   */ 
     
    4648  /** 
    4749   * Saves the given image to the given series in the current file. 
     50   * Note that this method will append the image to the file; it will not 
     51   * overwrite previously saved images. 
    4852   * If this image is the last one in the series, the lastInSeries flag 
    4953   * must be set. 
     
    5559  /** 
    5660   * Saves the given byte array to the current file. 
     61   * Note that this method will append the byte array to the file; it will not 
     62   * overwrite previously saved byte arrays. 
    5763   * If this is the last array to be written, the last flag must be set. 
    5864   */ 
     
    6268  /** 
    6369   * Saves the given byte array to the given series in the current file. 
     70   * Note that this method will append the byte array to the file; it will not 
     71   * overwrite previously saved byte arrays. 
    6472   * If this is the last array in the series, the lastInSeries flag must be set. 
    6573   * If this is the last array to be written, the last flag must be set. 
  • branches/4.0.0/components/bio-formats/src/loci/formats/ImageReader.java

    r4590 r4814  
    444444  /* @see IFormatReader#close(boolean) */ 
    445445  public void close(boolean fileOnly) throws IOException { 
    446     if (currentId == null) return; // nothing to close 
    447     getReader().close(fileOnly); 
     446    for (int i=0; i<readers.length; i++) { 
     447      readers[i].close(fileOnly); 
     448    } 
    448449    if (!fileOnly) currentId = null; 
    449450  } 
  • branches/4.0.0/components/bio-formats/src/loci/formats/MetadataTools.java

    r4762 r4814  
    239239    for (int i=0; i<r.getSeriesCount(); i++) { 
    240240      r.setSeries(i); 
    241       store.setPixelsID("Pixels:0", i, 0); 
    242       store.setImageDefaultPixels("Pixels:0", i); 
     241      store.setPixelsID("Pixels:" + i, i, 0); 
     242      store.setImageDefaultPixels("Pixels:" + i, i); 
    243243      store.setPixelsSizeX(new Integer(r.getSizeX()), i, 0); 
    244244      store.setPixelsSizeY(new Integer(r.getSizeY()), i, 0); 
     
    258258            store.setChannelComponentIndex( 
    259259              new Integer(c * r.getRGBChannelCount() + rgb), i, c, rgb); 
    260             store.setChannelComponentPixels("Pixels:0", i, c, rgb); 
     260            store.setChannelComponentPixels("Pixels:" + i, i, c, rgb); 
    261261          } 
    262262        } 
  • branches/4.0.0/components/bio-formats/src/loci/formats/TiffTools.java

    r4753 r4814  
    325325      Hashtable ifd = getIFD(in, ifdNum, offset, bigTiff); 
    326326      if (ifd == null || ifd.size() <= 1) break; 
    327       v.add(ifd); 
     327      // if width or length entries are not present, the IFD is invalid 
     328      if (ifd.get(new Integer(IMAGE_WIDTH)) != null && 
     329        ifd.get(new Integer(IMAGE_LENGTH)) != null) 
     330      { 
     331        v.add(ifd); 
     332      } 
    328333      offset = bigTiff ? in.readLong() : (long) (in.readInt() & 0xffffffffL); 
    329334      if (offset <= 0 || offset >= in.length()) break; 
     
    11561161    } 
    11571162 
     1163    // rowsPerStrip should never be more than the total number of rows 
     1164    for (int i=0; i<rowsPerStripArray.length; i++) { 
     1165      rowsPerStripArray[i] = (long) Math.min(rowsPerStripArray[i], imageLength); 
     1166    } 
     1167 
    11581168    long rowsPerStrip = rowsPerStripArray[0]; 
    1159     // rowsPerStrip should never be more than the total number of rows 
    1160     rowsPerStrip = (long) Math.min(rowsPerStrip, imageLength); 
    11611169    for (int i=1; i<rowsPerStripArray.length; i++) { 
    11621170      if (rowsPerStrip != rowsPerStripArray[i]) { 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/ARFReader.java

    r4784 r4814  
    105105    in.skipBytes(2); // 'AR' signature 
    106106    int version = in.readUnsignedShort(); 
     107    int width = in.readUnsignedShort(); 
    107108    int height = in.readUnsignedShort(); 
    108     int width = in.readUnsignedShort(); 
    109109    int bitsPerPixel = in.readUnsignedShort(); 
    110110    int numImages = version == 2 ? in.readUnsignedShort() : 1; 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/FlexReader.java

    r4750 r4814  
    5858  private int binX, binY; 
    5959 
     60  private int plateCount; 
     61  private int wellCount; 
     62  private int fieldCount; 
     63 
     64  private Vector channelNames; 
     65 
     66  private Vector xPositions; 
     67  private Vector yPositions; 
     68 
    6069  // -- Constructor -- 
    6170 
     
    113122    super.close(); 
    114123    factors = null; 
     124    binX = binY = 0; 
     125    plateCount = wellCount = fieldCount = 0; 
     126    channelNames = null; 
    115127  } 
    116128 
     
    121133    super.initStandardMetadata(); 
    122134 
    123     core[0].orderCertain = false; 
     135    core[0].dimensionOrder = "XYCZT"; 
     136    core[0].sizeC = 0; 
     137    core[0].sizeT = 0; 
     138    core[0].sizeZ = 0; 
     139 
     140    channelNames = new Vector(); 
     141    xPositions = new Vector(); 
     142    yPositions = new Vector(); 
    124143 
    125144    // parse factors from XML 
     
    136155    MetadataStore store = 
    137156      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    138     store.setInstrumentID("Instrument:0", 0); 
    139157 
    140158    Vector n = new Vector(); 
     
    143161    DataTools.parseXML(c, handler); 
    144162 
     163    core[0].sizeC = (int) Math.max(channelNames.size(), 1); 
     164 
     165    if (getSizeZ() == 0) core[0].sizeZ = 1; 
     166    if (getSizeT() == 0) core[0].sizeT = 1; 
     167    if (plateCount == 0) plateCount = 1; 
     168    if (wellCount == 0) wellCount = 1; 
     169    if (fieldCount == 0) fieldCount = 1; 
     170 
     171    core[0].imageCount = getSizeZ() * getSizeC() * getSizeT(); 
     172    int seriesCount = plateCount * wellCount * fieldCount; 
     173 
     174    if (getImageCount() * seriesCount < ifds.length) { 
     175      core[0].imageCount = ifds.length / seriesCount; 
     176      core[0].sizeZ = 1; 
     177      core[0].sizeC = 1; 
     178      core[0].sizeT = ifds.length / seriesCount; 
     179    } 
     180 
     181    CoreMetadata oldCore = core[0]; 
     182    core = new CoreMetadata[seriesCount]; 
     183    core[0] = oldCore; 
     184 
     185    for (int i=1; i<seriesCount; i++) { 
     186      core[i] = new CoreMetadata(); 
     187      core[i].sizeX = getSizeX(); 
     188      core[i].sizeY = getSizeY(); 
     189      core[i].sizeZ = getSizeZ(); 
     190      core[i].sizeC = getSizeC(); 
     191      core[i].sizeT = getSizeT(); 
     192      core[i].imageCount = getSizeZ() * getSizeC() * getSizeT(); 
     193      core[i].dimensionOrder = getDimensionOrder(); 
     194      core[i].rgb = isRGB(); 
     195      core[i].interleaved = isInterleaved(); 
     196      core[i].indexed = isIndexed(); 
     197      core[i].littleEndian = isLittleEndian(); 
     198    } 
     199 
     200    int totalPlanes = getSeriesCount() * getImageCount(); 
     201 
    145202    // verify factor count 
    146203    int nsize = n.size(); 
    147204    int fsize = f.size(); 
    148     if (debug && (nsize != fsize || nsize != getImageCount())) { 
     205    if (debug && (nsize != fsize || nsize != totalPlanes)) { 
    149206      LogTools.println("Warning: mismatch between image count, " + 
    150         "names and factors (count=" + getImageCount() + 
     207        "names and factors (count=" + totalPlanes + 
    151208        ", names=" + nsize + ", factors=" + fsize + ")"); 
    152209    } 
     
    155212 
    156213    // parse factor values 
    157     factors = new double[getImageCount()]; 
     214    factors = new double[totalPlanes]; 
    158215    int max = 0; 
    159216    for (int i=0; i<fsize; i++) { 
     
    176233    if (factors[max] > 256) core[0].pixelType = FormatTools.UINT32; 
    177234    else if (factors[max] > 1) core[0].pixelType = FormatTools.UINT16; 
     235    for (int i=1; i<core.length; i++) { 
     236      core[i].pixelType = getPixelType(); 
     237    } 
     238 
     239    MetadataTools.populatePixels(store, this); 
     240    store.setInstrumentID("Instrument:0", 0); 
     241 
     242    int[] lengths = new int[] {plateCount, wellCount, fieldCount}; 
     243 
     244    for (int i=0; i<getSeriesCount(); i++) { 
     245      int[] pos = FormatTools.rasterToPosition(lengths, i); 
     246 
     247      store.setImageID("Image:" + i, i); 
     248      store.setImageInstrumentRef("Instrument:0", i); 
     249      store.setWellSampleIndex(new Integer(i), pos[0], pos[1], pos[2]); 
     250      store.setWellSampleImageRef("Image:" + i, pos[0], pos[1], pos[2]); 
     251      if (pos[2] < xPositions.size()) { 
     252        store.setWellSamplePosX((Float) xPositions.get(pos[2]), pos[0], 
     253          pos[1], pos[2]); 
     254      } 
     255      if (pos[2] < yPositions.size()) { 
     256        store.setWellSamplePosY((Float) yPositions.get(pos[2]), pos[0], 
     257          pos[1], pos[2]); 
     258      } 
     259    } 
     260 
    178261  } 
    179262 
     
    247330        addMeta("Sublayout " + (nextSublayout - 1) + " Field " + 
    248331          (nextField - 1) + " " + currentQName, value); 
     332        Float offset = new Float(value); 
     333        if (currentQName.equals("OffsetX")) xPositions.add(offset); 
     334        else yPositions.add(offset); 
    249335      } 
    250336      else if (currentQName.equals("OffsetZ")) { 
     
    259345        addMeta("Image " + (nextImage - 1) + " " + currentQName, value); 
    260346 
    261         if (currentQName.equals("DateTime")) { 
    262           store.setImageCreationDate(value, nextImage - 1); 
     347        if (currentQName.equals("DateTime") && nextImage == 1) { 
     348          store.setImageCreationDate(value, 0); 
    263349        } 
    264350        else if (currentQName.equals("CameraBinningX")) { 
     
    267353        else if (currentQName.equals("CameraBinningY")) { 
    268354          binY = Integer.parseInt(value); 
     355        } 
     356        else if (currentQName.equals("LightSourceCombinationRef")) { 
     357          if (!channelNames.contains(value)) channelNames.add(value); 
    269358        } 
    270359      } 
     
    286375      if (qName.equals("Array")) { 
    287376        int len = attributes.getLength(); 
    288         for (int i=0; i<len; i++) { 
     377        for (int i=0; i<len; i++, nextArrayImage++) { 
    289378          String name = attributes.getQName(i); 
    290           if (name.equals("Name")) { 
     379          if (name.equals("Name") && nextArrayImage == 0) { 
    291380            names.add(attributes.getValue(i)); 
    292             store.setImageName(attributes.getValue(i), nextArrayImage); 
     381            store.setImageName(attributes.getValue(i), 0); 
    293382          } 
    294383          else if (name.equals("Factor")) factors.add(attributes.getValue(i)); 
    295           else if (name.equals("Description")) { 
    296             store.setImageDescription(attributes.getValue(i), nextArrayImage++); 
     384          else if (name.equals("Description") && nextArrayImage == 0) { 
     385            store.setImageDescription(attributes.getValue(i), 0); 
    297386          } 
    298387        } 
     
    363452        } 
    364453        nextField++; 
     454        int fieldNo = Integer.parseInt(attributes.getValue("No")); 
     455        if (fieldNo > fieldCount) fieldCount++; 
    365456      } 
    366457      else if (qName.equals("Stack")) { 
     
    379470        } 
    380471        nextPlane++; 
     472        int planeNo = Integer.parseInt(attributes.getValue("No")); 
     473        if (planeNo > getSizeZ()) core[0].sizeZ++; 
    381474      } 
    382475      else if (qName.equals("Kinetic")) { 
     
    435528        } 
    436529 
    437         // link Instrument and Image 
    438         store.setImageInstrumentRef("Instrument:0", nextImage); 
    439  
    440530        nextImage++; 
    441          
    442         //Implemented for FLEX v1.7 and bellow 
     531 
     532        //Implemented for FLEX v1.7 and below 
    443533        String x = attributes.getValue("CameraBinningX"); 
    444534        String y = attributes.getValue("CameraBinningY"); 
     
    450540      { 
    451541        parentQName = qName; 
    452         if (qName.equals("Plate")) nextPlate++; 
    453         else if (qName.equals("Well")) nextWell++; 
     542        if (qName.equals("Plate")) { 
     543          nextPlate++; 
     544          plateCount++; 
     545        } 
     546        else if (qName.equals("Well")) { 
     547          nextWell++; 
     548          wellCount++; 
     549        } 
    454550      } 
    455551      else if (qName.equals("WellCoordinate")) { 
     
    457553        addMeta("Well" + ndx + " Row", attributes.getValue("Row")); 
    458554        addMeta("Well" + ndx + " Col", attributes.getValue("Col")); 
    459         store.setWellRow(new Integer(attributes.getValue("Row")), 0,ndx); 
     555        store.setWellRow(new Integer(attributes.getValue("Row")), 0, ndx); 
    460556        store.setWellColumn(new Integer(attributes.getValue("Col")), 0, ndx); 
    461557      } 
     
    468564        for (int i=0; i<attributes.getLength(); i++) { 
    469565          //addMeta("Image " + nextImage + " " + attributes.getQName(i), attributes.getValue(i)); 
    470         }         
     566        } 
    471567      } 
    472568      else if(qName.equals("ImageResolutionY")) { 
     
    475571        for (int i=0; i<attributes.getLength(); i++) { 
    476572          //addMeta("Image " + nextImage + " " + attributes.getQName(i),attributes.getValue(i)); 
    477         }         
     573        } 
    478574      } 
    479575    } 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/LeicaHandler.java

    r4790 r4814  
    300300          } 
    301301          else if (key.endsWith("HighVoltage")) { 
    302             store.setDetectorVoltage(new Float(value), 0, 0); 
    303             store.setDetectorType("Unknown", 0, 0); 
    304  
    305302            if (!detectorNames.contains(object)) { 
    306303              detectorNames.add(object); 
    307304            } 
    308305            int detector = detectorNames.indexOf(object); 
     306            store.setDetectorID("Detector:" + detector, 0, detector); 
     307            store.setDetectorVoltage(new Float(value), 0, detector); 
     308            store.setDetectorType("Unknown", 0, detector); 
    309309            store.setDetectorSettingsDetector("Detector:" + detector, 
    310310              seriesNames.size() - 1, nextDetector); 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/MetamorphReader.java

    r4769 r4814  
    416416        store.setPlaneTimingExposureTime(exposureTime, 0, 0, i); 
    417417      } 
    418       if (i < stageX.length) { 
     418      if (stageX != null && i < stageX.length) { 
    419419        store.setStagePositionPositionX(new Float((float) stageX[i]), 0, 0, i); 
    420420      } 
    421       if (i < stageY.length) { 
     421      if (stageY != null && i < stageY.length) { 
    422422        store.setStagePositionPositionY(new Float((float) stageY[i]), 0, 0, i); 
    423423      } 
     
    447447      store.setDetectorSettingsDetector("Detector:0", 0, i); 
    448448 
    449  
    450       // link LightSource to Image 
    451       store.setLightSourceID("LightSource:" + i, 0, i); 
    452       store.setLightSourceSettingsLightSource("LightSource:" + i, 0, i); 
    453  
    454449      int index = getIndex(0, i, 0); 
    455       if (index < wave.length && (int) wave[index] >= 1) { 
     450      if (wave != null && index < wave.length && (int) wave[index] >= 1) { 
    456451        store.setLightSourceSettingsWavelength( 
    457452          new Integer((int) wave[index]), 0, i); 
     453 
     454        // link LightSource to Image 
     455        store.setLightSourceID("LightSource:" + i, 0, i); 
     456        store.setLightSourceSettingsLightSource("LightSource:" + i, 0, i); 
     457        store.setLaserType("Unknown", 0, i); 
    458458      } 
    459459    } 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/ND2Reader.java

    r4757 r4814  
    662662      core[i].sizeZ = getSizeZ(); 
    663663      core[i].sizeT = getSizeT(); 
    664       core[i].imageCount = getImageCount(); 
     664      core[i].imageCount = getSizeZ() * getSizeT() * (isRGB() ? 1 : getSizeC()); 
    665665      core[i].dimensionOrder = "XYCZT"; 
    666666      core[i].sizeX = x; 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/PSDReader.java

    r4681 r4814  
    225225      int layerLen = in.readInt(); 
    226226      int layerCount = in.readShort(); 
     227 
     228      if (layerCount < 0) { 
     229        throw new FormatException("Vector data is not supported."); 
     230      } 
     231 
    227232      int[] w = new int[layerCount]; 
    228233      int[] h = new int[layerCount]; 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/TiffReader.java

    r4521 r4814  
    7272      metadata.remove("Comment"); 
    7373 
    74       core[0].sizeZ = 1; 
    75       core[0].sizeT = 1; 
     74      int z = 1, t = 1; 
     75      int c = getSizeC(); 
    7676 
    7777      // parse ZCT sizes 
     
    9090        } 
    9191 
    92         if (token.startsWith("channels=")) { 
    93           core[0].sizeC = value; 
    94         } 
    95         else if (token.startsWith("slices=")) { 
    96           core[0].sizeZ = value; 
    97         } 
    98         else if (token.startsWith("frames=")) { 
    99           core[0].sizeT = value; 
    100         } 
     92        if (token.startsWith("channels=")) c = value; 
     93        else if (token.startsWith("slices=")) z = value; 
     94        else if (token.startsWith("frames=")) t = value; 
    10195      } 
    102       if (getSizeZ() * getSizeT() * getSizeC() == getSizeC()) { 
    103         core[0].sizeT = getImageCount(); 
     96      if (z * c * t == c) { 
     97        t = getImageCount(); 
    10498      } 
    10599      core[0].dimensionOrder = "XYCZT"; 
     100 
     101      if (z * t * (isRGB() ? 1 : c) == ifds.length) { 
     102        core[0].sizeZ = z; 
     103        core[0].sizeT = t; 
     104        core[0].sizeC = c; 
     105      } 
     106      else { 
     107        core[0].sizeT = ifds.length; 
     108        core[0].imageCount = ifds.length; 
     109      } 
    106110    } 
    107111 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/TillVisionReader.java

    r4750 r4814  
    362362    for (int i=0; i<getSeriesCount(); i++) { 
    363363      // populate Image data 
    364       store.setImageName((String) imageNames.get(i), i); 
     364      if (i < imageNames.size()) { 
     365        store.setImageName((String) imageNames.get(i), i); 
     366      } 
    365367      String date = i < dates.size() ? (String) dates.get(i) : ""; 
    366368      if (!date.equals("")) { 
  • branches/4.0.0/components/bio-formats/src/loci/formats/in/ZeissLSMReader.java

    r4755 r4814  
    724724        store.setLaserType(laserType, 0, nextLaser); 
    725725 
    726         // link Laser (LightSource) to Image 
    727         store.setLightSourceID("LightSource:" + nextLaser, 0, nextLaser); 
    728         store.setLightSourceSettingsLightSource("LightSource:" + nextLaser, 
    729           0, nextLaser); 
     726        if (nextLaser < getEffectiveSizeC()) { 
     727          // link Laser (LightSource) to Image 
     728          store.setLightSourceID("LightSource:" + nextLaser, 0, nextLaser); 
     729          store.setLightSourceSettingsLightSource("LightSource:" + nextLaser, 
     730            0, nextLaser); 
     731        } 
    730732 
    731733        nextLaser++; 
  • branches/4.0.0/components/bio-formats/src/loci/formats/out/OMETiffWriter.java

    r4749 r4814  
    143143  // -- IFormatWriter API methods -- 
    144144 
     145  /* @see loci.formats.IFormatWriter#saveImage(Image, int, boolean, boolean) */ 
    145146  public void saveImage(Image image, int series, boolean lastInSeries, 
    146147    boolean last) throws FormatException, IOException 
  • branches/4.0.0/components/loci-plugins/src/loci/plugins/BFVirtualStack.java

    r4473 r4814  
    238238 
    239239  public int getSize() { 
     240    if (reader.getCurrentFile() == null) return 0; 
    240241    reader.setSeries(series); 
    241242    if (merge) return new ChannelMerger(reader).getImageCount(); 
  • branches/4.0.0/components/loci-plugins/src/loci/plugins/Colorizer.java

    r4744 r4814  
    8181  private boolean color; 
    8282  private boolean hyperstack; 
    83   private byte[][] lut; 
     83  private byte[][][] lut; 
    8484  private String mergeOption; 
    8585 
     
    118118      hyperstack = gd.getNextBoolean(); 
    119119 
    120       if (color) doPrompt = true; 
     120      if (color && lut == null) doPrompt = true; 
    121121    } 
    122122    else { 
     
    129129      if (color) { 
    130130        if (colorNdx >= 0 && colorNdx < 3) { 
    131           lut = new byte[3][256]; 
    132           for (int q=0; q<lut[colorNdx].length; q++) { 
    133             lut[colorNdx][q] = (byte) q; 
    134           } 
    135         } 
    136         else doPrompt = true; 
     131          lut = new byte[imp.getNChannels()][3][256]; 
     132          for (int channel=0; channel<lut.length; channel++) { 
     133            if (colorNdx + channel >= lut[channel].length) break; 
     134            for (int q=0; q<lut[channel][colorNdx + channel].length; q++) { 
     135              lut[channel][colorNdx + channel][q] = (byte) q; 
     136            } 
     137          } 
     138        } 
     139        else if (lut == null) doPrompt = true; 
    137140      } 
    138141      mergeOption = Macro.getValue(arg, "merge_option", null); 
     
    183186            if (doPrompt) { 
    184187              promptForColor(i); 
    185               LUT channelLut = new LUT(lut[0], lut[1], lut[2]); 
     188            } 
     189            if (lut != null) { 
     190              LUT channelLut = new LUT(lut[i][0], lut[i][1], lut[i][2]); 
    186191              r.setVar("lut", channelLut); 
    187192              r.exec("composite.setChannelLut(lut)"); 
     
    208213        } 
    209214 
    210         IndexColorModel model = new IndexColorModel(8, 256, lut[0], lut[1], 
    211           lut[2]); 
     215        IndexColorModel model = new IndexColorModel(8, 256, lut[0][0], 
     216          lut[0][1], lut[0][2]); 
    212217        newStack.setColorModel(model); 
    213218        newImp.setStack(imp.getTitle(), newStack); 
     
    343348    } 
    344349    if (closeOriginal) imp.close(); 
     350    lut = null; 
     351  } 
     352 
     353  // -- Colorizer API methods -- 
     354 
     355  public void setLookupTable(byte[][] lut, int channel) { 
     356    if (this.lut == null) { 
     357      this.lut = new byte[imp.getNChannels()][][]; 
     358    } 
     359    if (channel < this.lut.length) this.lut[channel] = lut; 
    345360  } 
    346361 
     
    384399    double blueIncrement = ((double) color.getBlue()) / 255; 
    385400 
    386     lut = new byte[3][256]; 
     401    if (lut == null) lut = new byte[imp.getNChannels()][3][256]; 
    387402    for (int i=0; i<256; i++) { 
    388       lut[0][i] = (byte) (i * redIncrement); 
    389       lut[1][i] = (byte) (i * greenIncrement); 
    390       lut[2][i] = (byte) (i * blueIncrement); 
     403      lut[channel][0][i] = (byte) (i * redIncrement); 
     404      lut[channel][1][i] = (byte) (i * greenIncrement); 
     405      lut[channel][2][i] = (byte) (i * blueIncrement); 
    391406    } 
    392407  } 
  • branches/4.0.0/components/loci-plugins/src/loci/plugins/DataBrowser.java

    r4569 r4814  
    2828import com.jgoodies.forms.layout.CellConstraints; 
    2929import com.jgoodies.forms.layout.FormLayout; 
    30 import ij.ImagePlus; 
    31 import ij.ImageStack; 
     30import ij.*; 
    3231import ij.gui.ImageCanvas; 
    3332import ij.gui.StackWindow; 
     
    6059  // -- Fields -- 
    6160 
     61  protected volatile boolean done; 
     62 
    6263  protected JSpinner fpsSpin; 
    6364  protected Button animate, options, metadata; 
     
    7374  protected int[] cLengths; 
    7475  protected int[] cIndex; 
     76 
     77  private int slice; 
    7578 
    7679  // -- Constructors -- 
     
    122125    controls.setBackground(Color.white); 
    123126 
    124     boolean hasZ = sliceSelector != null; 
    125     boolean hasT = frameSelector != null; 
    126     boolean hasC = channelSelector != null; 
     127    int c = imp.getNChannels(); 
     128    int z = imp.getNSlices(); 
     129    int t = imp.getNFrames(); 
     130 
     131    boolean hasZ = z > 1; 
     132    boolean hasC = c > 1; 
     133    boolean hasT = t > 1; 
     134 
     135    if (sliceSelector != null) remove(sliceSelector); 
     136    if (frameSelector != null) remove(frameSelector); 
     137    if (channelSelector != null) remove(channelSelector); 
     138 
     139    ImageJ ij = IJ.getInstance(); 
     140 
     141    if (hasC) { 
     142      channelSelector = new Scrollbar(Scrollbar.HORIZONTAL, 1, 1, 1, c + 1); 
     143      add(channelSelector); 
     144      if (ij != null) channelSelector.addKeyListener(ij); 
     145      channelSelector.addAdjustmentListener(this); 
     146      // prevents scroll bar from blinking on Windows 
     147      channelSelector.setFocusable(false); 
     148      channelSelector.setUnitIncrement(1); 
     149      channelSelector.setBlockIncrement(1); 
     150    } 
     151    if (hasZ) { 
     152      sliceSelector = new Scrollbar(Scrollbar.HORIZONTAL, 1, 1, 1, z + 1); 
     153      add(sliceSelector); 
     154      if (ij != null) sliceSelector.addKeyListener(ij); 
     155      sliceSelector.addAdjustmentListener(this); 
     156      sliceSelector.setFocusable(false); 
     157      int blockIncrement = (int) Math.max(z / 10, 1); 
     158      sliceSelector.setUnitIncrement(1); 
     159      sliceSelector.setBlockIncrement(blockIncrement); 
     160    } 
     161    if (hasT) { 
     162      frameSelector = new Scrollbar(Scrollbar.HORIZONTAL, 1, 1, 1, t + 1); 
     163      add(frameSelector); 
     164      if (ij != null) frameSelector.addKeyListener(ij); 
     165      frameSelector.addAdjustmentListener(this); 
     166      frameSelector.setFocusable(false); 
     167      int blockIncrement = (int) Math.max(t / 10, 1); 
     168      frameSelector.setUnitIncrement(1); 
     169      frameSelector.setBlockIncrement(blockIncrement); 
     170    } 
    127171 
    128172    Label zLabel = new Label("Z-depth"); 
     
    268312              if (t > sizeT) t = 1; 
    269313              setPosition(c, z, t); 
     314              imp.setPosition(c, z, t); 
     315              updateSlice(); 
    270316              int fps = ((Number) fpsSpin.getValue()).intValue(); 
    271317              ms = 1000 / fps; 
     
    381427            AdjustmentEvent.ADJUSTMENT_VALUE_CHANGED, AdjustmentEvent.TRACK, 
    382428            channel)); 
     429          updateSlice(); 
    383430        } 
    384431        return; 
     
    386433    } 
    387434    super.adjustmentValueChanged(e); 
    388   } 
    389  
     435    updateSlice(); 
     436  } 
     437 
     438  public void run() { 
     439    while (!done) { 
     440      synchronized (this) { 
     441        try { 
     442          wait(); 
     443        } 
     444        catch (InterruptedException e) { } 
     445      } 
     446      if (done) return; 
     447      if (slice > 0 && slice != imp.getCurrentSlice()) { 
     448        imp.setSlice(slice); 
     449        slice = 0; 
     450      } 
     451    } 
     452  } 
    390453 
    391454  // -- Helper methods -- 
     455 
     456  private void updateSlice() { 
     457    int[] dims = 
     458      new int[] {imp.getNChannels(), imp.getNSlices(), imp.getNFrames()}; 
     459    int[] pos = 
     460      new int[] {imp.getChannel() - 1, imp.getSlice() - 1, imp.getFrame() - 1}; 
     461    slice = FormatTools.positionToRaster(dims, pos) + 1; 
     462  } 
    392463 
    393464  protected static Scrollbar makeDummySlider() { 
  • branches/4.0.0/components/loci-plugins/src/loci/plugins/Importer.java

    r4730 r4814  
    2828import ij.*; 
    2929import ij.io.FileInfo; 
     30import ij.plugin.filter.PlugInFilterRunner; 
    3031import ij.process.*; 
    3132import java.awt.Rectangle; 
     33import java.awt.image.IndexColorModel; 
    3234import java.io.*; 
    3335import java.util.*; 
     
    6163  private String stackOrder = null; 
    6264 
     65  private IndexColorModel[] colorModels; 
     66 
    6367  // -- Constructor -- 
    6468 
     
    8387      IJ.showStatus("Checking for new version..."); 
    8488      if (Util.newVersionAvailable()) { 
    85         IJ.showMessage("A new stable version of the Bio-Formats plugin is " + 
    86           "available.\nYou can download the latest version from " + 
    87           "http://loci.wisc.edu/ome/formats-download.html"); 
     89        boolean doUpgrade = IJ.showMessageWithCancel("", 
     90          "A new stable version of Bio-Formats is available.\n" + 
     91          "Click 'OK' to upgrade."); 
     92        if (doUpgrade) { 
     93          Updater.install(Updater.STABLE_BUILD); 
     94        } 
    8895      } 
    8996    } 
     
    534541        } 
    535542        else { 
     543          if (r.isIndexed()) colorModels = new IndexColorModel[r.getSizeC()]; 
     544 
    536545          for (int j=0; j<num[i]; j++) { 
    537546            if (!load[j]) continue; 
     
    548557 
    549558            int ndx = j; 
    550             //int ndx = FormatTools.getReorderedIndex(r, stackOrder, j); 
    551559 
    552560            String label = constructSliceLabel(ndx, r, 
     
    558566              plugin.canceled = true; 
    559567              return; 
     568            } 
     569 
     570            int channel = r.getZCTCoords(ndx)[1]; 
     571            if (colorModels != null) { 
     572              colorModels[channel] = (IndexColorModel) ip.getColorModel(); 
    560573            } 
    561574 
     
    823836        } 
    824837        else imp.show(); 
    825         if ((splitC || splitZ || splitT) && !options.isVirtual()) { 
     838 
     839        boolean virtual = options.isViewBrowser() || options.isVirtual(); 
     840 
     841        if ((splitC || splitZ || splitT) && !virtual) { 
    826842          IJ.runPlugIn("loci.plugins.Slicer", "slice_z=" + splitZ + 
    827843            " slice_c=" + splitC + " slice_t=" + splitT + 
     
    850866          } 
    851867        } 
    852         else if ((colorize || customColorize) && !options.isVirtual()) { 
     868        else if ((colorize || customColorize) && !virtual) { 
    853869          IJ.runPlugIn("loci.plugins.Colorizer", "stack_order=" + stackOrder + 
    854870            " merge=false colorize=true ndx=" + (customColorize ? "-1" : "0") + 
    855871            " hyper_stack=" + options.isViewHyperstack() + " "); 
     872        } 
     873        else if (colorModels != null && !virtual) { 
     874          Colorizer colorizer = new Colorizer(); 
     875          String arg = "stack_order=" + stackOrder + " merge=false " + 
     876            "colorize=true hyper_stack=" + options.isViewHyperstack() + " "; 
     877          colorizer.setup(arg, imp); 
     878          for (int channel=0; channel<colorModels.length; channel++) { 
     879            byte[][] lut = new byte[3][256]; 
     880            colorModels[channel].getReds(lut[0]); 
     881            colorModels[channel].getGreens(lut[1]); 
     882            colorModels[channel].getBlues(lut[2]); 
     883            colorizer.setLookupTable(lut, channel); 
     884          } 
     885          new PlugInFilterRunner(colorizer, "", arg); 
    856886        } 
    857887      } 
  • branches/4.0.0/components/loci-plugins/src/loci/plugins/Util.java

    r4735 r4814  
    6767  public static final String VERSION = "4.0.0"; 
    6868 
     69  public static final String REGISTRY = "http://upgrade.openmicroscopy.org.uk"; 
     70 
     71  public static final String[] REGISTRY_PROPERTIES = new String[] { 
     72    "version", "os.name", "os.version", "os.arch", 
     73    "java.runtime.version", "java.vm.vendor" 
     74  }; 
     75 
    6976  // -- Constructor -- 
    7077 
     
    181188 
    182189        ip[i] = new ByteProcessor(w, h, q, null); 
    183         //if (cm != null) ip[i].setColorModel(cm); 
     190        if (cm != null) ip[i].setColorModel(cm); 
    184191      } 
    185192      else if (pixels instanceof short[]) { 
     
    606613    // connect to the registry 
    607614 
    608     StringBuffer query = 
    609       new StringBuffer("http://upgrade.openmicroscopy.org.uk/"); 
    610     String[] properties = new String[] {"version", "os.name", "os.version", 
    611       "os.arch", "java.runtime.version", "java.vm.vendor"}; 
    612     for (int i=0; i<properties.length; i++) { 
     615    StringBuffer query = new StringBuffer(REGISTRY); 
     616    for (int i=0; i<REGISTRY_PROPERTIES.length; i++) { 
    613617      if (i == 0) query.append("?"); 
    614618      else query.append(";"); 
    615       query.append(properties[i]); 
     619      query.append(REGISTRY_PROPERTIES[i]); 
    616620      query.append("="); 
    617621      if (i == 0) query.append(VERSION); 
    618622      else { 
    619623        try { 
    620           query.append( 
    621             URLEncoder.encode(System.getProperty(properties[i]), "UTF-8")); 
     624          query.append(URLEncoder.encode( 
     625            System.getProperty(REGISTRY_PROPERTIES[i]), "UTF-8")); 
    622626        } 
    623627        catch (UnsupportedEncodingException e) { } 
     
    642646      in.close(); 
    643647 
    644       // TODO : registry does not yet return the latest version number 
    645       //return !latestVersion.toString().equals(VERSION); 
    646       return false; 
    647     } 
    648     catch (IOException e) { 
    649       return false; 
    650     } 
     648      // check to see if version reported by registry is greater than 
     649      // the current version - version number should be in "x.x.x" format 
     650 
     651      String[] version = latestVersion.toString().split("\\."); 
     652      String[] thisVersion = VERSION.split("\\."); 
     653      for (int i=0; i<thisVersion.length; i++) { 
     654        int subVersion = Integer.parseInt(thisVersion[i]); 
     655        try { 
     656          int registrySubVersion = Integer.parseInt(version[i]); 
     657          if (registrySubVersion > subVersion) return true; 
     658          if (registrySubVersion < subVersion) return false; 
     659        } 
     660        catch (NumberFormatException e) { 
     661          return false; 
     662        } 
     663      } 
     664    } 
     665    catch (IOException e) { } 
     666    return false; 
    651667  } 
    652668 
  • branches/4.0.0/components/loci-plugins/src/plugins.config

    r4743 r4814  
    4141Plugins>LOCI, "LOCI Plugins Shortcut Window", loci.plugins.ShortcutPanel("") 
    4242 
     43Plugins>LOCI, "-" 
     44Plugins>LOCI, "Update LOCI Plugins", loci.plugins.Updater("") 
     45 
    4346Help>About Plugins, "LOCI Plugins...", loci.plugins.About("") 
  • branches/4.0.0/components/test-suite/build.properties

    r4618 r4814  
    2020 
    2121testng.memory            = 512m 
     22reader-test.class        = loci/tests/testng/FormatReaderTestFactory.class 
     23writer-test.class        = loci/tests/testng/FormatWriterTest.class 
  • branches/4.0.0/components/test-suite/build.xml

    r4612 r4814  
    1818    classname="org.testng.TestNGAntTask"/> 
    1919 
     20  <target name="test-convert" depends="compile" 
     21    description="run automated tests on writers"> 
     22    <testng sourcedir="${dest.dir}" 
     23      classpath="${classes.dir}:${component.classpath}" 
     24      annotations="Javadoc" groups="all" testname="Writer tests" 
     25      listener="loci.tests.testng.DotTestListener" 
     26      suitename="LOCI software test suite"> 
     27      <classfileset file="${classes.dir}/${writer-test.class}"/> 
     28      <sysproperty key="testng.filename" value="${testng.filename}"/> 
     29      <sysproperty key="lurawave.license" value="${lurawave.license}"/> 
     30      <jvmarg value="-mx${testng.memory}"/> 
     31    </testng> 
     32  </target> 
     33 
    2034  <target name="test-all" depends="compile" 
    2135    description="run all automated tests"> 
     
    2539      listener="loci.tests.testng.DotTestListener" 
    2640      suitename="LOCI software test suite"> 
    27       <classfileset dir="${classes.dir}"/> 
     41      <classfileset file="${classes.dir}/${reader-test.class}"/> 
    2842      <sysproperty key="testng.filename" value="${testng.filename}"/> 
    2943      <sysproperty key="testng.directory" value="${testng.directory}"/> 
     
    4155      listener="loci.tests.testng.DotTestListener" 
    4256      suitename="LOCI software test suite"> 
    43       <classfileset dir="${classes.dir}"/> 
     57      <classfileset file="${classes.dir}/${reader-test.class}"/> 
    4458      <sysproperty key="testng.filename" value="${testng.filename}"/> 
    4559      <sysproperty key="testng.directory" value="${testng.directory}"/> 
     
    5771      listener="loci.tests.testng.DotTestListener" 
    5872      suitename="LOCI software test suite"> 
    59       <classfileset dir="${classes.dir}"/> 
     73      <classfileset file="${classes.dir}/${reader-test.class}"/> 
    6074      <sysproperty key="testng.filename" value="${testng.filename}"/> 
    6175      <sysproperty key="testng.directory" value="${testng.directory}"/> 
     
    7387      listener="loci.tests.testng.DotTestListener" 
    7488      suitename="LOCI software test suite"> 
    75       <classfileset dir="${classes.dir}"/> 
     89      <classfileset file="${classes.dir}/${reader-test.class}"/> 
    7690      <sysproperty key="testng.filename" value="${testng.filename}"/> 
    7791      <sysproperty key="testng.directory" value="${testng.directory}"/> 
     
    89103      listener="loci.tests.testng.DotTestListener" 
    90104      suitename="LOCI software test suite"> 
    91       <classfileset dir="${classes.dir}"/> 
     105      <classfileset file="${classes.dir}/${reader-test.class}"/> 
    92106      <sysproperty key="testng.filename" value="${testng.filename}"/> 
    93107      <sysproperty key="testng.directory" value="${testng.directory}"/> 
  • branches/4.0.0/components/test-suite/src/loci/tests/testng/FormatReaderTest.java

    r4550 r4814  
    329329      MetadataRetrieve retrieve = (MetadataRetrieve) reader.getMetadataStore(); 
    330330      success = MetadataTools.isOMEXMLMetadata(retrieve); 
    331       if (!success) msg = shortClassName(retrieve); 
     331      if (!success) msg = TestTools.shortClassName(retrieve); 
    332332 
    333333      for (int i=0; i<reader.getSeriesCount() && success; i++) { 
     
    633633        config.setSeries(i); 
    634634 
    635         String md5 = md5(reader.openBytes(0)); 
     635        String md5 = TestTools.md5(reader.openBytes(0)); 
    636636        String expected = config.getMD5(); 
    637637 
     
    698698              success = false; 
    699699              if (result) { 
    700                 msg = shortClassName(readers[j]) + " flagged \"" + 
    701                   used[i] + "\" but so did " + shortClassName(r); 
     700                msg = TestTools.shortClassName(readers[j]) + " flagged \"" + 
     701                  used[i] + "\" but so did " + TestTools.shortClassName(r); 
    702702              } 
    703703              else { 
    704                 msg = shortClassName(readers[j]) + 
     704                msg = TestTools.shortClassName(readers[j]) + 
    705705                  " skipped \"" + used[i] + "\""; 
    706706              } 
     
    756756        line.append(" indexed=" + reader.isIndexed()); 
    757757        line.append(" falseColor=" + reader.isFalseColor()); 
    758         line.append(" md5=" + md5(reader.openBytes(0))); 
     758        line.append(" md5=" + TestTools.md5(reader.openBytes(0))); 
    759759        line.append("]"); 
    760760      } 
     
    826826    } 
    827827 
    828     LogTools.print(timestamp() + "Initializing " + id + ": "); 
     828    LogTools.print(TestTools.timestamp() + "Initializing " + id + ": "); 
    829829    try { 
    830830      reader.setId(id); 
     
    857857  } 
    858858 
    859   /** Calculate the MD5 of a byte array. */ 
    860   private static String md5(byte[] b) { 
    861     try { 
    862       MessageDigest md = MessageDigest.getInstance("MD5"); 
    863       md.reset(); 
    864       md.update(b); 
    865       byte[] digest = md.digest(); 
    866       StringBuffer sb = new StringBuffer(); 
    867       for (int i=0; i<digest.length; i++) { 
    868         String a = Integer.toHexString(0xff & digest[i]); 
    869         if (a.length() == 1) a = "0" + a; 
    870         sb.append(a); 
    871       } 
    872       return sb.toString(); 
    873     } 
    874     catch (NoSuchAlgorithmException e) { LogTools.trace(e); } 
    875     return null; 
    876   } 
    877  
    878859  /** Outputs test result and generates appropriate assertion. */ 
    879860  private static void result(String testName, boolean success) { 
     
    886867   */ 
    887868  private static void result(String testName, boolean success, String msg) { 
    888     LogTools.println("\t" + timestamp() + ": " + testName + ": " + 
     869    LogTools.println("\t" + TestTools.timestamp() + ": " + testName + ": " + 
    889870      (success ? "PASSED" : "FAILED") + (msg == null ? "" : " (" + msg + ")")); 
    890871    if (msg == null) assert success; 
     
    892873  } 
    893874 
    894   /** Gets the class name sans package for the given object. */ 
    895   private static String shortClassName(Object o) { 
    896     String name = o.getClass().getName(); 
    897     int dot = name.lastIndexOf("."); 
    898     return dot < 0 ? name : name.substring(dot + 1); 
    899   } 
    900  
    901   /** Gets a timestamp for the current moment. */ 
    902   private static String timestamp() { 
    903     return DataTools.convertDate(System.currentTimeMillis(), DataTools.UNIX); 
    904   } 
    905  
    906875} 
Note: See TracChangeset for help on using the changeset viewer.