1fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Nipackage com.android.rs.refocus;
2fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
3fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport android.graphics.Bitmap;
4fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport com.android.rs.refocus.DepthTransform;
5fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport com.android.rs.refocus.image.RangeLinearDepthTransform;
6fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport java.io.InputStream;
7fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport java.io.IOException;
8fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport java.lang.RuntimeException;
9fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport java.lang.StringBuffer;
10fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport java.nio.ByteBuffer;
11fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport java.nio.FloatBuffer;
12fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Niimport java.nio.ByteOrder;
13fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
14fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Nipublic class PortableFloatMap {
15fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
16fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private int mWidth;
17fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private int mHeight;
18fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private float mScale;
19fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private boolean mLittleEndian;
20fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private ByteOrder mByteOrder;
21fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
22fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private int mBytesPerPixel;
23fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private ByteBuffer mData;
24fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
25fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    private static String readString(InputStream in)
26fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            throws IOException {
27fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        StringBuffer buffer = new StringBuffer();
28fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        int c;
29fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        while ((c = in.read()) != -1 && c != 0xa && c != 0x20) {
30fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            buffer.append((char)c);
31fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        }
32fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        return buffer.toString();
33fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    }
34fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
35fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    public PortableFloatMap(InputStream in)
36fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            throws IOException {
37fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        String formatLine = readString(in);
38fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
39fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        if (formatLine.compareTo("Pf") != 0) {
40fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            // Currently "PF" (RGB32F) is not supported.
41fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            // Only "Pf" (Greyscale32F) is supported.
42fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            throw new RuntimeException("Unexpected format line: " + formatLine);
43fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        }
44fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
45fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        mBytesPerPixel = 4;
46fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
47fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        String widthLine = readString(in);
48fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
49fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        mWidth = Integer.parseInt(widthLine);
50fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
51fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        String heightLine = readString(in);
52fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
53fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        mHeight = Integer.parseInt(heightLine);
54fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
55fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        final int bytesPerRow = mBytesPerPixel * mWidth;
56fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
57fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        mData = ByteBuffer.allocate(bytesPerRow * mHeight);
58fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
59fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        String scaleLine = readString(in);
60fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
61fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        mScale = Float.parseFloat(scaleLine);
62fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
63fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        mData.order(mScale < 0 ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN);
64fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
65fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        byte[] row = new byte[mBytesPerPixel * mWidth];
66fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
67fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        for (int y = 0; y < mHeight; y++) {
68fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            int nRead = 0;
69fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            int offset = 0;
70fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            while (offset < bytesPerRow) {
71fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni                nRead = in.read(row, offset, bytesPerRow - offset);
72fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni                if (nRead < 0) {
73fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni                    throw new RuntimeException("Unexpected End of File.");
74fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni                }
75fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni                offset += nRead;
76fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            }
77fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            mData.put(row);
78fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        }
79fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        mData.rewind();
80fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    }
81fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
82fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    final float[] getPixelArray() {
83fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        FloatBuffer floatBuffer = mData.asFloatBuffer();
84fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        if (floatBuffer.hasArray()) {
85fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni            return floatBuffer.array();
86fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        }
87fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
88fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        float[] array = new float[mWidth * mHeight];
89fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        floatBuffer.get(array);
90fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
91fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni        return array;
92fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    }
93fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
94fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    int getWidth() { return mWidth; }
95fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni
96fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni    int getHeight() { return mHeight; }
97fb2af6b101911d7abf65a519704cdaebb0cae6fdYang Ni}
98