blob: 794f1898c07a83d9ffba42ddcbe288bd19e072a4 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.style.se1;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
// Specific to the geoapi-3.1 and geoapi-4.0 branches:
import org.opengis.filter.Expression;
/**
* Contrast enhancement for an image or an individual image channel.
* In the case of a color image, the relative grayscale brightness of a pixel color is used.
*
* <!-- Following list of authors contains credits to OGC GeoAPI 2 contributors. -->
* @author Johann Sorel (Geomatys)
* @author Ian Turton (CCG)
* @author Martin Desruisseaux (Geomatys)
*
* @param <R> the type of data to style, such as {@code Feature} or {@code Coverage}.
*/
@XmlType(name = "ContrastEnhancementType", propOrder = {
// "normalize",
// "histogram",
"gammaValue"
})
@XmlRootElement(name = "ContrastEnhancement")
public class ContrastEnhancement<R> extends StyleElement<R> {
/**
* Method to use for applying contrast enhancement, or {@code null} for the default value.
* The default value depends on whether or not a {@linkplain #gammaValue gamma value} is defined.
*
* @see #getMethod()
* @see #setMethod(ContrastMethod)
*
* @todo Marshall as empty "Normalize" or "Histogram" XML element.
*/
protected ContrastMethod method;
/**
* How much to brighten or dim an image, or {@code null} for the default value.
*
* @see #getGammaValue()
* @see #setGammaValue(Expression)
*
* @todo Add a JAXB adapter for marshalling as a plain number.
*/
@XmlElement(name = "GammaValue")
protected Expression<R, ? extends Number> gammaValue;
/**
* For JAXB unmarshalling only.
*/
private ContrastEnhancement() {
// Thread-local factory will be used.
}
/**
* Creates a contrast enhancement initialized to no operation.
*
* @param factory the factory to use for creating expressions and child elements.
*/
public ContrastEnhancement(final StyleFactory<R> factory) {
super(factory);
}
/**
* Creates a shallow copy of the given object.
* For a deep copy, see {@link #clone()} instead.
*
* @param source the object to copy.
*/
public ContrastEnhancement(final ContrastEnhancement<R> source) {
super(source);
method = source.method;
gammaValue = source.gammaValue;
}
/**
* Returns the method to use for applying contrast enhancement.
*
* @return method to use for applying contrast enhancement.
*/
public ContrastMethod getMethod() {
final var value = method;
if (value != null) {
return value;
}
return (gammaValue != null) ? ContrastMethod.GAMMA : ContrastMethod.NONE;
}
/**
* Sets the method to use for applying contrast enhancement.
* Setting this method to anything else than {@link ContrastMethod#GAMMA}
* clears the {@linkplain #getGammaValue() gamma value}.
*
* @param value new method to use, or {@code null} for none.
*/
public void setMethod(final ContrastMethod value) {
method = value;
if (value != ContrastMethod.GAMMA) {
gammaValue = null;
}
}
/**
* Tells how much to brighten (values greater than 1) or dim (values less than 1) an image.
* A value of 1 means no change.
*
* @return expression to control gamma adjustment.
*/
public Expression<R, ? extends Number> getGammaValue() {
return defaultToOne(gammaValue);
}
/**
* Sets how much to brighten (values greater than 1) or dim (values less than 1) an image.
* Setting a non-null value sets the method to {@link ContrastMethod#GAMMA}.
* If this method is never invoked, then the default value is literal 1.
*
* @param value new expression to control gamma adjustment, or {@code null} for the default.
*/
public void setGammaValue(final Expression<R, ? extends Number> value) {
gammaValue = value;
if (value != null) {
method = null;
}
}
/**
* Returns all properties contained in this class.
* This is used for {@link #equals(Object)} and {@link #hashCode()} implementations.
*/
@Override
final Object[] properties() {
return new Object[] {method, gammaValue};
}
/**
* Returns a deep clone of this object. All style elements are cloned,
* but expressions are not on the assumption that they are immutable.
*
* @return deep clone of all style elements.
*/
@Override
public ContrastEnhancement<R> clone() {
return (ContrastEnhancement<R>) super.clone();
}
}