summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/filtershow')
-rw-r--r--src/com/android/gallery3d/filtershow/FilterShowActivity.java42
-rw-r--r--src/com/android/gallery3d/filtershow/PanelController.java45
-rw-r--r--src/com/android/gallery3d/filtershow/cache/ImageLoader.java15
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilter.java3
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java3
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java2
-rw-r--r--src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java3
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java7
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java6
-rw-r--r--src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java42
-rw-r--r--src/com/android/gallery3d/filtershow/presets/ImagePreset.java4
-rw-r--r--src/com/android/gallery3d/filtershow/ui/FramedTextButton.java37
-rw-r--r--src/com/android/gallery3d/filtershow/ui/ImageCurves.java16
-rw-r--r--src/com/android/gallery3d/filtershow/ui/Spline.java18
14 files changed, 210 insertions, 33 deletions
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index 8d3790e3b..fd6d9294d 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -159,6 +159,8 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
// TODO: get those values from XML.
ImageZoom.setZoomedSize(getPixelsFromDip(256));
FramedTextButton.setTextSize((int) getPixelsFromDip(14));
+ FramedTextButton.setTrianglePadding((int) getPixelsFromDip(4));
+ FramedTextButton.setTriangleSize((int) getPixelsFromDip(10));
ImageShow.setTextSize((int) getPixelsFromDip(12));
ImageShow.setTextPadding((int) getPixelsFromDip(10));
ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4));
@@ -201,6 +203,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mImageFlip = (ImageFlip) findViewById(R.id.imageFlip);
mImageTinyPlanet = (ImageTinyPlanet) findViewById(R.id.imageTinyPlanet);
+ mImageCrop.setAspectTextSize((int) getPixelsFromDip(18));
ImageCrop.setTouchTolerance((int) getPixelsFromDip(25));
mImageViews.add(mImageShow);
mImageViews.add(mImageCurves);
@@ -228,6 +231,11 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
mGeometryButton = (ImageButton) findViewById(R.id.geometryButton);
mColorsButton = (ImageButton) findViewById(R.id.colorsButton);
+ mBottomPanelButtons.add(mFxButton);
+ mBottomPanelButtons.add(mBorderButton);
+ mBottomPanelButtons.add(mGeometryButton);
+ mBottomPanelButtons.add(mColorsButton);
+
mImageShow.setImageLoader(mImageLoader);
mImageCurves.setImageLoader(mImageLoader);
mImageCurves.setMaster(mImageShow);
@@ -463,6 +471,10 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
if (mainPanelWidth == 0) {
mainPanelWidth = mainViewWidth;
}
+ int filtersPanelWidth = findViewById(R.id.filtersPanel).getWidth();
+ if (mainPanelWidth < filtersPanelWidth) {
+ mainPanelWidth = filtersPanelWidth;
+ }
int leftOver = mainViewWidth - mainPanelWidth - accessoryPanelWidth;
if (leftOver < 0) {
return -accessoryPanelWidth;
@@ -704,19 +716,29 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
// TODO: use listview
// TODO: load the borders straight from the filesystem
int p = 0;
- ImageFilter[] borders = new ImageFilter[7];
+ ImageFilter[] borders = new ImageFilter[12];
borders[p++] = new ImageFilterBorder(null);
Drawable npd1 = getResources().getDrawable(R.drawable.filtershow_border_4x5);
borders[p++] = new ImageFilterBorder(npd1);
Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_brush);
borders[p++] = new ImageFilterBorder(npd2);
+ Drawable npd3 = getResources().getDrawable(R.drawable.filtershow_border_grunge);
+ borders[p++] = new ImageFilterBorder(npd3);
+ Drawable npd4 = getResources().getDrawable(R.drawable.filtershow_border_sumi_e);
+ borders[p++] = new ImageFilterBorder(npd4);
+ Drawable npd5 = getResources().getDrawable(R.drawable.filtershow_border_tape);
+ borders[p++] = new ImageFilterBorder(npd5);
borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize, 0);
borders[p++] = new ImageFilterParametricBorder(Color.BLACK, mImageBorderSize,
mImageBorderSize);
borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize, 0);
borders[p++] = new ImageFilterParametricBorder(Color.WHITE, mImageBorderSize,
mImageBorderSize);
+ int creamColor = Color.argb(255, 237, 237, 227);
+ borders[p++] = new ImageFilterParametricBorder(creamColor, mImageBorderSize, 0);
+ borders[p++] = new ImageFilterParametricBorder(creamColor, mImageBorderSize,
+ mImageBorderSize);
ImageSmallFilter previousFilter = null;
for (int i = 0; i < p; i++) {
@@ -779,6 +801,22 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
}
}
+ public void disableFilterButtons() {
+ for (ImageButton b : mBottomPanelButtons) {
+ b.setEnabled(false);
+ b.setClickable(false);
+ b.setAlpha(0.4f);
+ }
+ }
+
+ public void enableFilterButtons() {
+ for (ImageButton b : mBottomPanelButtons) {
+ b.setEnabled(true);
+ b.setClickable(true);
+ b.setAlpha(1.0f);
+ }
+ }
+
// //////////////////////////////////////////////////////////////////////////////
// imageState panel...
@@ -860,7 +898,7 @@ public class FilterShowActivity extends Activity implements OnItemClickListener,
invalidateOptionsMenu();
}
- private void resetHistory() {
+ void resetHistory() {
mNullFxFilter.onClick(mNullFxFilter);
mNullBorderFilter.onClick(mNullBorderFilter);
diff --git a/src/com/android/gallery3d/filtershow/PanelController.java b/src/com/android/gallery3d/filtershow/PanelController.java
index 03a9d8bd5..e92c54936 100644
--- a/src/com/android/gallery3d/filtershow/PanelController.java
+++ b/src/com/android/gallery3d/filtershow/PanelController.java
@@ -41,7 +41,6 @@ import com.android.gallery3d.filtershow.filters.ImageFilterVibrance;
import com.android.gallery3d.filtershow.filters.ImageFilterVignette;
import com.android.gallery3d.filtershow.filters.ImageFilterWBalance;
import com.android.gallery3d.filtershow.imageshow.ImageCrop;
-import com.android.gallery3d.filtershow.imageshow.ImageGeometry;
import com.android.gallery3d.filtershow.imageshow.ImageShow;
import com.android.gallery3d.filtershow.presets.ImagePreset;
import com.android.gallery3d.filtershow.ui.FramedTextButton;
@@ -57,6 +56,7 @@ public class PanelController implements OnClickListener {
private static int HORIZONTAL_MOVE = 1;
private static final int ANIM_DURATION = 200;
private static final String LOGTAG = "PanelController";
+ private boolean mDisableFilterButtons = false;
class Panel {
private final View mView;
@@ -158,38 +158,52 @@ public class PanelController implements OnClickListener {
ImageCrop imageCrop = (ImageCrop) mCurrentImage;
switch (itemId) {
case R.id.crop_menu_1to1: {
- button.setText(mContext.getString(R.string.aspect1to1_effect));
+ String t = mContext.getString(R.string.aspect1to1_effect);
+ button.setText(t);
imageCrop.apply(1, 1);
+ imageCrop.setAspectString(t);
break;
}
case R.id.crop_menu_4to3: {
- button.setText(mContext.getString(R.string.aspect4to3_effect));
+ String t = mContext.getString(R.string.aspect4to3_effect);
+ button.setText(t);
imageCrop.apply(4, 3);
+ imageCrop.setAspectString(t);
break;
}
case R.id.crop_menu_3to4: {
- button.setText(mContext.getString(R.string.aspect3to4_effect));
+ String t = mContext.getString(R.string.aspect3to4_effect);
+ button.setText(t);
imageCrop.apply(3, 4);
+ imageCrop.setAspectString(t);
break;
}
case R.id.crop_menu_5to7: {
- button.setText(mContext.getString(R.string.aspect5to7_effect));
+ String t = mContext.getString(R.string.aspect5to7_effect);
+ button.setText(t);
imageCrop.apply(5, 7);
+ imageCrop.setAspectString(t);
break;
}
case R.id.crop_menu_7to5: {
- button.setText(mContext.getString(R.string.aspect7to5_effect));
+ String t = mContext.getString(R.string.aspect7to5_effect);
+ button.setText(t);
imageCrop.apply(7, 5);
+ imageCrop.setAspectString(t);
break;
}
case R.id.crop_menu_none: {
- button.setText(mContext.getString(R.string.aspectNone_effect));
+ String t = mContext.getString(R.string.aspectNone_effect);
+ button.setText(t);
imageCrop.applyClear();
+ imageCrop.setAspectString(t);
break;
}
case R.id.crop_menu_original: {
- button.setText(mContext.getString(R.string.aspectOriginal_effect));
+ String t = mContext.getString(R.string.aspectOriginal_effect);
+ button.setText(t);
imageCrop.applyOriginal();
+ imageCrop.setAspectString(t);
break;
}
}
@@ -332,6 +346,10 @@ public class PanelController implements OnClickListener {
mCurrentImage.resetParameter();
mCurrentImage.select();
}
+ if (mDisableFilterButtons) {
+ mActivity.enableFilterButtons();
+ mDisableFilterButtons = false;
+ }
}
public boolean onBackPressed() {
@@ -343,6 +361,11 @@ public class PanelController implements OnClickListener {
mMasterImage.onItemClick(position);
showPanel(mCurrentPanel);
mCurrentImage.select();
+ if (mDisableFilterButtons) {
+ mActivity.enableFilterButtons();
+ mActivity.resetHistory();
+ mDisableFilterButtons = false;
+ }
return false;
}
@@ -580,6 +603,10 @@ public class PanelController implements OnClickListener {
String ename = mCurrentImage.getContext().getString(R.string.tinyplanet);
mUtilityPanel.setEffectName(ename);
ensureFilter(ename);
+ if (!mDisableFilterButtons) {
+ mActivity.disableFilterButtons();
+ mDisableFilterButtons = true;
+ }
break;
}
case R.id.straightenButton: {
@@ -594,7 +621,7 @@ public class PanelController implements OnClickListener {
mUtilityPanel.setEffectName(ename);
mUtilityPanel.setShowParameter(false);
if (mCurrentImage instanceof ImageCrop && mUtilityPanel.firstTimeCropDisplayed){
- ((ImageCrop) mCurrentImage).applyOriginal();
+ ((ImageCrop) mCurrentImage).applyClear();
mUtilityPanel.firstTimeCropDisplayed = false;
}
mUtilityPanel.showAspectButtons();
diff --git a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
index a89199602..afef58aad 100644
--- a/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
+++ b/src/com/android/gallery3d/filtershow/cache/ImageLoader.java
@@ -50,6 +50,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;
+import java.util.concurrent.locks.ReentrantLock;
public class ImageLoader {
@@ -83,6 +84,8 @@ public class ImageLoader {
private Rect mOriginalBounds = null;
private static int mZoomOrientation = ORI_NORMAL;
+ private ReentrantLock mLoadingLock = new ReentrantLock();
+
public ImageLoader(FilterShowActivity activity, Context context) {
mActivity = activity;
mContext = context;
@@ -99,6 +102,7 @@ public class ImageLoader {
}
public void loadBitmap(Uri uri,int size) {
+ mLoadingLock.lock();
mUri = uri;
mOrientation = getOrientation(mContext, uri);
mOriginalBitmapSmall = loadScaledBitmap(uri, 160);
@@ -108,6 +112,7 @@ public class ImageLoader {
}
mOriginalBitmapLarge = loadScaledBitmap(uri, size);
updateBitmaps();
+ mLoadingLock.unlock();
}
public Uri getUri() {
@@ -146,6 +151,8 @@ public class ImageLoader {
}
} catch (SQLiteException e){
return ExifInterface.ORIENTATION_UNDEFINED;
+ } catch (IllegalArgumentException e) {
+ return ExifInterface.ORIENTATION_UNDEFINED;
} finally {
Utils.closeSilently(cursor);
}
@@ -308,10 +315,12 @@ public class ImageLoader {
}
public void addListener(ImageShow imageShow) {
+ mLoadingLock.lock();
if (!mListeners.contains(imageShow)) {
mListeners.add(imageShow);
}
mHiresCache.addObserver(imageShow);
+ mLoadingLock.unlock();
}
private void warnListeners() {
@@ -333,6 +342,7 @@ public class ImageLoader {
// move this to a background thread.
public Bitmap getScaleOneImageForPreset(ImageShow caller, ImagePreset imagePreset, Rect bounds,
boolean force) {
+ mLoadingLock.lock();
Bitmap bmp = mZoomCache.getImage(imagePreset, bounds);
if (force || bmp == null) {
bmp = loadRegionBitmap(mUri, bounds);
@@ -347,12 +357,14 @@ public class ImageLoader {
return bmp2;
}
}
+ mLoadingLock.unlock();
return bmp;
}
// Caching method
public Bitmap getImageForPreset(ImageShow caller, ImagePreset imagePreset,
boolean hiRes) {
+ mLoadingLock.lock();
if (mOriginalBitmapSmall == null) {
return null;
}
@@ -377,13 +389,16 @@ public class ImageLoader {
mCache.addObserver(caller);
}
}
+ mLoadingLock.unlock();
return filteredImage;
}
public void resetImageForPreset(ImagePreset imagePreset, ImageShow caller) {
+ mLoadingLock.lock();
mHiresCache.reset(imagePreset);
mCache.reset(imagePreset);
mZoomCache.reset(imagePreset);
+ mLoadingLock.unlock();
}
public void saveImage(ImagePreset preset, final FilterShowActivity filterShowActivity,
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
index d00c7e31b..7f4d5ed2a 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
@@ -130,6 +130,9 @@ public class ImageFilter implements Cloneable {
}
public boolean same(ImageFilter filter) {
+ if (filter == null) {
+ return false;
+ }
if (!filter.getName().equalsIgnoreCase(getName())) {
return false;
}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java
index a310358ce..1d198e45c 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java
@@ -51,6 +51,9 @@ public class ImageFilterBorder extends ImageFilter {
if (!isBorderFilter) {
return false;
}
+ if (!(filter instanceof ImageFilterBorder)) {
+ return false;
+ }
ImageFilterBorder borderFilter = (ImageFilterBorder) filter;
if (mNinePatch != borderFilter.mNinePatch) {
return false;
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java
index bdcb0ea4e..d74a6faab 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterGeometry.java
@@ -72,7 +72,7 @@ public class ImageFilterGeometry extends ImageFilter {
Rect cropBounds = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
RectF crop = mGeometry.getCropBounds(bitmap);
if (crop.width() > 0 && crop.height() > 0)
- crop.roundOut(cropBounds);
+ cropBounds = GeometryMath.roundNearest(crop);
Bitmap temp = null;
if (mGeometry.hasSwitchedWidthHeight()) {
temp = Bitmap.createBitmap(cropBounds.height(), cropBounds.width(), mConfig);
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java
index 3d6954691..ade3cb26b 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java
@@ -56,6 +56,9 @@ public class ImageFilterParametricBorder extends ImageFilter {
if (!isBorderFilter) {
return false;
}
+ if (!(filter instanceof ImageFilterParametricBorder)) {
+ return false;
+ }
ImageFilterParametricBorder borderFilter = (ImageFilterParametricBorder) filter;
if (borderFilter.mBorderColor != mBorderColor) {
return false;
diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java
index 33a3f73cb..55f791820 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMath.java
@@ -16,6 +16,7 @@
package com.android.gallery3d.filtershow.imageshow;
+import android.graphics.Rect;
import android.graphics.RectF;
public class GeometryMath {
@@ -99,4 +100,10 @@ public class GeometryMath {
return Math.min(newWidth / oldWidth , newHeight / oldHeight);
}
+ public static Rect roundNearest(RectF r){
+ Rect q = new Rect(Math.round(r.left), Math.round(r.top), Math.round(r.right),
+ Math.round(r.bottom));
+ return q;
+ }
+
}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java
index cf52b15ca..dffdc2449 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/GeometryMetadata.java
@@ -59,10 +59,8 @@ public class GeometryMetadata {
if (mStraightenRotation != 0) {
return true;
}
- Rect cropBounds = new Rect();
- mCropBounds.roundOut(cropBounds);
- Rect photoBounds = new Rect();
- mPhotoBounds.roundOut(photoBounds);
+ Rect cropBounds = GeometryMath.roundNearest(mCropBounds);
+ Rect photoBounds = GeometryMath.roundNearest(mPhotoBounds);
if (!cropBounds.equals(photoBounds)) {
return true;
}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java b/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java
index 35e8ad4b7..a352a16e7 100644
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java
+++ b/src/com/android/gallery3d/filtershow/imageshow/ImageCrop.java
@@ -62,6 +62,17 @@ public class ImageCrop extends ImageGeometry {
private static final String LOGTAG = "ImageCrop";
+ private String mAspect = "";
+ private int mAspectTextSize = 24;
+
+ public void setAspectTextSize(int textSize){
+ mAspectTextSize = textSize;
+ }
+
+ public void setAspectString(String a){
+ mAspect = a;
+ }
+
private static final Paint gPaint = new Paint();
public ImageCrop(Context context) {
@@ -581,7 +592,7 @@ public class ImageCrop extends ImageGeometry {
public void imageLoaded() {
super.imageLoaded();
syncLocalToMasterGeometry();
- applyOriginal();
+ applyClear();
invalidate();
}
@@ -642,6 +653,35 @@ public class ImageCrop extends ImageGeometry {
gPaint.setStyle(Paint.Style.STROKE);
drawRuleOfThird(canvas, crop, gPaint);
+ if (mFixAspectRatio){
+ float w = crop.width();
+ float h = crop.height();
+ float diag = (float) Math.sqrt(w*w + h*h);
+
+ float dash_len = 20;
+ int num_intervals = (int) (diag / dash_len);
+ float [] tl = { crop.left, crop.top };
+ float centX = tl[0] + w/2;
+ float centY = tl[1] + h/2 + 5;
+ float [] br = { crop.right, crop.bottom };
+ float [] vec = GeometryMath.getUnitVectorFromPoints(tl, br);
+
+ float [] counter = tl;
+ for (int x = 0; x < num_intervals; x++ ){
+ float tempX = counter[0] + vec[0] * dash_len;
+ float tempY = counter[1] + vec[1] * dash_len;
+ if ((x % 2) == 0 && Math.abs(x - num_intervals / 2) > 2){
+ canvas.drawLine(counter[0], counter[1], tempX, tempY, gPaint);
+ }
+ counter[0] = tempX;
+ counter[1] = tempY;
+ }
+
+ gPaint.setTextAlign(Paint.Align.CENTER);
+ gPaint.setTextSize(mAspectTextSize);
+ canvas.drawText(mAspect, centX, centY, gPaint);
+ }
+
gPaint.setColor(mBorderColor);
gPaint.setStrokeWidth(3);
gPaint.setStyle(Paint.Style.STROKE);
diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
index 8943f30de..2522c8966 100644
--- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
@@ -181,7 +181,7 @@ public class ImagePreset {
return false;
}
- if (mImageBorder != preset.mImageBorder) {
+ if (mDoApplyGeometry && mImageBorder != preset.mImageBorder) {
return false;
}
@@ -292,7 +292,7 @@ public class ImagePreset {
}
}
- if (mImageBorder != null) {
+ if (mImageBorder != null && mDoApplyGeometry) {
bitmap = mImageBorder.apply(bitmap, mScaleFactor, mIsHighQuality);
}
diff --git a/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java b/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java
index 17453d070..c717b6e61 100644
--- a/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java
+++ b/src/com/android/gallery3d/filtershow/ui/FramedTextButton.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
+import android.graphics.Path;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.ImageButton;
@@ -32,6 +33,10 @@ public class FramedTextButton extends ImageButton {
private static int mTextSize = 24;
private static int mTextPadding = 20;
private static Paint gPaint = new Paint();
+ private static Path gPath = new Path();
+ private static int mTrianglePadding = 2;
+ private static int mTriangleSize = 30;
+
private Context mContext = null;
public static void setTextSize(int value) {
@@ -42,6 +47,14 @@ public class FramedTextButton extends ImageButton {
mTextPadding = value;
}
+ public static void setTrianglePadding(int value) {
+ mTrianglePadding = value;
+ }
+
+ public static void setTriangleSize(int value) {
+ mTriangleSize = value;
+ }
+
public void setText(String text) {
mText = text;
invalidate();
@@ -84,11 +97,25 @@ public class FramedTextButton extends ImageButton {
@Override
public void onDraw(Canvas canvas) {
- gPaint.setARGB(255, 255, 255, 255);
+ gPaint.setARGB(96, 255, 255, 255);
gPaint.setStrokeWidth(2);
gPaint.setStyle(Paint.Style.STROKE);
- canvas.drawRect(mTextPadding, mTextPadding, getWidth() - mTextPadding,
- getHeight() - mTextPadding, gPaint);
+ int w = getWidth();
+ int h = getHeight();
+ canvas.drawRect(mTextPadding, mTextPadding, w - mTextPadding,
+ h - mTextPadding, gPaint);
+ gPath.reset();
+ gPath.moveTo(w - mTextPadding - mTrianglePadding - mTriangleSize,
+ h - mTextPadding - mTrianglePadding);
+ gPath.lineTo(w - mTextPadding - mTrianglePadding,
+ h - mTextPadding - mTrianglePadding - mTriangleSize);
+ gPath.lineTo(w - mTextPadding - mTrianglePadding,
+ h - mTextPadding - mTrianglePadding);
+ gPath.close();
+ gPaint.setARGB(128, 255, 255, 255);
+ gPaint.setStrokeWidth(1);
+ gPaint.setStyle(Paint.Style.FILL_AND_STROKE);
+ canvas.drawPath(gPath, gPaint);
if (mText != null) {
gPaint.reset();
gPaint.setARGB(255, 255, 255, 255);
@@ -96,8 +123,8 @@ public class FramedTextButton extends ImageButton {
float textWidth = gPaint.measureText(mText);
Rect bounds = new Rect();
gPaint.getTextBounds(mText, 0, mText.length(), bounds);
- int x = (int) ((getWidth() - textWidth) / 2);
- int y = (getHeight() + bounds.height()) / 2;
+ int x = (int) ((w - textWidth) / 2);
+ int y = (h + bounds.height()) / 2;
canvas.drawText(mText, x, y, gPaint);
}
diff --git a/src/com/android/gallery3d/filtershow/ui/ImageCurves.java b/src/com/android/gallery3d/filtershow/ui/ImageCurves.java
index c4ca900e1..7b04133ce 100644
--- a/src/com/android/gallery3d/filtershow/ui/ImageCurves.java
+++ b/src/com/android/gallery3d/filtershow/ui/ImageCurves.java
@@ -43,6 +43,7 @@ public class ImageCurves extends ImageSlave {
private boolean mDidAddPoint = false;
private boolean mDidDelete = false;
private ControlPoint mCurrentControlPoint = null;
+ private int mCurrentPick = -1;
private ImagePreset mLastPreset = null;
int[] redHistogram = new int[256];
int[] greenHistogram = new int[256];
@@ -186,6 +187,7 @@ public class ImageCurves extends ImageSlave {
if (e.getActionMasked() == MotionEvent.ACTION_UP) {
mCurrentControlPoint = null;
+ mCurrentPick = -1;
updateCachedImage();
mDidAddPoint = false;
if (mDidDelete) {
@@ -205,8 +207,9 @@ public class ImageCurves extends ImageSlave {
}
Spline spline = getSpline(mCurrentCurveIndex);
- int pick = pickControlPoint(posX, posY);
+ int pick = mCurrentPick;
if (mCurrentControlPoint == null) {
+ pick = pickControlPoint(posX, posY);
if (pick == -1) {
mCurrentControlPoint = new ControlPoint(posX, posY);
pick = spline.addPoint(mCurrentControlPoint);
@@ -214,10 +217,10 @@ public class ImageCurves extends ImageSlave {
} else {
mCurrentControlPoint = spline.getPoint(pick);
}
+ mCurrentPick = pick;
}
if (spline.isPointContained(posX, pick)) {
- spline.didMovePoint(mCurrentControlPoint);
spline.movePoint(pick, posX, posY);
} else if (pick != -1 && spline.getNbPoints() > 2) {
spline.deletePoint(pick);
@@ -275,8 +278,9 @@ public class ImageCurves extends ImageSlave {
max = histogram[i];
}
}
- float w = getWidth();
- float h = getHeight();
+ float w = getWidth() - Spline.curveHandleSize();
+ float h = getHeight() - Spline.curveHandleSize() / 2.0f;
+ float dx = Spline.curveHandleSize() / 2.0f;
float wl = w / histogram.length;
float wh = (0.3f * h) / max;
Paint paint = new Paint();
@@ -288,12 +292,12 @@ public class ImageCurves extends ImageSlave {
paint2.setStrokeWidth(6);
paint2.setXfermode(new PorterDuffXfermode(mode));
gHistoPath.reset();
- gHistoPath.moveTo(0, h);
+ gHistoPath.moveTo(dx, h);
boolean firstPointEncountered = false;
float prev = 0;
float last = 0;
for (int i = 0; i < histogram.length; i++) {
- float x = i * wl;
+ float x = i * wl + dx;
float l = histogram[i] * wh;
if (l != 0) {
float v = h - (l + prev) / 2.0f;
diff --git a/src/com/android/gallery3d/filtershow/ui/Spline.java b/src/com/android/gallery3d/filtershow/ui/Spline.java
index dd9aac1be..83341772b 100644
--- a/src/com/android/gallery3d/filtershow/ui/Spline.java
+++ b/src/com/android/gallery3d/filtershow/ui/Spline.java
@@ -49,7 +49,11 @@ public class Spline {
mPoints = new Vector<ControlPoint>();
for (int i = 0; i < spline.mPoints.size(); i++) {
ControlPoint p = spline.mPoints.elementAt(i);
- mPoints.add(new ControlPoint(p));
+ ControlPoint newPoint = new ControlPoint(p);
+ mPoints.add(newPoint);
+ if (spline.mCurrentControlPoint == p) {
+ mCurrentControlPoint = newPoint;
+ }
}
Collections.sort(mPoints);
}
@@ -79,7 +83,7 @@ public class Spline {
return Color.WHITE;
}
- public void didMovePoint(ControlPoint point) {
+ private void didMovePoint(ControlPoint point) {
mCurrentControlPoint = point;
}
@@ -90,6 +94,7 @@ public class Spline {
ControlPoint point = mPoints.elementAt(pick);
point.x = x;
point.y = y;
+ didMovePoint(point);
}
public boolean isOriginal() {
@@ -121,13 +126,20 @@ public class Spline {
}
double[] derivatives = solveSystem(points);
int start = 0;
+ int end = 256;
if (points[0].x != 0) {
start = (int) (points[0].x * 256);
}
+ if (points[points.length - 1].x != 1) {
+ end = (int) (points[points.length - 1].x * 256);
+ }
for (int i = 0; i < start; i++) {
curve[i] = 1.0f - points[0].y;
}
- for (int i = start; i < 256; i++) {
+ for (int i = end; i < 256; i++) {
+ curve[i] = 1.0f - points[points.length - 1].y;
+ }
+ for (int i = start; i < end; i++) {
ControlPoint cur = null;
ControlPoint next = null;
double x = i / 256.0;