diff options
Diffstat (limited to 'src/com/android/gallery3d/filtershow')
-rwxr-xr-x | src/com/android/gallery3d/filtershow/FilterShowActivity.java | 36 | ||||
-rwxr-xr-x | src/com/android/gallery3d/filtershow/category/MainPanel.java | 18 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/gallery3d/filtershow/editors/EditorDualCamFusion.java | 189 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java | 57 | ||||
-rwxr-xr-x | src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java | 31 | ||||
-rwxr-xr-x | src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java | 29 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/gallery3d/filtershow/imageshow/ImageDualCamera.java | 4 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/gallery3d/filtershow/imageshow/MasterImage.java | 13 | ||||
-rwxr-xr-x[-rw-r--r--] | src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java | 62 |
9 files changed, 355 insertions, 84 deletions
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 8ada5af9b..f769b5ecd 100755 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -39,6 +39,7 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; @@ -105,6 +106,9 @@ import com.android.gallery3d.filtershow.editors.HazeBusterEditor; import com.android.gallery3d.filtershow.editors.ImageOnlyEditor; import com.android.gallery3d.filtershow.editors.SeeStraightEditor; import com.android.gallery3d.filtershow.editors.TrueScannerEditor; +import com.android.gallery3d.filtershow.filters.FilterDualCamBasicRepresentation; +import com.android.gallery3d.filtershow.filters.FilterDualCamFusionRepresentation; +import com.android.gallery3d.filtershow.filters.FilterDualCamSketchRepresentation; import com.android.gallery3d.filtershow.filters.FilterMirrorRepresentation; import com.android.gallery3d.filtershow.filters.FilterRepresentation; import com.android.gallery3d.filtershow.filters.FilterRotateRepresentation; @@ -1156,6 +1160,23 @@ DialogInterface.OnDismissListener, PopupMenu.OnDismissListener{ return; } } + if (representation.getFilterType() == FilterRepresentation.TYPE_DUALCAM) { + DisplayMetrics dm = getResources().getDisplayMetrics(); + float[] mTmpPoint = new float[2]; + mTmpPoint[0] = dm.widthPixels/2; + mTmpPoint[1] = dm.heightPixels/2; + Matrix m = MasterImage.getImage().getScreenToImageMatrix(true); + m.mapPoints(mTmpPoint); + if (representation instanceof FilterDualCamBasicRepresentation) { + ((FilterDualCamBasicRepresentation)representation).setPoint((int)mTmpPoint[0],(int)mTmpPoint[1]); + } + if (representation instanceof FilterDualCamFusionRepresentation) { + ((FilterDualCamFusionRepresentation)representation).setPoint((int)mTmpPoint[0],(int)mTmpPoint[1]); + } + if (representation instanceof FilterDualCamSketchRepresentation) { + ((FilterDualCamSketchRepresentation)representation).setPoint((int)mTmpPoint[0],(int)mTmpPoint[1]); + } + } useFilterRepresentation(representation); loadEditorPanel(representation); @@ -1290,23 +1311,20 @@ DialogInterface.OnDismissListener, PopupMenu.OnDismissListener{ mAuxImgData == null) { // parse failed MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_FAILED); - Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); - if (currentPanel instanceof MainPanel) { - MainPanel mainPanel = (MainPanel) currentPanel; - mainPanel.updateDualCameraButton(); - } } else { + MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_LOADING); mLoadMpoTask = new LoadMpoDataTask(); mLoadMpoTask.execute(mPrimaryImgData, mAuxImgData); } + Fragment currentPanel = getSupportFragmentManager().findFragmentByTag(MainPanel.FRAGMENT_TAG); + if (currentPanel instanceof MainPanel) { + MainPanel mainPanel = (MainPanel) currentPanel; + mainPanel.updateDualCameraButton(); + } } } private class LoadMpoDataTask extends AsyncTask<byte[], Void, Boolean> { - @Override - protected void onPreExecute() { - MasterImage.getImage().setDepthMapLoadingStatus(DdmStatus.DDM_LOADING); - } @Override protected Boolean doInBackground(byte[]... params) { diff --git a/src/com/android/gallery3d/filtershow/category/MainPanel.java b/src/com/android/gallery3d/filtershow/category/MainPanel.java index ea84934c3..055d7a430 100755 --- a/src/com/android/gallery3d/filtershow/category/MainPanel.java +++ b/src/com/android/gallery3d/filtershow/category/MainPanel.java @@ -247,7 +247,23 @@ public class MainPanel extends Fragment implements BottomPanel.BottomPanelDelega dualCamButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - showPanel(DUALCAM); + Context context = getActivity(); + boolean skipIntro = GalleryUtils.getBooleanPref(context, + context.getString(R.string.pref_dualcam_intro_show_key), false); + if (skipIntro) { + showPanel(DUALCAM); + } else { + DoNotShowAgainDialog dialog = new DoNotShowAgainDialog( + R.string.dual_camera_effects, R.string.dual_camera_effects_intro, + R.string.pref_dualcam_intro_show_key) { + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + showPanel(DUALCAM); + } + }; + dialog.show(getFragmentManager(), "dualcam_intro"); + } } }); diff --git a/src/com/android/gallery3d/filtershow/editors/EditorDualCamFusion.java b/src/com/android/gallery3d/filtershow/editors/EditorDualCamFusion.java index 2371ccb15..f4490b330 100644..100755 --- a/src/com/android/gallery3d/filtershow/editors/EditorDualCamFusion.java +++ b/src/com/android/gallery3d/filtershow/editors/EditorDualCamFusion.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -30,37 +30,58 @@ package com.android.gallery3d.filtershow.editors; import android.content.Context; +import android.content.DialogInterface; import android.net.Uri; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.view.LayoutInflater; +import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; -import android.widget.Button; +import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.LinearLayout; -import org.codeaurora.gallery.R; import com.android.gallery3d.filtershow.FilterShowActivity; import com.android.gallery3d.filtershow.filters.FilterDualCamFusionRepresentation; import com.android.gallery3d.filtershow.filters.FilterRepresentation; import com.android.gallery3d.filtershow.imageshow.ImageFusion; import com.android.gallery3d.filtershow.imageshow.MasterImage; +import com.android.gallery3d.filtershow.ui.DoNotShowAgainDialog; +import com.android.gallery3d.util.GalleryUtils; + +import org.codeaurora.gallery.R; -public class EditorDualCamFusion extends ImageOnlyEditor { +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +public class EditorDualCamFusion extends Editor { public static final String TAG = EditorDualCamFusion.class.getSimpleName(); public static final int ID = R.id.editorDualCamFusion; protected ImageFusion mImageFusion; - private Button mPickUnderlayBtn; - private OnClickListener mPickBtnClickListener = new OnClickListener() { - @Override - public void onClick(View arg0) { - MasterImage.getImage().getActivity().pickImage(FilterShowActivity.SELECT_FUSION_UNDERLAY); - } - }; + private Uri mUnderlayUri = Uri.EMPTY; public EditorDualCamFusion() { super(ID); } + @Override + public boolean showsActionBar() { + return true; + } + + @Override + public boolean showsActionBarControls() { + return false; + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + menu.clear(); + } + public boolean useUtilityPanel() { return true; } @@ -77,48 +98,123 @@ public class EditorDualCamFusion extends ImageOnlyEditor { @Override public void setEditPanelUI(View editControl) { - editControl.setVisibility(View.GONE); + ViewGroup controlContainer = (ViewGroup) editControl; + controlContainer.removeAllViews(); + + LayoutInflater inflater = (LayoutInflater) mContext.getSystemService + (Context.LAYOUT_INFLATER_SERVICE); + View controls = inflater.inflate(R.layout.filtershow_seekbar, controlContainer); + View seekbar = controls.findViewById(R.id.primarySeekBar); + seekbar.setVisibility(View.GONE); + View saveButton = controls.findViewById(R.id.slider_save); + if (saveButton != null) { + saveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FilterShowActivity activity = (FilterShowActivity) mContext; + finalApplyCalled(); + activity.leaveSeekBarPanel(); + } + }); + } + View cancelButton = controls.findViewById(R.id.slider_cancel); + if (cancelButton != null) { + cancelButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FilterShowActivity activity = (FilterShowActivity) mContext; + activity.cancelCurrentFilter(); + activity.leaveSeekBarPanel(); + } + }); + } } @Override public void openUtilityPanel(final LinearLayout accessoryViewList) { - super.openUtilityPanel(accessoryViewList); - mPickUnderlayBtn = (Button) accessoryViewList.findViewById(R.id.applyEffect); - updateText(); - } - - public void setUnderlayImageUri(Uri uri) { - FilterRepresentation filter = getLocalRepresentation(); - if(filter instanceof FilterDualCamFusionRepresentation) { - mImageFusion.setUnderlay(uri); - commitLocalRepresentation(); + accessoryViewList.removeAllViews(); + + LayoutInflater inflater = (LayoutInflater) mContext.getSystemService + (Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(R.layout.filtershow_actionbar_dualcam_fusion, accessoryViewList); + + View pickUnderlayBtn = accessoryViewList.findViewById(R.id.pick_underlay); + pickUnderlayBtn.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + MasterImage.getImage().getActivity().pickImage(FilterShowActivity.SELECT_FUSION_UNDERLAY); + } + }); + + // Look for previous underlay + String fusionUnderlay = GalleryUtils.getStringPref(mContext, + mContext.getString(R.string.pref_dualcam_fusion_underlay_key), null); + Uri fusionUri = Uri.EMPTY; + + if (fusionUnderlay != null) { + fusionUri = Uri.parse(fusionUnderlay); + if (!uriExists(mContext, fusionUri)) + fusionUri = Uri.EMPTY; } - } - private void updateEffectButton(boolean enabled) { - mPickUnderlayBtn.setEnabled(enabled); - if(enabled) { - mPickUnderlayBtn.setOnClickListener(mPickBtnClickListener); - mPickUnderlayBtn.setText(R.string.fusion_pick_underlay); - } else { - mPickUnderlayBtn.setOnClickListener(null); - mPickUnderlayBtn.setText(R.string.fusion_pick_point); - } + setUnderlayImageUri(fusionUri); } - - protected void updateText() { - if(mPickUnderlayBtn != null) { - updateEffectButton(hasSegment()); + @Override + public void resume() { + if (mUnderlayUri.equals(Uri.EMPTY)) { + // No underlay set. + boolean skipIntro = GalleryUtils.getBooleanPref(mContext, + mContext.getString(R.string.pref_dualcam_fusion_intro_show_key), false); + if (!skipIntro) { + FragmentManager fm = ((FilterShowActivity) mContext).getSupportFragmentManager(); + DoNotShowAgainDialog dialog = + (DoNotShowAgainDialog) fm.findFragmentByTag("dualcam_fusion_intro"); + if (dialog == null) { + dialog = new DoNotShowAgainDialog( + R.string.fusion_pick_background, R.string.dualcam_fusion_intro, + R.string.pref_dualcam_fusion_intro_show_key) { + @Override + public void onCancel(DialogInterface dialog) { + super.onCancel(dialog); + FilterShowActivity activity = (FilterShowActivity) mContext; + activity.cancelCurrentFilter(); + activity.leaveSeekBarPanel(); + } + }; + dialog.setOnOkButtonClickListener(new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + MasterImage.getImage().getActivity().pickImage(FilterShowActivity.SELECT_FUSION_UNDERLAY); + } + }); + dialog.setCancelable(true); + dialog.show(fm, "dualcam_fusion_intro"); + } else if (dialog.isDetached()) { + FragmentTransaction ft = fm.beginTransaction(); + ft.attach(dialog); + ft.commit(); + } else if (dialog.isHidden()) { + FragmentTransaction ft = fm.beginTransaction(); + ft.show(dialog); + ft.commit(); + } + } } } - private boolean hasSegment() { + public void setUnderlayImageUri(Uri uri) { + mUnderlayUri = uri; FilterRepresentation filter = getLocalRepresentation(); - if(filter instanceof FilterDualCamFusionRepresentation) { - return !((FilterDualCamFusionRepresentation) filter).getPoint().equals(-1,-1); + if (filter instanceof FilterDualCamFusionRepresentation) { + mImageFusion.setUnderlay(uri); + commitLocalRepresentation(); + + // save fusion underlay uri + GalleryUtils.setStringPref(mContext, + mContext.getString(R.string.pref_dualcam_fusion_underlay_key), + (uri != null) ? uri.toString() : null); } - return false; } @Override @@ -130,4 +226,17 @@ public class EditorDualCamFusion extends ImageOnlyEditor { mImageFusion.setRepresentation(dualRep); } } + + private boolean uriExists(Context context, Uri uri) { + try { + InputStream stream = context.getContentResolver().openInputStream(uri); + stream.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return false; + } catch (IOException e) { + e.printStackTrace(); + } + return true; + } } diff --git a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java index b9c24fc27..0d98c7b0e 100644..100755 --- a/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java +++ b/src/com/android/gallery3d/filtershow/filters/BaseFiltersManager.java @@ -423,22 +423,30 @@ public abstract class BaseFiltersManager implements FiltersManagerInterface { public void addDualCam(Context context) { int[] textId = { R.string.focus, - R.string.halo + R.string.halo, + R.string.motion, + R.string.posterize }; int[] overlayId = { R.drawable.focus, - R.drawable.halo + R.drawable.halo, + R.drawable.motion, + R.drawable.posterize }; String[] serializationNames = { "DUAL_CAM_FOCUS", - "DUAL_CAM_HALO" + "DUAL_CAM_HALO", + "DUAL_CAM_MOTION", + "DUAL_CAM_POSTERIZE" }; // intensity range as defined by ddm lib int[][] minMaxValues = { {0,5,10}, + {0,5,10}, + {0,5,10}, {0,5,10} }; @@ -460,13 +468,42 @@ public abstract class BaseFiltersManager implements FiltersManagerInterface { addRepresentation(dualCam); } - FilterDualCamSketchRepresentation sketch = new FilterDualCamSketchRepresentation( - context.getString(R.string.sketch), R.string.sketch); - sketch.setOverlayId(R.drawable.sketch); - sketch.setOverlayOnly(true); - sketch.setSerializationName("DUAL_CAM_SKETCH"); - mDualCam.add(sketch); - addRepresentation(sketch); + int[] textId2 = { + R.string.sketch, + R.string.zoom, + R.string.bw, + R.string.blackboard, + R.string.whiteboard, + R.string.dc_negative + }; + + int[] overlayId2 = { + R.drawable.sketch, + R.drawable.zoom, + R.drawable.bw, + R.drawable.blackboard, + R.drawable.whiteboard, + R.drawable.negative + }; + + String[] serializationNames2 = { + "DUAL_CAM_SKETCH", + "DUAL_CAM_ZOOM", + "DUAL_CAM_BW", + "DUAL_CAM_BLACKBOARD", + "DUAL_CAM_WHITEBOARD", + "DUAL_CAM_NEGATIVE" + }; + + for (int i = 0; i < textId2.length; i++) { + FilterDualCamSketchRepresentation dualCam = new FilterDualCamSketchRepresentation( + context.getString(textId2[i]), textId2[i]); + dualCam.setOverlayId(overlayId2[i]); + dualCam.setOverlayOnly(true); + dualCam.setSerializationName(serializationNames2[i]); + mDualCam.add(dualCam); + addRepresentation(dualCam); + } mDualCam.add(getRepresentation(ImageFilterDualCamFusion.class)); } diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java index 0eb49ab8a..21906540b 100755 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamSketch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -116,8 +116,33 @@ public class ImageFilterDualCamSketch extends ImageFilter { } filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(filteredW, filteredH, BitmapCache.FILTERS); - result = DualCameraNativeEngine.getInstance().applySketch(point.x, point.y, - roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + + switch (mParameters.getTextId()) { + case R.string.sketch: + result = DualCameraNativeEngine.getInstance().applySketch(point.x, point.y, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.zoom: + result = DualCameraNativeEngine.getInstance().applyZoom(point.x, point.y, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.bw: + result = DualCameraNativeEngine.getInstance().applyBlackAndWhite(point.x, point.y, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.blackboard: + result = DualCameraNativeEngine.getInstance().applyBlackBoard(point.x, point.y, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.whiteboard: + result = DualCameraNativeEngine.getInstance().applyWhiteBoard(point.x, point.y, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.dc_negative: + result = DualCameraNativeEngine.getInstance().applyNegative(point.x, point.y, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + } if(result == false) { Log.e(TAG, "Imagelib API failed"); diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java index ba6bff691..7bcba5162 100755 --- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDualCamera.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -121,15 +121,24 @@ public class ImageFilterDualCamera extends ImageFilter { filteredBitmap = MasterImage.getImage().getBitmapCache().getBitmap(filteredW, filteredH, BitmapCache.FILTERS); - switch(mParameters.getTextId()) { - case R.string.focus: - result = DualCameraNativeEngine.getInstance().applyFocus(point.x, point.y, intensity, - roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); - break; - case R.string.halo: - result = DualCameraNativeEngine.getInstance().applyHalo(point.x, point.y, intensity, - roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); - break; + switch (mParameters.getTextId()) { + case R.string.focus: + result = DualCameraNativeEngine.getInstance().applyFocus(point.x, point.y, intensity, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.halo: + result = DualCameraNativeEngine.getInstance().applyHalo(point.x, point.y, intensity, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.motion: + result = DualCameraNativeEngine.getInstance().applyMotion(point.x, point.y, intensity, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + case R.string.posterize: + result = DualCameraNativeEngine.getInstance().applyPosterize(point.x, point.y, intensity, + roiRect, quality != FilterEnvironment.QUALITY_FINAL, filteredBitmap); + break; + } if(result == false) { diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageDualCamera.java b/src/com/android/gallery3d/filtershow/imageshow/ImageDualCamera.java index 962519373..cb864aa2d 100644..100755 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageDualCamera.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageDualCamera.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -75,6 +75,6 @@ public class ImageDualCamera extends ImageShow { } private void calcScreenMapping() { - mToOrig = getScreenToImageMatrix(true); + mToOrig = MasterImage.getImage().getScreenToImageMatrix(true); } } diff --git a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java index 0a13da737..09950262e 100644..100755 --- a/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java +++ b/src/com/android/gallery3d/filtershow/imageshow/MasterImage.java @@ -21,6 +21,7 @@ import java.util.Vector; import android.animation.Animator; import android.animation.ValueAnimator; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; @@ -767,7 +768,7 @@ public class MasterImage implements RenderingRequestCaller { return m; } - private Matrix getScreenToImageMatrix(boolean reflectRotation) { + public Matrix getScreenToImageMatrix(boolean reflectRotation) { Matrix m = getImageToScreenMatrix(reflectRotation); Matrix invert = new Matrix(); m.invert(invert); @@ -960,7 +961,7 @@ public class MasterImage implements RenderingRequestCaller { return mPreset.contains(FilterRepresentation.TYPE_TINYPLANET); } - public boolean loadMpo(byte[] primaryMpoData, byte[] auxiliaryMpoData) { + public boolean loadMpo(Context context, byte[] primaryMpoData, byte[] auxiliaryMpoData, Uri uri){ boolean loaded = false; if(auxiliaryMpoData != null) { @@ -971,7 +972,7 @@ public class MasterImage implements RenderingRequestCaller { } // check for pre-generated dm file - String mpoFilepath = ImageLoader.getLocalPathFromUri(getActivity(), getUri()); + String mpoFilepath = ImageLoader.getLocalPathFromUri(context, uri); // read auxiliary image and generate depth map. Bitmap auxiliaryBm = BitmapFactory.decodeByteArray(auxiliaryMpoData, 0, auxiliaryMpoData.length); @@ -983,7 +984,7 @@ public class MasterImage implements RenderingRequestCaller { DualCameraNativeEngine.getInstance().initDepthMap( primaryBm, auxiliaryBm, mpoFilepath, - DualCameraNativeEngine.getInstance().getCalibFilepath(mActivity)); + DualCameraNativeEngine.getInstance().getCalibFilepath(context),1.0f); primaryBm.recycle(); primaryBm = null; @@ -1017,6 +1018,10 @@ public class MasterImage implements RenderingRequestCaller { return loaded; } + public boolean loadMpo(byte[] primaryMpoData, byte[] auxiliaryMpoData) { + return loadMpo(getActivity(), primaryMpoData, auxiliaryMpoData, getUri()); + } + public void setFusionUnderlay(Bitmap underlay) { mFusionUnderlay = underlay; } diff --git a/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java b/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java index f44f4d6d1..56b349677 100644..100755 --- a/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java +++ b/src/com/android/gallery3d/filtershow/tools/DualCameraNativeEngine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -38,6 +38,9 @@ import android.util.Log; public class DualCameraNativeEngine { private static final String TAG = "DualCameraNativeEngine"; + + public static final float DEFAULT_BRIGHTNESS_INTENSITY = 1.0f; + static { try { System.loadLibrary("jni_dualcamera"); @@ -56,7 +59,7 @@ public class DualCameraNativeEngine { DDM_LOADING, DDM_LOADED, DDM_FAILED - }; + } public static final String DEPTH_MAP_EXT = "dm"; private static final String CALIBRATION_FILENAME = "ddm_calib_file.dat"; @@ -64,10 +67,11 @@ public class DualCameraNativeEngine { private static DualCameraNativeEngine mInstance; - private DualCameraNativeEngine() {} + private DualCameraNativeEngine() { + } public static void createInstance() { - if(mInstance == null) { + if (mInstance == null) { mInstance = new DualCameraNativeEngine(); } } @@ -86,7 +90,7 @@ public class DualCameraNativeEngine { return calibFile.getAbsolutePath(); } - native public boolean initDepthMap(Bitmap primaryRGBA, Bitmap auxiliaryRGBA, String mpoFilepath, String calibFilepath); + native public boolean initDepthMap(Bitmap primaryRGBA, Bitmap auxiliaryRGBA, String mpoFilepath, String calibFilepath, float brIntensity); native public void releaseDepthMap(); @@ -94,11 +98,59 @@ public class DualCameraNativeEngine { native public boolean getDepthMap(Bitmap dataBuffer); + native private boolean get3DEffectImages(Bitmap bitmap, Bitmap depthMap); + native public boolean applyFocus(int focusPointX, int focusPointY, float intensity, int[] roiRect, boolean isPreview, Bitmap outBm); + native public boolean applyFocusStar(int focusPointX, int focusPointY, float intensity, int[] roiRect, boolean isPreview, Bitmap outBm); + + native public boolean applyFocusHexagon(int focusPointX, int focusPointY, float intensity, int[] roiRect, boolean isPreview, Bitmap outBm); + native public boolean applyHalo(int focusPointX, int focusPointY, float intensity, int[] roiRect, boolean isPreview, Bitmap outBm); + native public boolean applyMotion(int focusPointX, int focusPointY, float intensity, int[] roiRect, boolean isPreview, Bitmap outBm); + native public boolean applySketch(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + native public boolean applyZoom(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + + native public boolean applyBlackAndWhite(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + + native public boolean applyBlackBoard(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + + native public boolean applyWhiteBoard(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + + native public boolean applyPosterize(int focusPointX, int focusPointY, float intensity, int[] roiRect, boolean isPreview, Bitmap outBm); + + native public boolean applyNegative(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + native public boolean getForegroundImg(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + + native public boolean getPrimaryImg(int focusPointX, int focusPointY, int[] roiRect, boolean isPreview, Bitmap outBm); + + public static class DepthMap3D { + public char[] pixels; + public int width; + public int height; + } + + public DepthMap3D getDepthMap3D(Bitmap bitmap) { + int width = bitmap.getWidth(), height = bitmap.getHeight(); + Bitmap depthMap = Bitmap.createBitmap(width, height, Bitmap.Config.ALPHA_8); + boolean ok = get3DEffectImages(bitmap, depthMap); + if (!ok) return null; + + DepthMap3D map = new DepthMap3D(); + map.width = width; + map.height = height; + map.pixels = new char[width * height]; + + int[] pixels = new int[width * height]; + depthMap.getPixels(pixels, 0, width, 0, 0, width, height); + for (int i = width * height - 1; i >= 0; --i) { + map.pixels[i] = (char) (pixels[i] & 0xff); + } + depthMap.recycle(); + return map; + } } |