Loading src/com/android/gallery3d/filtershow/FilterShowActivity.java +25 −9 Original line number Diff line number Diff line Loading @@ -19,8 +19,8 @@ package com.android.gallery3d.filtershow; import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Vector; import java.util.Locale; import java.util.Vector; import android.app.ActionBar; import android.app.AlertDialog; Loading Loading @@ -62,10 +62,10 @@ import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewPropertyAnimator; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; Loading Loading @@ -917,6 +917,11 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL mParseMpoTask.execute(); } else { MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_FAILED); Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); if (currentPanel instanceof MainPanel) { MainPanel mainPanel = (MainPanel) currentPanel; mainPanel.updateDualCameraButton(); } } } Loading Loading @@ -1190,26 +1195,32 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL } } private class ParseMpoDataTask extends AsyncTask<Void, Void, byte[]> { private class ParseMpoDataTask extends AsyncTask<Void, Void, Void> { private byte[] mPrimaryImgData = null; private byte[] mAuxImgData = null; @Override protected void onPreExecute() { MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_PARSING); } @Override protected byte[] doInBackground(Void... params) { protected Void doInBackground(Void... params) { MpoParser parser = MpoParser.parse(FilterShowActivity.this, MasterImage.getImage().getUri()); return parser.readImgData(false); mPrimaryImgData = parser.readImgData(true); mAuxImgData = parser.readImgData(false); return null; } @Override protected void onPostExecute(byte[] result) { if(result == null) { protected void onPostExecute(Void result) { if(mPrimaryImgData == null || mAuxImgData == null) { // parse failed MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_FAILED); } else { mLoadMpoTask = new LoadMpoDataTask(); mLoadMpoTask.execute(result); mLoadMpoTask.execute(mPrimaryImgData, mAuxImgData); } Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); Loading @@ -1228,12 +1239,17 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL @Override protected Boolean doInBackground(byte[]... params) { return MasterImage.getImage().loadMpo(params[0]); return MasterImage.getImage().loadMpo(params[0], params[1]); } @Override protected void onPostExecute(Boolean result) { MasterImage.getImage().setDepthMapLoadingStatus(result?DdmStatus.DDM_LOADED:DdmStatus.DDM_FAILED); Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); if (currentPanel instanceof MainPanel) { MainPanel mainPanel = (MainPanel) currentPanel; mainPanel.updateDualCameraButton(); } stopLoadingIndicator(); } } Loading src/com/android/gallery3d/filtershow/category/CategoryPanel.java +1 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener { mAdapter.initializeSelection(MainPanel.DUALCAM); } activity.updateCategories(); break; } case MainPanel.TRUESCANNER: { mAdapter = activity.getCategoryTrueScannerAdapter(); Loading src/com/android/gallery3d/filtershow/category/MainPanel.java +5 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.gallery3d.filtershow.filters.SimpleMakeupImageFilter; import com.android.gallery3d.filtershow.filters.TrueScannerActs; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.state.StatePanel; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine.DdmStatus; public class MainPanel extends Fragment implements BottomPanel.BottomPanelDelegate { Loading Loading @@ -171,6 +172,10 @@ public class MainPanel extends Fragment implements BottomPanel.BottomPanelDelega geometryButton = (ImageButton) bottomPanel.findViewById(R.id.geometryButton); filtersButton = (ImageButton) bottomPanel.findViewById(R.id.colorsButton); dualCamButton = (ImageButton) bottomPanel.findViewById(R.id.dualCamButton); if(!DualCameraNativeEngine.getInstance().isLibLoaded()) { dualCamButton.setVisibility(View.GONE); } if (SimpleMakeupImageFilter.HAS_TS_MAKEUP) { makeupButton = (ImageButton) bottomPanel.findViewById(R.id.makeupButton); makeupButton.setVisibility(View.VISIBLE); Loading src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +2 −3 Original line number Diff line number Diff line Loading @@ -53,7 +53,6 @@ import com.android.gallery3d.filtershow.pipeline.SharedPreset; import com.android.gallery3d.filtershow.state.StateAdapter; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine.DdmStatus; import com.android.gallery3d.mpo.MpoParser; public class MasterImage implements RenderingRequestCaller { Loading Loading @@ -957,11 +956,11 @@ public class MasterImage implements RenderingRequestCaller { return mPreset.contains(FilterRepresentation.TYPE_TINYPLANET); } public boolean loadMpo(byte[] auxiliaryMpoData) { public boolean loadMpo(byte[] primaryMpoData, byte[] auxiliaryMpoData) { boolean loaded = false; if(auxiliaryMpoData != null) { Bitmap primaryBm = ImageLoader.loadBitmap(getActivity(), getUri(), null); Bitmap primaryBm = BitmapFactory.decodeByteArray(primaryMpoData, 0, primaryMpoData.length); if(primaryBm == null) { return false; Loading src/com/android/gallery3d/mpo/MpoParser.java +57 −26 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.HashMap; import android.content.ContentResolver; import android.content.Context; Loading @@ -62,12 +64,13 @@ public class MpoParser { private int mMpHeaderOffset; private int mIfd1Offset; private int mMpEntryOffset; private MpEntry mPrimaryEntry; private MpEntry mSecondaryEntry; private HashMap<Short, MpoTag> mTags = new HashMap<Short, MpoTag>(); private ArrayList<MpEntry> mMpEntries = new ArrayList<MpEntry>(); private MpoParser(Context context, Uri uri) { mContentResolver = context.getContentResolver(); mUri = uri; mTags.clear(); InputStream is = null; try { Loading Loading @@ -136,41 +139,61 @@ public class MpoParser { mDataStream.skipTo(mIfd1Offset); int count = mDataStream.readShort(); // add 6 (2 for count, 4 for offset to next IFD) for(int i=0; i<count; i++) { MpoTag tag = readMpoTag(); mTags.put(tag.mId, tag); } mMpEntryOffset = mIfd1Offset + (count*MP_INDEX_FIELD_SIZE_BYTES) + 6; } private MpEntry readMpEntryData() { try { private MpoTag readMpoTag() throws IOException { MpoTag tag = new MpoTag(); tag.mId = mDataStream.readShort(); tag.mType = mDataStream.readShort(); tag.mCount = mDataStream.readInt(); tag.mData = mDataStream.readInt(); return tag; } private void readMpEntryData() throws IOException { MpoTag numImagesTag = mTags.get((short)0xB001); int numImages = numImagesTag.mData; mDataStream.skipTo(mMpEntryOffset); mPrimaryEntry = new MpEntry(); mPrimaryEntry.mImgAttribute = mDataStream.readInt(); mPrimaryEntry.mImgSize = mDataStream.readInt(); mPrimaryEntry.mImgDataOffset = mDataStream.readInt(); mPrimaryEntry.mDepImg1Entry = mDataStream.readShort(); mPrimaryEntry.mDepImg2Entry = mDataStream.readShort(); mSecondaryEntry = new MpEntry(); mSecondaryEntry.mImgAttribute = mDataStream.readInt(); mSecondaryEntry.mImgSize = mDataStream.readInt(); mSecondaryEntry.mImgDataOffset = mDataStream.readInt(); mSecondaryEntry.mDepImg1Entry = mDataStream.readShort(); mSecondaryEntry.mDepImg2Entry = mDataStream.readShort(); } catch (IOException e) { e.printStackTrace(); for(int i=0; i<numImages; i++) { MpEntry mpEntry = new MpEntry(); mpEntry.mImgAttribute = mDataStream.readInt(); mpEntry.mImgSize = mDataStream.readInt(); mpEntry.mImgDataOffset = mDataStream.readInt(); mpEntry.mDepImg1Entry = mDataStream.readShort(); mpEntry.mDepImg2Entry = mDataStream.readShort(); mMpEntries.add(mpEntry); } return mPrimaryEntry; } public byte[] readImgData(boolean primary) { MpEntry mpEntry = null; byte[] data = null; if(mMpEntries.size() < 2){ // not enough entries were read. return null; } if(primary) { mpEntry = mPrimaryEntry; if(mMpEntries.size() > 2) { mpEntry = mMpEntries.get(1); } else { mpEntry = mMpEntries.get(0); } } else { if(mMpEntries.size() > 2) { mpEntry = mMpEntries.get(2); } else { mpEntry = mSecondaryEntry; mpEntry = mMpEntries.get(1); } } if(mpEntry == null) Loading Loading @@ -288,4 +311,12 @@ public class MpoParser { short mDepImg1Entry; short mDepImg2Entry; } class MpoTag { short mId; short mType; int mCount; int mData; } } Loading
src/com/android/gallery3d/filtershow/FilterShowActivity.java +25 −9 Original line number Diff line number Diff line Loading @@ -19,8 +19,8 @@ package com.android.gallery3d.filtershow; import java.io.File; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Vector; import java.util.Locale; import java.util.Vector; import android.app.ActionBar; import android.app.AlertDialog; Loading Loading @@ -62,10 +62,10 @@ import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.view.ViewPropertyAnimator; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; Loading Loading @@ -917,6 +917,11 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL mParseMpoTask.execute(); } else { MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_FAILED); Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); if (currentPanel instanceof MainPanel) { MainPanel mainPanel = (MainPanel) currentPanel; mainPanel.updateDualCameraButton(); } } } Loading Loading @@ -1190,26 +1195,32 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL } } private class ParseMpoDataTask extends AsyncTask<Void, Void, byte[]> { private class ParseMpoDataTask extends AsyncTask<Void, Void, Void> { private byte[] mPrimaryImgData = null; private byte[] mAuxImgData = null; @Override protected void onPreExecute() { MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_PARSING); } @Override protected byte[] doInBackground(Void... params) { protected Void doInBackground(Void... params) { MpoParser parser = MpoParser.parse(FilterShowActivity.this, MasterImage.getImage().getUri()); return parser.readImgData(false); mPrimaryImgData = parser.readImgData(true); mAuxImgData = parser.readImgData(false); return null; } @Override protected void onPostExecute(byte[] result) { if(result == null) { protected void onPostExecute(Void result) { if(mPrimaryImgData == null || mAuxImgData == null) { // parse failed MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_FAILED); } else { mLoadMpoTask = new LoadMpoDataTask(); mLoadMpoTask.execute(result); mLoadMpoTask.execute(mPrimaryImgData, mAuxImgData); } Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); Loading @@ -1228,12 +1239,17 @@ public class FilterShowActivity extends FragmentActivity implements OnItemClickL @Override protected Boolean doInBackground(byte[]... params) { return MasterImage.getImage().loadMpo(params[0]); return MasterImage.getImage().loadMpo(params[0], params[1]); } @Override protected void onPostExecute(Boolean result) { MasterImage.getImage().setDepthMapLoadingStatus(result?DdmStatus.DDM_LOADED:DdmStatus.DDM_FAILED); Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); if (currentPanel instanceof MainPanel) { MainPanel mainPanel = (MainPanel) currentPanel; mainPanel.updateDualCameraButton(); } stopLoadingIndicator(); } } Loading
src/com/android/gallery3d/filtershow/category/CategoryPanel.java +1 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener { mAdapter.initializeSelection(MainPanel.DUALCAM); } activity.updateCategories(); break; } case MainPanel.TRUESCANNER: { mAdapter = activity.getCategoryTrueScannerAdapter(); Loading
src/com/android/gallery3d/filtershow/category/MainPanel.java +5 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import com.android.gallery3d.filtershow.filters.SimpleMakeupImageFilter; import com.android.gallery3d.filtershow.filters.TrueScannerActs; import com.android.gallery3d.filtershow.imageshow.MasterImage; import com.android.gallery3d.filtershow.state.StatePanel; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine.DdmStatus; public class MainPanel extends Fragment implements BottomPanel.BottomPanelDelegate { Loading Loading @@ -171,6 +172,10 @@ public class MainPanel extends Fragment implements BottomPanel.BottomPanelDelega geometryButton = (ImageButton) bottomPanel.findViewById(R.id.geometryButton); filtersButton = (ImageButton) bottomPanel.findViewById(R.id.colorsButton); dualCamButton = (ImageButton) bottomPanel.findViewById(R.id.dualCamButton); if(!DualCameraNativeEngine.getInstance().isLibLoaded()) { dualCamButton.setVisibility(View.GONE); } if (SimpleMakeupImageFilter.HAS_TS_MAKEUP) { makeupButton = (ImageButton) bottomPanel.findViewById(R.id.makeupButton); makeupButton.setVisibility(View.VISIBLE); Loading
src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +2 −3 Original line number Diff line number Diff line Loading @@ -53,7 +53,6 @@ import com.android.gallery3d.filtershow.pipeline.SharedPreset; import com.android.gallery3d.filtershow.state.StateAdapter; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine; import com.android.gallery3d.filtershow.tools.DualCameraNativeEngine.DdmStatus; import com.android.gallery3d.mpo.MpoParser; public class MasterImage implements RenderingRequestCaller { Loading Loading @@ -957,11 +956,11 @@ public class MasterImage implements RenderingRequestCaller { return mPreset.contains(FilterRepresentation.TYPE_TINYPLANET); } public boolean loadMpo(byte[] auxiliaryMpoData) { public boolean loadMpo(byte[] primaryMpoData, byte[] auxiliaryMpoData) { boolean loaded = false; if(auxiliaryMpoData != null) { Bitmap primaryBm = ImageLoader.loadBitmap(getActivity(), getUri(), null); Bitmap primaryBm = BitmapFactory.decodeByteArray(primaryMpoData, 0, primaryMpoData.length); if(primaryBm == null) { return false; Loading
src/com/android/gallery3d/mpo/MpoParser.java +57 −26 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import java.io.InputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; import java.util.ArrayList; import java.util.HashMap; import android.content.ContentResolver; import android.content.Context; Loading @@ -62,12 +64,13 @@ public class MpoParser { private int mMpHeaderOffset; private int mIfd1Offset; private int mMpEntryOffset; private MpEntry mPrimaryEntry; private MpEntry mSecondaryEntry; private HashMap<Short, MpoTag> mTags = new HashMap<Short, MpoTag>(); private ArrayList<MpEntry> mMpEntries = new ArrayList<MpEntry>(); private MpoParser(Context context, Uri uri) { mContentResolver = context.getContentResolver(); mUri = uri; mTags.clear(); InputStream is = null; try { Loading Loading @@ -136,41 +139,61 @@ public class MpoParser { mDataStream.skipTo(mIfd1Offset); int count = mDataStream.readShort(); // add 6 (2 for count, 4 for offset to next IFD) for(int i=0; i<count; i++) { MpoTag tag = readMpoTag(); mTags.put(tag.mId, tag); } mMpEntryOffset = mIfd1Offset + (count*MP_INDEX_FIELD_SIZE_BYTES) + 6; } private MpEntry readMpEntryData() { try { private MpoTag readMpoTag() throws IOException { MpoTag tag = new MpoTag(); tag.mId = mDataStream.readShort(); tag.mType = mDataStream.readShort(); tag.mCount = mDataStream.readInt(); tag.mData = mDataStream.readInt(); return tag; } private void readMpEntryData() throws IOException { MpoTag numImagesTag = mTags.get((short)0xB001); int numImages = numImagesTag.mData; mDataStream.skipTo(mMpEntryOffset); mPrimaryEntry = new MpEntry(); mPrimaryEntry.mImgAttribute = mDataStream.readInt(); mPrimaryEntry.mImgSize = mDataStream.readInt(); mPrimaryEntry.mImgDataOffset = mDataStream.readInt(); mPrimaryEntry.mDepImg1Entry = mDataStream.readShort(); mPrimaryEntry.mDepImg2Entry = mDataStream.readShort(); mSecondaryEntry = new MpEntry(); mSecondaryEntry.mImgAttribute = mDataStream.readInt(); mSecondaryEntry.mImgSize = mDataStream.readInt(); mSecondaryEntry.mImgDataOffset = mDataStream.readInt(); mSecondaryEntry.mDepImg1Entry = mDataStream.readShort(); mSecondaryEntry.mDepImg2Entry = mDataStream.readShort(); } catch (IOException e) { e.printStackTrace(); for(int i=0; i<numImages; i++) { MpEntry mpEntry = new MpEntry(); mpEntry.mImgAttribute = mDataStream.readInt(); mpEntry.mImgSize = mDataStream.readInt(); mpEntry.mImgDataOffset = mDataStream.readInt(); mpEntry.mDepImg1Entry = mDataStream.readShort(); mpEntry.mDepImg2Entry = mDataStream.readShort(); mMpEntries.add(mpEntry); } return mPrimaryEntry; } public byte[] readImgData(boolean primary) { MpEntry mpEntry = null; byte[] data = null; if(mMpEntries.size() < 2){ // not enough entries were read. return null; } if(primary) { mpEntry = mPrimaryEntry; if(mMpEntries.size() > 2) { mpEntry = mMpEntries.get(1); } else { mpEntry = mMpEntries.get(0); } } else { if(mMpEntries.size() > 2) { mpEntry = mMpEntries.get(2); } else { mpEntry = mSecondaryEntry; mpEntry = mMpEntries.get(1); } } if(mpEntry == null) Loading Loading @@ -288,4 +311,12 @@ public class MpoParser { short mDepImg1Entry; short mDepImg2Entry; } class MpoTag { short mId; short mType; int mCount; int mData; } }