Changeset 6246


Ignore:
Timestamp:
05/06/10 16:42:25 (10 years ago)
Author:
curtis
Message:

Add API to ImporterOptions for setting series, range and crop values.

Location:
trunk/components
Files:
12 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/components/common/src/loci/common/Region.java

    r6244 r6246  
    4343 
    4444  // -- Constructor -- 
     45 
     46  public Region() { } 
    4547 
    4648  public Region(int x, int y, int width, int height) { 
  • trunk/components/loci-plugins/src/loci/plugins/BF.java

    r6238 r6246  
    2424*/ 
    2525 
    26 package loci.plugins.util; 
     26package loci.plugins; 
    2727 
    2828import ij.IJ; 
     
    3939 * 
    4040 * <dl><dt><b>Source code:</b></dt> 
    41  * <dd><a href="https://skyking.microscopy.wisc.edu/trac/java/browser/trunk/components/loci-plugins/src/loci/plugins/util/BF.java">Trac</a>, 
    42  * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/loci-plugins/src/loci/plugins/util/BF.java">SVN</a></dd></dl> 
     41 * <dd><a href="https://skyking.microscopy.wisc.edu/trac/java/browser/trunk/components/loci-plugins/src/loci/plugins/BF.java">Trac</a>, 
     42 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/loci-plugins/src/loci/plugins/BF.java">SVN</a></dd></dl> 
    4343 */ 
    4444public final class BF { 
     
    6767    options.setQuiet(true); 
    6868    options.showDialogs(); 
    69     ImagePlusReader ipr = new ImagePlusReader(options); 
    70     return ipr.openImagePlus(); 
     69    ImagePlusReader reader = new ImagePlusReader(options); 
     70    return reader.openImagePlus(); 
    7171  } 
    7272 
  • trunk/components/loci-plugins/src/loci/plugins/in/CropDialog.java

    r6229 r6246  
    2828import ij.gui.GenericDialog; 
    2929 
    30 import java.awt.Rectangle; 
    31  
     30import loci.common.Region; 
    3231import loci.formats.IFormatReader; 
    3332import loci.plugins.prefs.OptionsDialog; 
     
    5049  protected IFormatReader r; 
    5150  protected String[] labels; 
    52   protected boolean[] series; 
    53   protected Rectangle[] box; 
    5451 
    5552  // -- Constructor -- 
    5653 
    5754  /** Creates a crop options dialog for the Bio-Formats Importer. */ 
    58   public CropDialog(ImporterOptions options, IFormatReader r, 
    59     String[] labels, boolean[] series, Rectangle[] box) 
    60   { 
     55  public CropDialog(ImporterOptions options, IFormatReader r, String[] labels) { 
    6156    super(options); 
    6257    this.options = options; 
    6358    this.r = r; 
    6459    this.labels = labels; 
    65     this.series = series; 
    66     this.box = box; 
    6760  } 
    6861 
     
    7669  public int showDialog() { 
    7770    GenericDialog gd = new GenericDialog("Bio-Formats Crop Options"); 
    78     for (int i=0; i<series.length; i++) { 
    79       if (!series[i]) continue; 
    80       r.setSeries(i); 
    81       gd.addMessage(labels[i].replaceAll("_", " ")); 
    82       gd.addNumericField("X_Coordinate_" + (i + 1), 0, 0); 
    83       gd.addNumericField("Y_Coordinate_" + (i + 1), 0, 0); 
    84       gd.addNumericField("Width_" + (i + 1), r.getSizeX(), 0); 
    85       gd.addNumericField("Height_" + (i + 1), r.getSizeY(), 0); 
     71    for (int s=0; s<options.getSeriesCount(); s++) { 
     72      if (!options.isSeriesOn(s)) continue; 
     73      r.setSeries(s); 
     74      gd.addMessage(labels[s].replaceAll("_", " ")); 
     75      gd.addNumericField("X_Coordinate_" + (s + 1), 0, 0); 
     76      gd.addNumericField("Y_Coordinate_" + (s + 1), 0, 0); 
     77      gd.addNumericField("Width_" + (s + 1), r.getSizeX(), 0); 
     78      gd.addNumericField("Height_" + (s + 1), r.getSizeY(), 0); 
    8679    } 
    8780    WindowTools.addScrollBars(gd); 
     
    8982    if (gd.wasCanceled()) return STATUS_CANCELED; 
    9083 
    91     for (int i=0; i<series.length; i++) { 
    92       if (!series[i]) continue; 
    93       r.setSeries(i); 
    94       box[i].x = (int) gd.getNextNumber(); 
    95       box[i].y = (int) gd.getNextNumber(); 
    96       box[i].width = (int) gd.getNextNumber(); 
    97       box[i].height = (int) gd.getNextNumber(); 
     84    for (int s=0; s<options.getSeriesCount(); s++) { 
     85      if (!options.isSeriesOn(s)) continue; 
     86      r.setSeries(s); 
    9887 
    99       if (box[i].x < 0) box[i].x = 0; 
    100       if (box[i].y < 0) box[i].y = 0; 
    101       if (box[i].x >= r.getSizeX()) box[i].x = r.getSizeX() - box[i].width - 1; 
    102       if (box[i].y >= r.getSizeY()) box[i].y = r.getSizeY() - box[i].height - 1; 
    103       if (box[i].width < 1) box[i].width = 1; 
    104       if (box[i].height < 1) box[i].height = 1; 
    105       if (box[i].width + box[i].x > r.getSizeX()) { 
    106         box[i].width = r.getSizeX() - box[i].x; 
     88      Region box = options.getCropRegion(s); 
     89 
     90      box.x = (int) gd.getNextNumber(); 
     91      box.y = (int) gd.getNextNumber(); 
     92      box.width = (int) gd.getNextNumber(); 
     93      box.height = (int) gd.getNextNumber(); 
     94 
     95      if (box.x < 0) box.x = 0; 
     96      if (box.y < 0) box.y = 0; 
     97      if (box.x >= r.getSizeX()) box.x = r.getSizeX() - box.width - 1; 
     98      if (box.y >= r.getSizeY()) box.y = r.getSizeY() - box.height - 1; 
     99      if (box.width < 1) box.width = 1; 
     100      if (box.height < 1) box.height = 1; 
     101      if (box.width + box.x > r.getSizeX()) { 
     102        box.width = r.getSizeX() - box.x; 
    107103      } 
    108       if (box[i].height + box[i].y > r.getSizeY()) { 
    109         box[i].height = r.getSizeY() - box[i].y; 
     104      if (box.height + box.y > r.getSizeY()) { 
     105        box.height = r.getSizeY() - box.y; 
    110106      } 
     107 
     108      options.setCropRegion(s, box); // in case we got a copy 
    111109    } 
    112110 
  • trunk/components/loci-plugins/src/loci/plugins/in/ImagePlusReader.java

    r6230 r6246  
    3535import ij.process.ShortProcessor; 
    3636 
    37 import java.awt.Rectangle; 
    3837import java.awt.image.IndexColorModel; 
    3938import java.io.File; 
     
    4443 
    4544import loci.common.Location; 
     45import loci.common.Region; 
    4646import loci.common.StatusEvent; 
    4747import loci.common.StatusListener; 
     
    189189      ImageStack stackO = null; // for all other images (24-bit RGB) 
    190190 
    191       Rectangle cropRegion = options.getCropRegion(s); 
    192       int w = options.doCrop() ? cropRegion.width : r.getSizeX(); 
    193       int h = options.doCrop() ? cropRegion.height : r.getSizeY(); 
     191      Region region = options.getCropRegion(s); 
     192      if (region == null) region = new Region(); 
     193      int sizeX = r.getSizeX(), sizeY = r.getSizeY(); 
     194      if (options.doCrop()) { 
     195        // bounds checking for cropped region 
     196        if (region.x < 0) region.x = 0; 
     197        if (region.y < 0) region.y = 0; 
     198        if (region.width <= 0 || region.x + region.width > sizeX) { 
     199          region.width = sizeX - region.x; 
     200        } 
     201        if (region.height <= 0 || region.y + region.height > sizeY) { 
     202          region.height = sizeX - region.y; 
     203        } 
     204      } 
     205      else { 
     206        // obtain entire image plane 
     207        region.x = region.y = 0; 
     208        region.width = sizeX; 
     209        region.height = sizeY; 
     210      } 
    194211 
    195212      int q = 0; 
     
    266283 
    267284          // get image processor for ith plane 
    268           ImageProcessor[] p = r.openProcessors(i, cropRegion); 
     285          ImageProcessor[] p; 
     286          p = r.openProcessors(i, region.x, region.y, 
     287            region.width, region.height); 
    269288          ImageProcessor ip = p[0]; 
    270289          if (p.length > 1) { 
     
    281300 
    282301          // add plane to image stack 
     302          int w = region.width, h = region.height; 
    283303          if (ip instanceof ByteProcessor) { 
    284304            if (stackB == null) stackB = new ImageStack(w, h); 
  • trunk/components/loci-plugins/src/loci/plugins/in/Importer.java

    r6239 r6246  
    3232 
    3333import loci.formats.FormatException; 
     34import loci.plugins.BF; 
    3435import loci.plugins.LociImporter; 
    35 import loci.plugins.util.BF; 
    3636import loci.plugins.util.ROIHandler; 
    3737import loci.plugins.util.WindowTools; 
  • trunk/components/loci-plugins/src/loci/plugins/in/ImporterOptions.java

    r6239 r6246  
    2828import ij.IJ; 
    2929 
    30 import java.awt.Rectangle; 
    3130import java.io.IOException; 
    32 import java.util.Arrays; 
     31import java.util.ArrayList; 
     32import java.util.List; 
    3333 
    3434import loci.common.Location; 
     35import loci.common.Region; 
    3536import loci.formats.FilePattern; 
    3637import loci.formats.FormatException; 
    3738import loci.formats.meta.IMetadata; 
     39import loci.plugins.BF; 
    3840import loci.plugins.prefs.OptionsDialog; 
    3941import loci.plugins.prefs.OptionsList; 
    4042import loci.plugins.prefs.StringOption; 
    41 import loci.plugins.util.BF; 
    4243import loci.plugins.util.ImageProcessorReader; 
    4344import loci.plugins.util.LibraryChecker; 
     
    122123  protected ImporterReader reader; 
    123124  protected ImporterMetadata metadata; 
     125  protected int[] cCount, zCount, tCount; 
     126 
     127  // -- Fields -- secondary values -- 
    124128 
    125129  // series options 
    126   protected boolean[] series; 
     130  protected List<Boolean> seriesOn = new ArrayList<Boolean>(); 
     131 
     132  // TODO - swap options need to be programmatically settable 
    127133 
    128134  // range options 
    129   protected int[] cBegin, cEnd, cStep, cCount; 
    130   protected int[] zBegin, zEnd, zStep, zCount; 
    131   protected int[] tBegin, tEnd, tStep, tCount; 
     135  protected List<Integer> cBegin = new ArrayList<Integer>(); 
     136  protected List<Integer> cEnd = new ArrayList<Integer>(); 
     137  protected List<Integer> cStep = new ArrayList<Integer>(); 
     138  protected List<Integer> zBegin = new ArrayList<Integer>(); 
     139  protected List<Integer> zEnd = new ArrayList<Integer>(); 
     140  protected List<Integer> zStep = new ArrayList<Integer>(); 
     141  protected List<Integer> tBegin = new ArrayList<Integer>(); 
     142  protected List<Integer> tEnd = new ArrayList<Integer>(); 
     143  protected List<Integer> tStep = new ArrayList<Integer>(); 
    132144 
    133145  // crop options 
    134   protected Rectangle[] cropRegion; 
     146  protected List<Region> cropRegion = new ArrayList<Region>(); 
    135147 
    136148  // -- Fields - internal -- 
     
    415427  public void setWindowless(boolean b) { setValue(KEY_WINDOWLESS, b); } 
    416428 
     429  // -- ImporterOptions methods - secondary options accessors and mutators -- 
     430 
     431  // series options 
     432  public boolean isSeriesOn(int s) { return get(seriesOn, s); } 
     433  public void setSeriesOn(int s, boolean value) { 
     434    set(seriesOn, s, value, false); 
     435  } 
     436 
     437  // TODO - swap options 
     438 
     439  // range options 
     440  public int getCBegin(int s) { return get(cBegin, s); } 
     441  public void setCBegin(int s, int value) { set(cBegin, s, value, 0); } 
     442  public int getCEnd(int s) { return get(cEnd, s); } 
     443  public void setCEnd(int s, int value) { set(cEnd, s, value, 0); } 
     444  public int getCStep(int s) { return get(cStep, s); } 
     445  public void setCStep(int s, int value) { set(cStep, s, value, 0); } 
     446 
     447  public int getZBegin(int s) { return get(zBegin, s); } 
     448  public void setZBegin(int s, int value) { set(zBegin, s, value, 0); } 
     449  public int getZEnd(int s) { return get(zEnd, s); } 
     450  public void setZEnd(int s, int value) { set(zEnd, s, value, 0); } 
     451  public int getZStep(int s) { return get(zStep, s); } 
     452  public void setZStep(int s, int value) { set(zStep, s, value, 0); } 
     453 
     454  public int getTBegin(int s) { return get(tBegin, s); } 
     455  public void setTBegin(int s, int value) { set(tBegin, s, value, 0); } 
     456  public int getTEnd(int s) { return get(tEnd, s); } 
     457  public void setTEnd(int s, int value) { set(tEnd, s, value, 0); } 
     458  public int getTStep(int s) { return get(tStep, s); } 
     459  public void setTStep(int s, int value) { set(tStep, s, value, 0); } 
     460 
     461  // crop options 
     462  public Region getCropRegion(int s) { return get(cropRegion, s); } 
     463  public void setCropRegion(int s, Region r) { set(cropRegion, s, r, null); } 
     464 
    417465  // -- ImporterOptions methods - derived values accessors -- 
    418466 
     
    423471  public IMetadata getOMEMetadata() { return reader.meta; } 
    424472  public ImporterMetadata getOriginalMetadata() { return metadata; } 
     473  public int getSeriesCount() { return reader.r.getSeriesCount(); } 
    425474 
    426475  // series options 
    427   public int getCBegin(int s) { return cBegin[s]; } 
    428   public int getCEnd(int s) { return cEnd[s]; } 
    429   public int getCStep(int s) { return cStep[s]; } 
    430476  public int getCCount(int s) { return cCount[s]; } 
    431   public int getZBegin(int s) { return zBegin[s]; } 
    432   public int getZEnd(int s) { return zEnd[s]; } 
    433   public int getZStep(int s) { return zStep[s]; } 
    434477  public int getZCount(int s) { return zCount[s]; } 
    435   public int getTBegin(int s) { return tBegin[s]; } 
    436   public int getTEnd(int s) { return tEnd[s]; } 
    437   public int getTStep(int s) { return tStep[s]; } 
    438478  public int getTCount(int s) { return tCount[s]; } 
    439   public boolean isSeriesOn(int s) { return series[s]; } 
    440  
    441   // crop options 
    442   public Rectangle getCropRegion(int s) { return cropRegion[s]; } 
    443  
    444   // -- Helper methods -- 
     479 
     480  // -- Helper methods - dialog prompts -- 
    445481 
    446482  private boolean promptUpgrade() { 
     
    485521  } 
    486522 
    487   /** Initializes the ImporterMetadata derived value. */ 
    488   private void initializeMetadata() { 
    489     // only prepend a series name prefix to the metadata keys if multiple 
    490     // series are being opened 
    491     int seriesCount = 0; 
    492     for (int i=0; i<series.length; i++) { 
    493       if (series[i]) seriesCount++; 
    494     } 
    495     metadata = new ImporterMetadata(reader.r, this, seriesCount > 1); 
    496   } 
    497  
    498523  /** Prompts for which series to import, if necessary. */ 
    499524  private boolean promptSeries() { 
    500525    // initialize series-related derived values 
    501     series = new boolean[reader.r.getSeriesCount()]; 
    502     series[0] = true; 
     526    setSeriesOn(0, true); 
    503527 
    504528    // build descriptive label for each series 
    505     int seriesCount = reader.r.getSeriesCount(); 
     529    int seriesCount = getSeriesCount(); 
    506530    seriesLabels = new String[seriesCount]; 
    507531    for (int i=0; i<seriesCount; i++) { 
     
    554578      BF.debug("prompt for which series to import"); 
    555579      SeriesDialog dialog = new SeriesDialog(this, 
    556         reader.r, seriesLabels, series); 
     580        reader.r, seriesLabels); 
    557581      if (dialog.showDialog() != OptionsDialog.STATUS_OK) return false; 
    558582    } 
     
    560584 
    561585    if (openAllSeries() || isViewNone()) { 
    562       Arrays.fill(series, true); 
     586      for (int s=0; s<getSeriesCount(); s++) setSeriesOn(s, true); 
    563587    } 
    564588    return true; 
     
    573597    BF.debug("prompt for dimension swapping parameters"); 
    574598 
    575     SwapDialog dialog = new SwapDialog(this, reader.virtualReader, series); 
     599    SwapDialog dialog = new SwapDialog(this, reader.virtualReader); 
    576600    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
    577601  } 
     
    579603  /** Prompts for the range of planes to import, if necessary. */ 
    580604  private boolean promptRange() { 
    581     // initialize range-related derived values 
    582     int seriesCount = reader.r.getSeriesCount(); 
    583     cBegin = new int[seriesCount]; 
    584     cEnd = new int[seriesCount]; 
    585     cStep = new int[seriesCount]; 
    586     zBegin = new int[seriesCount]; 
    587     zEnd = new int[seriesCount]; 
    588     zStep = new int[seriesCount]; 
    589     tBegin = new int[seriesCount]; 
    590     tEnd = new int[seriesCount]; 
    591     tStep = new int[seriesCount]; 
    592  
    593     for (int i=0; i<seriesCount; i++) { 
    594       reader.r.setSeries(i); 
    595       cBegin[i] = zBegin[i] = tBegin[i] = 0; 
    596       cEnd[i] = reader.r.getEffectiveSizeC() - 1; 
    597       zEnd[i] = reader.r.getSizeZ() - 1; 
    598       tEnd[i] = reader.r.getSizeT() - 1; 
    599       cStep[i] = zStep[i] = tStep[i] = 1; 
    600     } 
    601  
     605    // initialize range-related secondary values 
     606    int seriesCount = getSeriesCount(); 
     607 
     608    for (int s=0; s<seriesCount; s++) { 
     609      reader.r.setSeries(s); 
     610      setCBegin(s, 0); 
     611      setZBegin(s, 0); 
     612      setTBegin(s, 0); 
     613      setCEnd(s, reader.r.getEffectiveSizeC() - 1); 
     614      setZEnd(s, reader.r.getSizeZ() - 1); 
     615      setTEnd(s, reader.r.getSizeT() - 1); 
     616      setCStep(s, 1); 
     617      setZStep(s, 1); 
     618      setTStep(s, 1); 
     619    } 
    602620 
    603621    if (!isSpecifyRanges()) { 
     
    606624    } 
    607625    boolean needRange = false; 
    608     for (int i=0; i<seriesCount; i++) { 
    609       if (series[i] && reader.r.getImageCount() > 1) needRange = true; 
     626    for (int s=0; s<seriesCount; s++) { 
     627      if (isSeriesOn(s) && reader.r.getImageCount() > 1) needRange = true; 
    610628    } 
    611629    if (!needRange) { 
     
    616634    IJ.showStatus(""); 
    617635 
    618     RangeDialog dialog = new RangeDialog(this, 
    619       reader.r, series, seriesLabels, cBegin, cEnd, cStep, 
    620       zBegin, zEnd, zStep, tBegin, tEnd, tStep); 
     636    RangeDialog dialog = new RangeDialog(this, reader.r, seriesLabels); 
    621637    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
    622638  } 
     
    624640  /** Prompts for cropping details, if necessary. */ 
    625641  private boolean promptCrop() { 
    626     // initialize crop-related derived values 
    627     cropRegion = new Rectangle[reader.r.getSeriesCount()]; 
    628     for (int i=0; i<cropRegion.length; i++) { 
    629       if (series[i] && doCrop()) cropRegion[i] = new Rectangle(); 
     642    // initialize crop-related secondary values 
     643    int seriesCount = getSeriesCount(); 
     644    for (int s=0; s<seriesCount; s++) { 
     645      setCropRegion(s, new Region()); 
    630646    } 
    631647 
     
    636652    BF.debug("prompt for cropping region"); 
    637653 
    638     CropDialog dialog = new CropDialog(this, 
    639       reader.r, seriesLabels, series, cropRegion); 
     654    CropDialog dialog = new CropDialog(this, reader.r, seriesLabels); 
    640655    return dialog.showDialog() == OptionsDialog.STATUS_OK; 
     656  } 
     657 
     658  // -- Helper methods - derived value computation -- 
     659 
     660  /** Initializes the ImporterMetadata derived value. */ 
     661  private void initializeMetadata() { 
     662    // only prepend a series name prefix to the metadata keys if multiple 
     663    // series are being opened 
     664    int seriesCount = getSeriesCount(); 
     665    int numEnabled = 0; 
     666    for (int s=0; s<seriesCount; s++) { 
     667      if (isSeriesOn(s)) numEnabled++; 
     668    } 
     669    metadata = new ImporterMetadata(reader.r, this, numEnabled > 1); 
    641670  } 
    642671 
    643672  /** Initializes the cCount, zCount and tCount derived values. */ 
    644673  private void computeRangeCounts() { 
    645     int seriesCount = reader.r.getSeriesCount(); 
     674    int seriesCount = getSeriesCount(); 
    646675    cCount = new int[seriesCount]; 
    647676    zCount = new int[seriesCount]; 
    648677    tCount = new int[seriesCount]; 
    649     for (int i=0; i<seriesCount; i++) { 
    650       if (!series[i]) cCount[i] = zCount[i] = tCount[i] = 0; 
     678    for (int s=0; s<seriesCount; s++) { 
     679      if (!isSeriesOn(s)) cCount[s] = zCount[s] = tCount[s] = 0; 
    651680      else { 
    652         if (isMergeChannels()) cCount[i] = 1; 
    653         else cCount[i] = (cEnd[i] - cBegin[i] + cStep[i]) / cStep[i]; 
    654         zCount[i] = (zEnd[i] - zBegin[i] + zStep[i]) / zStep[i]; 
    655         tCount[i] = (tEnd[i] - tBegin[i] + tStep[i]) / tStep[i]; 
     681        if (isMergeChannels()) cCount[s] = 1; 
     682        else { 
     683          cCount[s] = (getCEnd(s) - getCBegin(s) + getCStep(s)) / getCStep(s); 
     684        } 
     685        zCount[s] = (getZEnd(s) - getZBegin(s) + getZStep(s)) / getZStep(s); 
     686        tCount[s] = (getTEnd(s) - getTBegin(s) + getTStep(s)) / getTStep(s); 
    656687      } 
    657688    } 
    658689  } 
     690   
     691  // -- Helper methods - miscellaneous -- 
     692   
     693  private <T extends Object> void set(List<T> list, 
     694    int index, T value, T defaultValue) 
     695  { 
     696    while (list.size() <= index) list.add(defaultValue); 
     697    list.set(index, value); 
     698  } 
     699 
     700  private <T extends Object> T get(List<T> list, int index) { 
     701    if (list.size() <= index) return null; 
     702    return list.get(index); 
     703  } 
    659704 
    660705} 
  • trunk/components/loci-plugins/src/loci/plugins/in/RangeDialog.java

    r6229 r6246  
    4646 
    4747  protected IFormatReader r; 
    48   protected boolean[] series; 
    4948  protected String[] seriesLabels; 
    50   protected int[] cBegin, cEnd, cStep; 
    51   protected int[] zBegin, zEnd, zStep; 
    52   protected int[] tBegin, tEnd, tStep; 
    5349 
    5450  // -- Constructor -- 
     
    5854   * 
    5955   * @param r The reader to use for extracting details of each series. 
    60    * @param series Boolean array indicating the series 
    61    *   for which ranges should be determined. 
    6256   * @param seriesLabels Label to display to user identifying each series 
    63    * @param cBegin First C index to include (populated by showDialog). 
    64    * @param cEnd Last C index to include (populated by showDialog). 
    65    * @param cStep C dimension step size (populated by showDialog). 
    66    * @param zBegin First Z index to include (populated by showDialog). 
    67    * @param zEnd Last Z index to include (populated by showDialog). 
    68    * @param zStep Z dimension step size (populated by showDialog). 
    69    * @param tBegin First T index to include (populated by showDialog). 
    70    * @param tEnd Last T index to include (populated by showDialog). 
    71    * @param tStep T dimension step size (populated by showDialog). 
    7257   */ 
    73   public RangeDialog(ImporterOptions options, IFormatReader r, 
    74     boolean[] series, String[] seriesLabels, 
    75     int[] cBegin, int[] cEnd, int[] cStep, 
    76     int[] zBegin, int[] zEnd, int[] zStep, 
    77     int[] tBegin, int[] tEnd, int[] tStep) 
     58  public RangeDialog(ImporterOptions options, 
     59    IFormatReader r, String[] seriesLabels) 
    7860  { 
    7961    super(options); 
    8062    this.options = options; 
    8163    this.r = r; 
    82     this.series = series; 
    8364    this.seriesLabels = seriesLabels; 
    84     this.cBegin = cBegin; 
    85     this.cEnd = cEnd; 
    86     this.cStep = cStep; 
    87     this.zBegin = zBegin; 
    88     this.zEnd = zEnd; 
    89     this.zStep = zStep; 
    90     this.tBegin = tBegin; 
    91     this.tEnd = tEnd; 
    92     this.tStep = tStep; 
    9365  } 
    9466 
     
    10678    // prompt user to specify series ranges (or grab from macro options) 
    10779    GenericDialog gd = new GenericDialog("Bio-Formats Range Options"); 
    108     for (int i=0; i<seriesCount; i++) { 
    109       if (!series[i]) continue; 
    110       r.setSeries(i); 
    111       gd.addMessage(seriesLabels[i].replaceAll("_", " ")); 
    112       String s = seriesCount > 1 ? "_" + (i + 1) : ""; 
     80    for (int s=0; s<seriesCount; s++) { 
     81      if (!options.isSeriesOn(s)) continue; 
     82      r.setSeries(s); 
     83      gd.addMessage(seriesLabels[s].replaceAll("_", " ")); 
     84      String suffix = seriesCount > 1 ? "_" + (s + 1) : ""; 
    11385      //if (r.isOrderCertain()) { 
    11486      if (r.getEffectiveSizeC() > 1) { 
    115         gd.addNumericField("C_Begin" + s, cBegin[i] + 1, 0); 
    116         gd.addNumericField("C_End" + s, cEnd[i] + 1, 0); 
    117         gd.addNumericField("C_Step" + s, cStep[i], 0); 
     87        gd.addNumericField("C_Begin" + suffix, options.getCBegin(s) + 1, 0); 
     88        gd.addNumericField("C_End" + suffix, options.getCEnd(s) + 1, 0); 
     89        gd.addNumericField("C_Step" + suffix, options.getCStep(s), 0); 
    11890      } 
    11991      if (r.getSizeZ() > 1) { 
    120         gd.addNumericField("Z_Begin" + s, zBegin[i] + 1, 0); 
    121         gd.addNumericField("Z_End" + s, zEnd[i] + 1, 0); 
    122         gd.addNumericField("Z_Step" + s, zStep[i], 0); 
     92        gd.addNumericField("Z_Begin" + suffix, options.getZBegin(s) + 1, 0); 
     93        gd.addNumericField("Z_End" + suffix, options.getZEnd(s) + 1, 0); 
     94        gd.addNumericField("Z_Step" + suffix, options.getZStep(s), 0); 
    12395      } 
    12496      if (r.getSizeT() > 1) { 
    125         gd.addNumericField("T_Begin" + s, tBegin[i] + 1, 0); 
    126         gd.addNumericField("T_End" + s, tEnd[i] + 1, 0); 
    127         gd.addNumericField("T_Step" + s, tStep[i], 0); 
     97        gd.addNumericField("T_Begin" + suffix, options.getTBegin(s) + 1, 0); 
     98        gd.addNumericField("T_End" + suffix, options.getTEnd(s) + 1, 0); 
     99        gd.addNumericField("T_Step" + suffix, options.getTStep(s), 0); 
    128100      } 
    129101      //} 
    130102      //else { 
    131       //  gd.addNumericField("Begin" + s, cBegin[i] + 1, 0); 
    132       //  gd.addNumericField("End" + s, cEnd[i] + 1, 0); 
    133       //  gd.addNumericField("Step" + s, cStep[i], 0); 
     103      //  gd.addNumericField("Begin" + suffix, options.getCBegin(s) + 1, 0); 
     104      //  gd.addNumericField("End" + suffix, options.getCEnd(s) + 1, 0); 
     105      //  gd.addNumericField("Step" + suffix, options.getCStep(s), 0); 
    134106      //} 
    135107    } 
     
    138110    if (gd.wasCanceled()) return STATUS_CANCELED; 
    139111 
    140     for (int i=0; i<seriesCount; i++) { 
    141       if (!series[i]) continue; 
    142       r.setSeries(i); 
     112    for (int s=0; s<seriesCount; s++) { 
     113      if (!options.isSeriesOn(s)) continue; 
     114      r.setSeries(s); 
    143115      int sizeC = r.getEffectiveSizeC(); 
    144116      int sizeZ = r.getSizeZ(); 
    145117      int sizeT = r.getSizeT(); 
    146118      boolean certain = r.isOrderCertain(); 
     119       
     120      int cBegin = options.getCBegin(s); 
     121      int cEnd = options.getCEnd(s); 
     122      int cStep = options.getCStep(s); 
     123      int zBegin = options.getZBegin(s); 
     124      int zEnd = options.getZEnd(s); 
     125      int zStep = options.getZStep(s); 
     126      int tBegin = options.getTBegin(s); 
     127      int tEnd = options.getTEnd(s); 
     128      int tStep = options.getTStep(s); 
    147129 
    148130      //if (certain) { 
    149131      if (r.getEffectiveSizeC() > 1) { 
    150         cBegin[i] = (int) gd.getNextNumber() - 1; 
    151         cEnd[i] = (int) gd.getNextNumber() - 1; 
    152         cStep[i] = (int) gd.getNextNumber(); 
     132        cBegin = (int) gd.getNextNumber() - 1; 
     133        cEnd = (int) gd.getNextNumber() - 1; 
     134        cStep = (int) gd.getNextNumber(); 
    153135      } 
    154136      if (r.getSizeZ() > 1) { 
    155         zBegin[i] = (int) gd.getNextNumber() - 1; 
    156         zEnd[i] = (int) gd.getNextNumber() - 1; 
    157         zStep[i] = (int) gd.getNextNumber(); 
     137        zBegin = (int) gd.getNextNumber() - 1; 
     138        zEnd = (int) gd.getNextNumber() - 1; 
     139        zStep = (int) gd.getNextNumber(); 
    158140      } 
    159141      if (r.getSizeT() > 1) { 
    160         tBegin[i] = (int) gd.getNextNumber() - 1; 
    161         tEnd[i] = (int) gd.getNextNumber() - 1; 
    162         tStep[i] = (int) gd.getNextNumber(); 
     142        tBegin = (int) gd.getNextNumber() - 1; 
     143        tEnd = (int) gd.getNextNumber() - 1; 
     144        tStep = (int) gd.getNextNumber(); 
    163145      } 
    164146      //} 
    165147      //else { 
    166       //  cBegin[i] = (int) gd.getNextNumber() - 1; 
    167       //  cEnd[i] = (int) gd.getNextNumber() - 1; 
    168       //  cStep[i] = (int) gd.getNextNumber(); 
     148      //  cBegin = (int) gd.getNextNumber() - 1; 
     149      //  cEnd = (int) gd.getNextNumber() - 1; 
     150      //  cStep = (int) gd.getNextNumber(); 
    169151      //} 
    170152      int maxC = certain ? sizeC : r.getImageCount(); 
    171       if (cBegin[i] < 0) cBegin[i] = 0; 
    172       if (cBegin[i] >= maxC) cBegin[i] = maxC - 1; 
    173       if (cEnd[i] < cBegin[i]) cEnd[i] = cBegin[i]; 
    174       if (cEnd[i] >= maxC) cEnd[i] = maxC - 1; 
    175       if (cStep[i] < 1) cStep[i] = 1; 
    176       if (zBegin[i] < 0) zBegin[i] = 0; 
    177       if (zBegin[i] >= sizeZ) zBegin[i] = sizeZ - 1; 
    178       if (zEnd[i] < zBegin[i]) zEnd[i] = zBegin[i]; 
    179       if (zEnd[i] >= sizeZ) zEnd[i] = sizeZ - 1; 
    180       if (zStep[i] < 1) zStep[i] = 1; 
    181       if (tBegin[i] < 0) tBegin[i] = 0; 
    182       if (tBegin[i] >= sizeT) tBegin[i] = sizeT - 1; 
    183       if (tEnd[i] < tBegin[i]) tEnd[i] = tBegin[i]; 
    184       if (tEnd[i] >= sizeT) tEnd[i] = sizeT - 1; 
    185       if (tStep[i] < 1) tStep[i] = 1; 
     153      if (cBegin < 0) cBegin = 0; 
     154      if (cBegin >= maxC) cBegin = maxC - 1; 
     155      if (cEnd < cBegin) cEnd = cBegin; 
     156      if (cEnd >= maxC) cEnd = maxC - 1; 
     157      if (cStep < 1) cStep = 1; 
     158      if (zBegin < 0) zBegin = 0; 
     159      if (zBegin >= sizeZ) zBegin = sizeZ - 1; 
     160      if (zEnd < zBegin) zEnd = zBegin; 
     161      if (zEnd >= sizeZ) zEnd = sizeZ - 1; 
     162      if (zStep < 1) zStep = 1; 
     163      if (tBegin < 0) tBegin = 0; 
     164      if (tBegin >= sizeT) tBegin = sizeT - 1; 
     165      if (tEnd < tBegin) tEnd = tBegin; 
     166      if (tEnd >= sizeT) tEnd = sizeT - 1; 
     167      if (tStep < 1) tStep = 1; 
     168       
     169      options.setCBegin(s, cBegin); 
     170      options.setCEnd(s, cEnd); 
     171      options.setCStep(s, cStep); 
     172      options.setZBegin(s, zBegin); 
     173      options.setZEnd(s, zEnd); 
     174      options.setZStep(s, zStep); 
     175      options.setTBegin(s, tBegin); 
     176      options.setTEnd(s, tEnd); 
     177      options.setTStep(s, tStep); 
    186178    } 
    187179 
  • trunk/components/loci-plugins/src/loci/plugins/in/SeriesDialog.java

    r6229 r6246  
    4141import java.awt.event.ActionListener; 
    4242import java.awt.image.BufferedImage; 
    43 import java.util.Arrays; 
    4443import java.util.StringTokenizer; 
    4544 
     
    7574  protected BufferedImageReader r; 
    7675  protected String[] seriesLabels; 
    77   protected boolean[] series; 
    7876 
    7977  protected Checkbox[] boxes; 
     
    9088   */ 
    9189  public SeriesDialog(ImporterOptions options, 
    92     IFormatReader r, String[] seriesLabels, boolean[] series) 
     90    IFormatReader r, String[] seriesLabels) 
    9391  { 
    9492    super(options); 
     
    9795      (BufferedImageReader) r : new BufferedImageReader(r); 
    9896    this.seriesLabels = seriesLabels; 
    99     this.series = series; 
    10097  } 
    10198 
     
    116113          seriesString = seriesString.substring(1, seriesString.length() - 2); 
    117114        } 
    118         Arrays.fill(series, false); 
     115 
     116        // default all series to false 
     117        int seriesCount = options.getSeriesCount(); 
     118        for (int s=0; s<seriesCount; s++) options.setSeriesOn(s, false); 
     119 
     120        // extract enabled series values from series string 
    119121        StringTokenizer tokens = new StringTokenizer(seriesString, " "); 
    120122        while (tokens.hasMoreTokens()) { 
    121123          String token = tokens.nextToken().trim(); 
    122124          int n = Integer.parseInt(token); 
    123           if (n < series.length) series[n] = true; 
     125          if (n < seriesCount) options.setSeriesOn(n, true); 
    124126        } 
    125127      } 
     
    180182      for (int row=0; row<nRows; row++) { 
    181183        labels[row] = seriesLabels[nextSeries]; 
    182         defaultValues[row] = series[nextSeries++]; 
     184        defaultValues[row] = options.isSeriesOn(nextSeries++); 
    183185      } 
    184186      gd.addCheckboxGroup(nRows, 1, labels, defaultValues); 
     
    241243    seriesString = "["; 
    242244    for (int i=0; i<seriesCount; i++) { 
    243       series[i] = gd.getNextBoolean(); 
    244       if (series[i]) seriesString += i + " "; 
     245      boolean on = gd.getNextBoolean(); 
     246      options.setSeriesOn(i, on); 
     247      if (on) seriesString += i + " "; 
    245248    } 
    246249    seriesString += "]"; 
  • trunk/components/loci-plugins/src/loci/plugins/in/SwapDialog.java

    r6229 r6246  
    4747 
    4848  protected DimensionSwapper r; 
    49   protected boolean[] series; 
    5049 
    5150  // -- Constructor -- 
    5251 
    5352  /** Creates a dimension swapper dialog for the Bio-Formats Importer. */ 
    54   public SwapDialog(ImporterOptions options, 
    55     DimensionSwapper r, boolean[] series) 
    56   { 
     53  public SwapDialog(ImporterOptions options, DimensionSwapper r) { 
    5754    super(options); 
    5855    this.options = options; 
    5956    this.r = r; 
    60     this.series = series; 
    6157  } 
    6258 
     
    7470    String[] labels = {"Z", "C", "T"}; 
    7571    int[] sizes = new int[] {r.getSizeZ(), r.getSizeC(), r.getSizeT()}; 
    76     for (int n=0; n<r.getSeriesCount(); n++) { 
    77       if (!series[n]) continue; 
    78       r.setSeries(n); 
     72    for (int s=0; s<r.getSeriesCount(); s++) { 
     73      if (!options.isSeriesOn(s)) continue; 
     74      r.setSeries(s); 
    7975 
    80       gd.addMessage("Series " + (n + 1) + ":\n"); 
     76      gd.addMessage("Series " + (s + 1) + ":\n"); 
    8177 
    8278      for (int i=0; i<labels.length; i++) { 
     
    8884    if (gd.wasCanceled()) return STATUS_CANCELED; 
    8985 
    90     for (int n=0; n<r.getSeriesCount(); n++) { 
    91       if (!series[n]) continue; 
    92       r.setSeries(n); 
     86    for (int s=0; s<r.getSeriesCount(); s++) { 
     87      if (!options.isSeriesOn(s)) continue; 
     88      r.setSeries(s); 
    9389      String z = gd.getNextChoice(); 
    9490      String c = gd.getNextChoice(); 
  • trunk/components/loci-plugins/src/loci/plugins/macro/LociFunctions.java

    r6230 r6246  
    2929import ij.process.ImageProcessor; 
    3030 
    31 import java.awt.Rectangle; 
    3231import java.io.IOException; 
    3332 
     
    161160 
    162161  public void openSubImage(String title, Double no, Double x, Double y, 
    163     Double width, Double height) throws FormatException, IOException 
     162    Double w, Double h) throws FormatException, IOException 
    164163  { 
    165     Rectangle crop = new Rectangle(x.intValue(), y.intValue(), 
    166       width.intValue(), height.intValue()); 
    167     ImageProcessor[] ip = r.openProcessors(no.intValue(), crop); 
     164    ImageProcessor[] ip = r.openProcessors(no.intValue(), 
     165      x.intValue(), y.intValue(), w.intValue(), h.intValue()); 
    168166    ImagePlusTools.makeRGB(title, ip).show(); 
    169167  } 
  • trunk/components/loci-plugins/src/loci/plugins/util/ImagePlusTools.java

    r6230 r6246  
    225225    int stackSize = s.getSize(); 
    226226    for (int i=0; i<stackSize; i++) { 
    227       /* 
    228       int[] target = 
    229         FormatTools.getZCTCoords(newOrder, z, c, t, stackSize, i); 
    230       int ndx = FormatTools.getIndex(origOrder, z, c, t, stackSize, 
    231         target[0], target[1], target[2]); 
    232       */ 
    233227      int ndx = FormatTools.getReorderedIndex( 
    234228        origOrder, newOrder, z, c, t, stackSize, i); 
  • trunk/components/loci-plugins/src/loci/plugins/util/ImageProcessorReader.java

    r6229 r6246  
    3131import ij.process.ShortProcessor; 
    3232 
    33 import java.awt.Rectangle; 
    3433import java.awt.image.IndexColorModel; 
    3534import java.io.IOException; 
     
    8281    throws FormatException, IOException 
    8382  { 
    84     return openProcessors(no, null); 
     83    return openProcessors(no, 0, 0, getSizeX(), getSizeY()); 
    8584  } 
    8685 
     
    9190   * 
    9291   * @param no Position of image plane. 
    93    * @param crop Image cropping specifications, 
    94    *   or null if no cropping is to be done. 
    9592   */ 
    96   public ImageProcessor[] openProcessors(int no, Rectangle crop) 
     93  public ImageProcessor[] openProcessors(int no, int x, int y, int w, int h) 
    9794    throws FormatException, IOException 
    9895  { 
     
    10097    byte[] b = null; 
    10198    boolean first = true; 
    102     if (crop == null) crop = new Rectangle(0, 0, getSizeX(), getSizeY()); 
    10399    while (true) { 
    104100      // read LuraWave license code, if available 
    105101      String code = LuraWave.initLicenseCode(); 
    106102      try { 
    107         b = openBytes(no, crop.x, crop.y, crop.width, crop.height); 
     103        b = openBytes(no, x, y, w, h);  
    108104        break; 
    109105      } 
     
    119115    } 
    120116 
    121     int w = crop.width; 
    122     int h = crop.height; 
    123117    int c = getRGBChannelCount(); 
    124118    int type = getPixelType(); 
     
    231225    throws FormatException, IOException 
    232226  { 
    233     return openProcessors(no, new Rectangle(x, y, w, h)); 
     227    return openProcessors(no, x, y, w, h); 
    234228  } 
    235229 
  • trunk/components/loci-plugins/test/loci/plugins/in/ImporterTest.java

    r6242 r6246  
    88import java.io.IOException; 
    99 
     10import loci.common.Region; 
    1011import loci.formats.FormatException; 
    1112import loci.formats.FormatTools; 
    12 import loci.plugins.util.BF; 
     13import loci.plugins.BF; 
    1314 
    1415import org.junit.Test; 
     
    5455      options.setId(path); 
    5556      options.setCrop(true); 
    56       // TODO: pass crop parameters to options somehow 
     57      options.setCropRegion(0, new Region(0, 0, cropSizeX, cropSizeY)); 
    5758      imps = BF.openImagePlus(options); 
    5859    } 
     
    6566 
    6667    assertNotNull(imps); 
    67     assertTrue(imps.length == 0); 
     68    assertTrue(imps.length == 1); 
    6869    assertNotNull(imps[0]); 
    6970    assertTrue(imps[0].getWidth() == cropSizeX); 
     
    8687    ImporterTest test = new ImporterTest(); 
    8788    test.testBasic(); 
    88     //test.testCrop(); 
     89    test.testCrop(); 
    8990    System.exit(0); 
    9091  } 
Note: See TracChangeset for help on using the changeset viewer.