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