From d0aa2279d8e014b742609805cdb3407daaec2b11 Mon Sep 17 00:00:00 2001 From: nicolasroard Date: Mon, 8 Oct 2012 21:04:48 -0700 Subject: Add procedural borders bug:7233980 Change-Id: I81008efa3d256061ec27d1ca2333debfb0ab6dd5 --- .../gallery3d/filtershow/FilterShowActivity.java | 28 ++++---- .../filters/ImageFilterParametricBorder.java | 79 ++++++++++++++++++++++ .../filtershow/imageshow/ImageSmallFilter.java | 25 ++++--- .../gallery3d/filtershow/presets/ImagePreset.java | 58 +++++++++------- 4 files changed, 142 insertions(+), 48 deletions(-) create mode 100644 src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java index 02ffe75b7..80849b174 100644 --- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java +++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java @@ -8,6 +8,7 @@ import android.app.ProgressDialog; import android.content.ContentValues; import android.content.Intent; import android.content.res.Resources; +import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; @@ -32,6 +33,7 @@ import com.android.gallery3d.R; import com.android.gallery3d.filtershow.cache.ImageLoader; import com.android.gallery3d.filtershow.filters.ImageFilter; import com.android.gallery3d.filtershow.filters.ImageFilterBorder; +import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder; import com.android.gallery3d.filtershow.filters.ImageFilterRS; import com.android.gallery3d.filtershow.imageshow.ImageBorder; import com.android.gallery3d.filtershow.imageshow.ImageCrop; @@ -400,29 +402,24 @@ 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[8]; + ImageFilter[] borders = new ImageFilter[7]; borders[p++] = new ImageFilterBorder(null); + borders[p++] = new ImageFilterParametricBorder(Color.WHITE, 100, 0); + borders[p++] = new ImageFilterParametricBorder(Color.BLACK, 100, 0); + borders[p++] = new ImageFilterParametricBorder(Color.WHITE, 100, 100); + borders[p++] = new ImageFilterParametricBorder(Color.BLACK, 100, 100); Drawable npd3 = getResources().getDrawable(R.drawable.filtershow_border_film3); borders[p++] = new ImageFilterBorder(npd3); Drawable npd = getResources().getDrawable( R.drawable.filtershow_border_scratch3); borders[p++] = new ImageFilterBorder(npd); - Drawable npd2 = getResources().getDrawable(R.drawable.filtershow_border_black); - borders[p++] = new ImageFilterBorder(npd2); - Drawable npd6 = getResources().getDrawable( - R.drawable.filtershow_border_rounded_black); - borders[p++] = new ImageFilterBorder(npd6); - Drawable npd4 = getResources().getDrawable(R.drawable.filtershow_border_white); - borders[p++] = new ImageFilterBorder(npd4); - Drawable npd5 = getResources().getDrawable( - R.drawable.filtershow_border_rounded_white); - borders[p++] = new ImageFilterBorder(npd5); for (int i = 0; i < p; i++) { ImageSmallFilter filter = new ImageSmallFilter(getBaseContext()); filter.setImageFilter(borders[i]); filter.setController(this); + filter.setBorder(true); filter.setImageLoader(mImageLoader); filter.setShowTitle(false); listBorders.addView(filter); @@ -595,18 +592,19 @@ public class FilterShowActivity extends Activity implements OnItemClickListener, invalidateViews(); } - public void useImageFilter(ImageFilter imageFilter) { + public void useImageFilter(ImageFilter imageFilter, boolean setBorder) { if (imageFilter == null) { return; } ImagePreset oldPreset = mImageShow.getImagePreset(); ImagePreset copy = new ImagePreset(oldPreset); // TODO: use a numerical constant instead. - if (imageFilter.getName().equalsIgnoreCase("Border")) { - copy.remove("Border"); + if (setBorder) { copy.setHistoryName("Border"); + copy.setBorder(imageFilter); + } else { + copy.add(imageFilter); } - copy.add(imageFilter); mImageShow.setImagePreset(copy); invalidateViews(); } diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java new file mode 100644 index 000000000..2ead04764 --- /dev/null +++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java @@ -0,0 +1,79 @@ + +package com.android.gallery3d.filtershow.filters; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; + +public class ImageFilterParametricBorder extends ImageFilter { + private int mBorderColor = Color.WHITE; + private int mBorderSize = 10; + private int mBorderCornerRadius = 10; + + public ImageFilterParametricBorder() { + mName = "Border"; + } + + public ImageFilterParametricBorder(int color, int size, int radius) { + setBorder(color, size, radius); + } + + @Override + public ImageFilter clone() throws CloneNotSupportedException { + ImageFilterParametricBorder filter = (ImageFilterParametricBorder) super.clone(); + filter.setBorder(mBorderColor, mBorderSize, mBorderCornerRadius); + return filter; + } + + @Override + public boolean same(ImageFilter filter) { + boolean isBorderFilter = super.same(filter); + if (!isBorderFilter) { + return false; + } + ImageFilterParametricBorder borderFilter = (ImageFilterParametricBorder) filter; + if (borderFilter.mBorderColor != mBorderColor) { + return false; + } + if (borderFilter.mBorderSize != mBorderSize) { + return false; + } + if (borderFilter.mBorderCornerRadius != mBorderCornerRadius) { + return false; + } + return true; + } + + public void setBorder(int color, int size, int radius) { + mBorderColor = color; + mBorderSize = size; + mBorderCornerRadius = radius; + } + + @Override + public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) { + Canvas canvas = new Canvas(bitmap); + Path border = new Path(); + border.moveTo(0, 0); + int w = bitmap.getWidth(); + int h = bitmap.getHeight(); + float bs = mBorderSize * scaleFactor; + float r = mBorderCornerRadius * scaleFactor; + border.lineTo(0, h); + border.lineTo(w, h); + border.lineTo(w, 0); + border.lineTo(0, 0); + border.addRoundRect(new RectF(bs, bs, w - bs, h - bs), + r, r, Path.Direction.CW); + + Paint paint = new Paint(); + paint.setAntiAlias(true); + paint.setColor(mBorderColor); + canvas.drawPath(border, paint); + return bitmap; + } + +} diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java index 401d96fb1..162d3ab32 100644 --- a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java +++ b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java @@ -1,18 +1,14 @@ package com.android.gallery3d.filtershow.imageshow; -import com.android.gallery3d.filtershow.FilterShowActivity; -import com.android.gallery3d.filtershow.filters.ImageFilter; -import com.android.gallery3d.filtershow.presets.ImagePreset; - import android.content.Context; import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; import android.util.AttributeSet; -import android.util.Log; import android.view.View; -import android.view.View.MeasureSpec; + +import com.android.gallery3d.filtershow.FilterShowActivity; +import com.android.gallery3d.filtershow.filters.ImageFilter; +import com.android.gallery3d.filtershow.presets.ImagePreset; public class ImageSmallFilter extends ImageShow implements View.OnClickListener { @@ -20,6 +16,7 @@ public class ImageSmallFilter extends ImageShow implements View.OnClickListener private FilterShowActivity mController = null; private ImageFilter mImageFilter = null; private boolean mShowTitle = true; + private boolean mSetBorder = false; public ImageSmallFilter(Context context, AttributeSet attrs) { super(context, attrs); @@ -37,26 +34,33 @@ public class ImageSmallFilter extends ImageShow implements View.OnClickListener mImagePreset.add(mImageFilter); } + public void setBorder(boolean value) { + mSetBorder = value; + } + public void setController(FilterShowActivity activity) { mController = activity; } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int parentWidth = MeasureSpec.getSize(widthMeasureSpec); int parentHeight = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(parentHeight, parentHeight); } + @Override public void onClick(View v) { if (mController != null) { if (mImageFilter != null) { - mController.useImageFilter(mImageFilter); + mController.useImageFilter(mImageFilter, mSetBorder); } else if (mImagePreset != null) { mController.useImagePreset(mImagePreset); } } } + @Override public Bitmap getOriginalFrontBitmap() { if (mImageLoader == null) { return null; @@ -69,14 +73,17 @@ public class ImageSmallFilter extends ImageShow implements View.OnClickListener invalidate(); } + @Override public boolean showTitle() { return mShowTitle; } + @Override public boolean showControls() { return false; } + @Override public boolean showHires() { return false; } diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java index 830f3cb70..a7b4b4090 100644 --- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java +++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java @@ -2,12 +2,10 @@ package com.android.gallery3d.filtershow.presets; import android.graphics.Bitmap; -import android.graphics.RectF; import android.util.Log; import com.android.gallery3d.filtershow.ImageStateAdapter; import com.android.gallery3d.filtershow.filters.ImageFilter; -import com.android.gallery3d.filtershow.filters.ImageFilterStraighten; import com.android.gallery3d.filtershow.imageshow.GeometryMetadata; import com.android.gallery3d.filtershow.imageshow.ImageShow; @@ -16,32 +14,32 @@ import java.util.Vector; public class ImagePreset { private static final String LOGTAG = "ImagePreset"; - ImageShow mEndPoint = null; + + private ImageShow mEndPoint = null; + private ImageFilter mImageBorder = null; + private float mScaleFactor = 1.0f; + private boolean mIsHighQuality = false; + protected Vector mFilters = new Vector(); protected String mName = "Original"; protected String mHistoryName = "Original"; protected boolean mIsFxPreset = false; - enum FullRotate { - ZERO, NINETY, HUNDRED_EIGHTY, TWO_HUNDRED_SEVENTY - } - - // This is where the geometry metadata lives now. public final GeometryMetadata mGeoData = new GeometryMetadata(); - public void setGeometry(GeometryMetadata m) { - mGeoData.set(m); + enum FullRotate { + ZERO, NINETY, HUNDRED_EIGHTY, TWO_HUNDRED_SEVENTY } - private float mScaleFactor = 1.0f; - private boolean mIsHighQuality = false; - public ImagePreset() { setup(); } public ImagePreset(ImagePreset source) { try { + if (source.mImageBorder != null) { + mImageBorder = source.mImageBorder.clone(); + } for (int i = 0; i < source.mFilters.size(); i++) { add(source.mFilters.elementAt(i).clone()); } @@ -55,6 +53,14 @@ public class ImagePreset { mGeoData.set(source.mGeoData); } + public void setGeometry(GeometryMetadata m) { + mGeoData.set(m); + } + + public void setBorder(ImageFilter filter) { + mImageBorder = filter; + } + public boolean isFx() { return mIsFxPreset; } @@ -83,6 +89,15 @@ public class ImagePreset { if (!mGeoData.equals(preset.mGeoData)) { return false; } + + if (mImageBorder != preset.mImageBorder) { + return false; + } + + if (mImageBorder != null && !mImageBorder.same(preset.mImageBorder)) { + return false; + } + for (int i = 0; i < preset.mFilters.size(); i++) { ImageFilter a = preset.mFilters.elementAt(i); ImageFilter b = mFilters.elementAt(i); @@ -138,20 +153,15 @@ public class ImagePreset { // First we apply any transform -- 90 rotate, flip, straighten, crop Bitmap bitmap = mGeoData.apply(original, mScaleFactor, mIsHighQuality); - // TODO -- apply borders separately - ImageFilter borderFilter = null; + if (mImageBorder != null) { + bitmap = mImageBorder.apply(bitmap, mScaleFactor, mIsHighQuality); + } + for (int i = 0; i < mFilters.size(); i++) { ImageFilter filter = mFilters.elementAt(i); - if (filter.getName().equalsIgnoreCase("Border")) { - // TODO don't use the name as an id - borderFilter = filter; - } else { - bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality); - } - } - if (borderFilter != null) { - bitmap = borderFilter.apply(bitmap, mScaleFactor, mIsHighQuality); + bitmap = filter.apply(bitmap, mScaleFactor, mIsHighQuality); } + if (mEndPoint != null) { mEndPoint.updateFilteredImage(bitmap); } -- cgit v1.2.3