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