14cead8034aab0e20e402baee87cbe9129db00192Stephen Hinespackage com.android.rs.refocus.image; 2de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 34cead8034aab0e20e402baee87cbe9129db00192Stephen Hinesimport com.android.rs.refocus.DepthTransform; 4de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 5de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang/** 6de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * An implementation of {@code DepthTransform} that uses an inverse 7de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * 8-bit representation of depth similar to the OpenGL z-buffer storage. 8de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * 9de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang * @author chernand@google.com (Carlos Hernandez) 10de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang */ 11de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wangpublic class RangeInverseDepthTransform implements DepthTransform { 12de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang public static final String FORMAT = "RangeInverse"; 13de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 14de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang private final float near; 15de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang private final float far; 16de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 17de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang public RangeInverseDepthTransform(float near, float far) { 18de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang this.near = near; 19de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang this.far = far; 20de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang } 21de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 22de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang @Override 23de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang public float getNear() { 24de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang return near; 25de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang } 26de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 27de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang @Override 28de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang public float getFar() { 29de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang return far; 30de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang } 31de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 32de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang @Override 33de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang public String getFormat() { 34de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang return FORMAT; 35de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang } 36de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 37de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang @Override 38de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang public int quantize(float value) { 39de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang return Math.max(0, Math.min(255, 40de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang (int) ((far - near * far / value) / (far - near) * 255f))); 41de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang } 42de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang 43de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang @Override 44de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang public float reconstruct(int value) { 45de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang return (far * near) / (far - (far - near) * 46de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang Math.max(0, Math.min(255, value)) / 255f); 47de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang } 48de2f182fdb522689e05280e449a39ec2c1b53e1fCindy Wang} 49