@Override public void propertyChange(PropertyChangeEvent evt) { if (!"model".equals(evt.getPropertyName())) { return; } final ImageInfoEditorModel oldModel = (ImageInfoEditorModel) evt.getOldValue(); final ImageInfoEditorModel newModel = (ImageInfoEditorModel) evt.getNewValue(); if (oldModel != null) { oldModel.removeChangeListener(this); } if (newModel != null) { newModel.addChangeListener(this); } updateStxOverlayComponent(); } }
@Override public void updateFormModel(ColorFormModel formModel) { final ImageInfoEditorModel oldModel = imageInfoEditor.getModel(); final ImageInfo imageInfo = parentForm.getFormModel().getModifiedImageInfo(); final ImageInfoEditorModel newModel = new ImageInfoEditorModel1B(imageInfo); imageInfoEditor.setModel(newModel); final RasterDataNode raster = formModel.getRaster(); setLogarithmicDisplay(raster, newModel.getImageInfo().isLogScaled()); if (oldModel != null) { newModel.setHistogramViewGain(oldModel.getHistogramViewGain()); newModel.setMinHistogramViewSample(oldModel.getMinHistogramViewSample()); newModel.setMaxHistogramViewSample(oldModel.getMaxHistogramViewSample()); } if (newModel.getSliderSample(0) < newModel.getMinHistogramViewSample() || newModel.getSliderSample(newModel.getSliderCount() - 1) > newModel.getMaxHistogramViewSample()) { imageInfoEditor.computeZoomInToSliderLimits(); } discreteCheckBox.setDiscreteColorsMode(imageInfo.getColorPaletteDef().isDiscrete()); logDisplayButton.setSelected(newModel.getImageInfo().isLogScaled()); parentForm.revalidateToolViewPaneControl(); }
private boolean isValidModel() { return model != null && model.getMinSample() <= model.getMaxSample() && model.getSampleScaling() != null && model.getSampleStx() != null; }
private double getMinHistogramViewBinIndex() { if (!isHistogramAvailable()) { return -1.0; } final double minHistogramSample = model.getMinSample(); final double minHistogramViewSample = model.getMinHistogramViewSample(); if (minHistogramSample != minHistogramViewSample) { final double a = scaleInverse(minHistogramViewSample) - scaleInverse(minHistogramSample); final double b = scaleInverse(model.getMaxSample()) - scaleInverse(minHistogramSample); return (a / b) * model.getHistogramBins().length; } return 0.0; }
stxOverlayComponent.add(labels); labels.add(new JLabel("Name: " + model.getParameterName())); labels.add(new JLabel("Unit: " + model.getParameterUnit())); final Stx stx = model.getSampleStx(); if (stx == null) { return stxOverlayComponent; labels.add(new JLabel("Min: " + getValueForDisplay(model.getMinSample()))); labels.add(new JLabel("Max: " + getValueForDisplay(model.getMaxSample()))); if (stx.getResolutionLevel() > 0 && model.getSampleScaling() == Scaling.IDENTITY) { final ActionLabel label = new ActionLabel("Rough statistics!"); label.setToolTipText("Click to compute accurate statistics.");
public final void setModel(final ImageInfoEditorModel model) { final ImageInfoEditorModel oldModel = this.model; if (oldModel != model) { this.model = model; deinstallMouseListener(); if (oldModel != null) { oldModel.removeChangeListener(modelCL); } if (this.model != null) { roundFactor = MathUtils.computeRoundFactor(this.model.getMinSample(), this.model.getMaxSample(), 2); installMouseListener(); model.addChangeListener(modelCL); } firePropertyChange(PROPERTY_NAME_MODEL, oldModel, this.model); fireStateChanged(); } if (isShowing()) { repaint(); } }
private double getBinCountInRange(double minSample, double maxSample) { if (!isHistogramAvailable()) { return -1.0; } final double minHistogramSample = model.getMinSample(); final double maxHistogramSample = model.getMaxSample(); if (minSample >= maxHistogramSample || maxSample <= minHistogramSample) { return 0.0; } minSample = Math.max(minSample, minHistogramSample); maxSample = Math.min(maxSample, maxHistogramSample); final double a = scaleInverse(maxSample) - scaleInverse(minSample); final double b = scaleInverse(maxHistogramSample) - scaleInverse(minHistogramSample); return (a / b) * model.getHistogramBins().length; }
private double getDisplayableBinCount() { final double max = Math.min(getMaxSample(), getModel().getMaxHistogramViewSample()); final double min = Math.max(getMinSample(), getModel().getMinHistogramViewSample()); return getBinCountInRange(min, max); }
public void computeZoomInVertical() { getModel().setHistogramViewGain(getModel().getHistogramViewGain() * 1.4); repaint(); }
private void drawHistogram(Graphics2D g2d) { if (model.isHistogramAvailable()) { final Paint oldPaint = g2d.getPaint(); g2d.setPaint(Color.DARK_GRAY); final int[] histogramBins = model.getHistogramBins(); final double maxHistogramCounts = getMaxVisibleHistogramCounts(histogramBins, 1.0 / 16.0); final double viewBinCount = getHistogramViewBinCount(); final double binsPerPixel = viewBinCount / histoRect.width; final double maxBarHeight = 0.9 * histoRect.height; final double gain = model.getHistogramViewGain(); final double countsScale = (gain * maxBarHeight) / maxHistogramCounts; final Rectangle2D.Double r = new Rectangle2D.Double();
public void compute100Percent() { computeFactors(); setFirstSliderSample(getModel().getMinSample()); setLastSliderSample(getModel().getMaxSample()); partitionSliders(false); computeZoomInToSliderLimits(); }
private boolean canChangeSliderCount() { ImageInfo.UncertaintyVisualisationMode uvMode = getModel().getImageInfo().getUncertaintyVisualisationMode(); return uvMode == null || uvMode == ImageInfo.UncertaintyVisualisationMode.None || uvMode == ImageInfo.UncertaintyVisualisationMode.Polychromatic_Blending || uvMode == ImageInfo.UncertaintyVisualisationMode.Polychromatic_Overlay; }
private Color getSliderColor(int index) { ImageInfo.UncertaintyVisualisationMode uvMode = getModel().getImageInfo().getUncertaintyVisualisationMode(); if (uvMode != null) { if (uvMode == ImageInfo.UncertaintyVisualisationMode.Transparency_Blending) { return Color.WHITE; } else if (uvMode == ImageInfo.UncertaintyVisualisationMode.Monochromatic_Blending) { return getModel().getSliderColor(getSliderCount() - 1); } } return getModel().getSliderColor(index); }
private void setLogarithmicDisplay(final RasterDataNode raster, final boolean logarithmicDisplay) { final ImageInfoEditorModel model = imageInfoEditor.getModel(); if (logarithmicDisplay) { final StxFactory stxFactory = new StxFactory(); final Stx stx = stxFactory .withHistogramBinCount(raster.getStx().getHistogramBinCount()) .withLogHistogram(logarithmicDisplay) .withResolutionLevel(raster.getSourceImage().getModel().getLevelCount() - 1) .create(raster, ProgressMonitor.NULL); model.setDisplayProperties(raster.getName(), raster.getUnit(), stx, POW10_SCALING); } else { model.setDisplayProperties(raster.getName(), raster.getUnit(), raster.getStx(), Scaling.IDENTITY); } model.getImageInfo().setLogScaled(logarithmicDisplay); }
private double scale(double value) { assert model != null; return model.getSampleScaling().scale(value); }
private double getMinSample() { return getModel().getMinSample(); }
private double getMaxSample() { return getModel().getMaxSample(); }
private void editSliderSample(MouseEvent evt, final int sliderIndex) { final PropertyContainer vc = new PropertyContainer(); vc.addProperty(Property.create("sample", getSliderSample(sliderIndex))); vc.getDescriptor("sample").setDisplayName("sample"); vc.getDescriptor("sample").setUnit(getModel().getParameterUnit()); final ValueRange valueRange; if (sliderIndex == 0) { valueRange = new ValueRange(Double.NEGATIVE_INFINITY, round(getMaxSliderSample(sliderIndex))); } else if (sliderIndex == getSliderCount() - 1) { valueRange = new ValueRange(round(getMinSliderSample(sliderIndex)), Double.POSITIVE_INFINITY); } else { valueRange = new ValueRange(round(getMinSliderSample(sliderIndex)), round(getMaxSliderSample(sliderIndex))); } vc.getDescriptor("sample").setValueRange(valueRange); final BindingContext ctx = new BindingContext(vc); final NumberFormatter formatter = new NumberFormatter(new DecimalFormat("#0.0#")); formatter.setValueClass(Double.class); // to ensure that double values are returned final JFormattedTextField field = new JFormattedTextField(formatter); field.setColumns(11); field.setHorizontalAlignment(JFormattedTextField.RIGHT); ctx.bind("sample", field); showPopup(evt, field); ctx.addPropertyChangeListener("sample", pce -> { hidePopup(); setSliderSample(sliderIndex, (Double) ctx.getBinding("sample").getPropertyValue()); computeZoomInToSliderLimits(); applyChanges(); }); }
public void compute95Percent() { final Histogram histogram = new Histogram(getModel().getHistogramBins(), scaleInverse(getModel().getMinSample()), scaleInverse(getModel().getMaxSample())); final Range autoStretchRange = histogram.findRangeFor95Percent(); computeFactors(); setFirstSliderSample(scale(autoStretchRange.getMin())); setLastSliderSample(scale(autoStretchRange.getMax())); partitionSliders(false); computeZoomInToSliderLimits(); }
private double getNormalizedHistogramViewSampleValue(double sample) { final double minVisibleSample = scaleInverse(getModel().getMinHistogramViewSample()); final double maxVisibleSample = scaleInverse(getModel().getMaxHistogramViewSample()); sample = scaleInverse(sample); double delta = maxVisibleSample - minVisibleSample; if (delta == 0 || Double.isNaN(delta)) { delta = 1; } return (sample - minVisibleSample) / delta; }