Merge "Fix LightCycle capture NullPointerException." into gb-ub-photos-bryce
diff --git a/res/layout/filtericonbutton.xml b/res/layout/filtericonbutton.xml
new file mode 100644
index 0000000..8fc98e3
--- /dev/null
+++ b/res/layout/filtericonbutton.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<com.android.gallery3d.filtershow.ui.FilterIconButton
+ style="@style/FilterIconButton" />
diff --git a/res/layout/filtershow_activity.xml b/res/layout/filtershow_activity.xml
index dfd669f..35e83bc 100644
--- a/res/layout/filtershow_activity.xml
+++ b/res/layout/filtershow_activity.xml
@@ -16,6 +16,7 @@
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:iconbutton="http://schemas.android.com/apk/res/com.android.gallery3d"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainView">
@@ -95,12 +96,6 @@
android:layerType="software"
android:visibility="gone" />
- <com.android.gallery3d.filtershow.imageshow.ImageBorder
- android:id="@+id/imageBorder"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:visibility="gone" />
-
<com.android.gallery3d.filtershow.imageshow.ImageZoom
android:id="@+id/imageZoom"
android:layout_width="match_parent"
@@ -123,15 +118,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
- <!--
- <ImageButton
- android:id="@+id/showOriginalButton"
- android:layout_width="64dip"
- android:layout_height="64dip"
- android:layout_gravity="bottom"
- android:scaleType="centerInside"
- android:src="@drawable/filtershow_button_show_original" />
- -->
<com.android.gallery3d.filtershow.CenteredLinearLayout
xmlns:custom="http://schemas.android.com/apk/res/com.android.gallery3d"
@@ -255,37 +241,42 @@
android:id="@+id/listGeometry"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
- android:layout_gravity="center"
+ android:layout_gravity="left"
android:orientation="horizontal">
- <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+ <com.android.gallery3d.filtershow.ui.IconButton
android:id="@+id/straightenButton"
- style="@style/FilterShowBottomButton"
- android:src="@drawable/filtershow_button_geometry_straighten"
+ android:layout_height="match_parent"
+ style="@style/IconButton"
+ android:drawableTop="@drawable/filtershow_button_geometry_straighten"
android:text="@string/straighten" />
- <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+ <com.android.gallery3d.filtershow.ui.IconButton
android:id="@+id/cropButton"
- style="@style/FilterShowBottomButton"
- android:src="@drawable/filtershow_button_geometry_crop"
+ android:layout_height="match_parent"
+ style="@style/IconButton"
+ android:drawableTop="@drawable/filtershow_button_geometry_crop"
android:text="@string/crop" />
- <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+ <com.android.gallery3d.filtershow.ui.IconButton
android:id="@+id/rotateButton"
- style="@style/FilterShowBottomButton"
- android:src="@drawable/filtershow_button_geometry_rotate"
+ android:layout_height="match_parent"
+ style="@style/IconButton"
+ android:drawableTop="@drawable/filtershow_button_geometry_rotate"
android:text="@string/rotate" />
- <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+ <com.android.gallery3d.filtershow.ui.IconButton
android:id="@+id/flipButton"
- style="@style/FilterShowBottomButton"
- android:src="@drawable/filtershow_button_geometry_flip"
+ android:layout_height="match_parent"
+ style="@style/IconButton"
+ android:drawableTop="@drawable/filtershow_button_geometry_flip"
android:text="@string/mirror" />
- <com.android.gallery3d.filtershow.ui.ImageButtonTitle
+ <com.android.gallery3d.filtershow.ui.IconButton
android:id="@+id/redEyeButton"
- style="@style/FilterShowBottomButton"
- android:src="@drawable/photoeditor_effect_redeye"
+ android:layout_height="match_parent"
+ style="@style/IconButton"
+ android:drawableTop="@drawable/photoeditor_effect_redeye"
android:text="@string/redeye" />
</LinearLayout>
@@ -294,7 +285,7 @@
<HorizontalScrollView
android:id="@+id/colorsFxList"
android:layout_width="fill_parent"
- android:layout_height="@dimen/thumbnail_size"
+ android:layout_height="wrap_content"
android:background="@color/background_main_toolbar"
android:visibility="gone"
android:scrollbars="none" >
@@ -302,7 +293,8 @@
<LinearLayout
android:id="@+id/listColorsFx"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
+ android:layout_height="@dimen/thumbnail_size"
+ android:background="@color/background_main_toolbar"
android:layout_marginLeft="@dimen/thumbnail_margin"
android:orientation="horizontal" >
diff --git a/res/values/iconbutton_styles.xml b/res/values/iconbutton_styles.xml
new file mode 100644
index 0000000..e33460a
--- /dev/null
+++ b/res/values/iconbutton_styles.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<resources>
+ <style name="IconButton">
+ <item name="android:layout_width">96dp</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:background">@drawable/filtershow_button_background</item>
+ <item name="android:textColor">@android:color/white</item>
+ <item name="android:textSize">14dp</item>
+ <item name="android:scaleType">centerInside</item>
+ <item name="android:gravity">center</item>
+ <item name="android:padding">6dp</item>
+ <item name="android:drawablePadding">6dp</item>
+ <item name="android:ellipsize">marquee</item>
+ <item name="android:marqueeRepeatLimit">marquee_forever</item>
+ <item name="android:singleLine">true</item>
+ </style>
+
+ <style name="FilterIconButton">
+ <item name="android:layout_width">70dp</item>
+ <item name="android:layout_height">match_parent</item>
+ <item name="android:background">@drawable/filtershow_button_background</item>
+ <item name="android:textColor">@android:color/white</item>
+ <item name="android:textSize">13dp</item>
+ <item name="android:scaleType">centerInside</item>
+ <item name="android:gravity">center</item>
+ <item name="android:paddingLeft">3dp</item>
+ <item name="android:paddingRight">3dp</item>
+ <item name="android:paddingTop">6dp</item>
+ <item name="android:paddingBottom">6dp</item>
+ <item name="android:ellipsize">marquee</item>
+ <item name="android:marqueeRepeatLimit">marquee_forever</item>
+ <item name="android:singleLine">true</item>
+ </style>
+</resources>
diff --git a/src/com/android/gallery3d/filtershow/FilterShowActivity.java b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
index 8ac6f82..b89ab81 100644
--- a/src/com/android/gallery3d/filtershow/FilterShowActivity.java
+++ b/src/com/android/gallery3d/filtershow/FilterShowActivity.java
@@ -22,6 +22,7 @@
import android.app.ProgressDialog;
import android.app.WallpaperManager;
import android.content.ContentValues;
+import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -38,6 +39,7 @@
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -52,6 +54,7 @@
import android.widget.ShareActionProvider;
import android.widget.ShareActionProvider.OnShareTargetSelectedListener;
import android.widget.Toast;
+import android.text.TextUtils;
import com.android.gallery3d.R;
import com.android.gallery3d.data.LocalAlbum;
@@ -63,23 +66,21 @@
import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
import com.android.gallery3d.filtershow.filters.ImageFilterRS;
import com.android.gallery3d.filtershow.filters.ImageFilterRedEye;
-import com.android.gallery3d.filtershow.imageshow.ImageBorder;
import com.android.gallery3d.filtershow.imageshow.ImageCrop;
import com.android.gallery3d.filtershow.imageshow.ImageDraw;
import com.android.gallery3d.filtershow.imageshow.ImageFlip;
import com.android.gallery3d.filtershow.imageshow.ImageRedEyes;
import com.android.gallery3d.filtershow.imageshow.ImageRotate;
import com.android.gallery3d.filtershow.imageshow.ImageShow;
-import com.android.gallery3d.filtershow.imageshow.ImageSmallBorder;
-import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
import com.android.gallery3d.filtershow.imageshow.ImageStraighten;
import com.android.gallery3d.filtershow.imageshow.ImageTinyPlanet;
import com.android.gallery3d.filtershow.imageshow.ImageZoom;
import com.android.gallery3d.filtershow.presets.ImagePreset;
import com.android.gallery3d.filtershow.provider.SharedImageProvider;
import com.android.gallery3d.filtershow.tools.SaveCopyTask;
+import com.android.gallery3d.filtershow.ui.FilterIconButton;
+import com.android.gallery3d.filtershow.ui.IconButton;
import com.android.gallery3d.filtershow.ui.FramedTextButton;
-import com.android.gallery3d.filtershow.ui.ImageButtonTitle;
import com.android.gallery3d.filtershow.ui.ImageCurves;
import com.android.gallery3d.filtershow.ui.Spline;
import com.android.gallery3d.util.GalleryUtils;
@@ -104,7 +105,6 @@
private ImageLoader mImageLoader = null;
private ImageShow mImageShow = null;
private ImageCurves mImageCurves = null;
- private ImageBorder mImageBorders = null;
private ImageRedEyes mImageRedEyes = null;
private ImageDraw mImageDraw = null;
private ImageStraighten mImageStraighten = null;
@@ -126,7 +126,12 @@
private ImageButton mGeometryButton = null;
private ImageButton mColorsButton = null;
- private ImageSmallFilter mCurrentImageSmallFilter = null;
+ private LinearLayout listColors = null;
+ private LinearLayout listFilters = null;
+ private LinearLayout listBorders = null;
+
+ private ImageFilter mCurrentFilter = null;
+
private static final int SELECT_PICTURE = 1;
private static final String LOGTAG = "FilterShowActivity";
protected static final boolean ANIMATE_PANELS = true;
@@ -148,8 +153,9 @@
private static final int SEEK_BAR_MAX = 600;
private LoadBitmapTask mLoadBitmapTask;
- private ImageSmallFilter mNullFxFilter;
- private ImageSmallFilter mNullBorderFilter;
+ private FilterIconButton mNullFxFilter;
+ private FilterIconButton mNullBorderFilter;
+ private int mIconSeedSize = 140;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -158,8 +164,6 @@
ImageFilterRS.setRenderScriptContext(this);
ImageShow.setDefaultBackgroundColor(getResources().getColor(R.color.background_screen));
- ImageSmallFilter.setDefaultBackgroundColor(getResources().getColor(
- R.color.background_main_toolbar));
// TODO: get those values from XML.
ImageZoom.setZoomedSize(getPixelsFromDip(256));
FramedTextButton.setTextSize((int) getPixelsFromDip(14));
@@ -170,10 +174,8 @@
ImageShow.setOriginalTextMargin((int) getPixelsFromDip(4));
ImageShow.setOriginalTextSize((int) getPixelsFromDip(18));
ImageShow.setOriginalText(getResources().getString(R.string.original_picture_text));
- ImageButtonTitle.setTextSize((int) getPixelsFromDip(12));
- ImageButtonTitle.setTextPadding((int) getPixelsFromDip(10));
- ImageSmallFilter.setMargin((int) getPixelsFromDip(3));
- ImageSmallFilter.setTextMargin((int) getPixelsFromDip(4));
+ mIconSeedSize = getResources().getDimensionPixelSize(R.dimen.thumbnail_size);
+
Drawable curveHandle = getResources().getDrawable(R.drawable.camera_crop);
int curveHandleSize = (int) getResources().getDimension(R.dimen.crop_indicator_size);
Spline.setCurveHandle(curveHandle, curveHandleSize);
@@ -194,13 +196,12 @@
mImageLoader = new ImageLoader(this, getApplicationContext());
- LinearLayout listFilters = (LinearLayout) findViewById(R.id.listFilters);
- LinearLayout listBorders = (LinearLayout) findViewById(R.id.listBorders);
- LinearLayout listColors = (LinearLayout) findViewById(R.id.listColorsFx);
+ listFilters = (LinearLayout) findViewById(R.id.listFilters);
+ listBorders = (LinearLayout) findViewById(R.id.listBorders);
+ listColors = (LinearLayout) findViewById(R.id.listColorsFx);
mImageShow = (ImageShow) findViewById(R.id.imageShow);
mImageCurves = (ImageCurves) findViewById(R.id.imageCurves);
- mImageBorders = (ImageBorder) findViewById(R.id.imageBorder);
mImageStraighten = (ImageStraighten) findViewById(R.id.imageStraighten);
mImageZoom = (ImageZoom) findViewById(R.id.imageZoom);
mImageCrop = (ImageCrop) findViewById(R.id.imageCrop);
@@ -215,7 +216,6 @@
ImageCrop.setMinCropSize((int) getPixelsFromDip(55));
mImageViews.add(mImageShow);
mImageViews.add(mImageCurves);
- mImageViews.add(mImageBorders);
mImageViews.add(mImageStraighten);
mImageViews.add(mImageZoom);
mImageViews.add(mImageCrop);
@@ -251,8 +251,6 @@
mImageShow.setImageLoader(mImageLoader);
mImageCurves.setImageLoader(mImageLoader);
mImageCurves.setMaster(mImageShow);
- mImageBorders.setImageLoader(mImageLoader);
- mImageBorders.setMaster(mImageShow);
mImageStraighten.setImageLoader(mImageLoader);
mImageStraighten.setMaster(mImageShow);
mImageZoom.setImageLoader(mImageLoader);
@@ -275,7 +273,6 @@
mPanelController.addImageView(findViewById(R.id.imageShow));
mPanelController.addImageView(findViewById(R.id.imageCurves));
- mPanelController.addImageView(findViewById(R.id.imageBorder));
mPanelController.addImageView(findViewById(R.id.imageStraighten));
mPanelController.addImageView(findViewById(R.id.imageCrop));
mPanelController.addImageView(findViewById(R.id.imageRotate));
@@ -301,21 +298,9 @@
FiltersManager.addFilters(filters, mImageLoader);
for (ImageFilter filter : filters) {
- ImageSmallFilter fView = new ImageSmallFilter(this);
- filter.setParameter(filter.getPreviewParameter());
+ filter.setParameter(filter.getDefaultParameter());
filter.setName(getString(filter.getTextId()));
- fView.setImageFilter(filter);
- fView.setController(this);
- fView.setImageLoader(mImageLoader);
- fView.setId(filter.getButtonId());
- if (filter.getOverlayBitmaps() != 0) {
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- filter.getOverlayBitmaps());
- fView.setOverlayBitmap(bitmap);
- }
- mPanelController.addComponent(mColorsButton, fView);
- mPanelController.addFilter(filter);
- listColors.addView(fView);
+ setupFilterButton(filter, listColors, mColorsButton);
}
mPanelController.addFilter(new ImageFilterRedEye());
@@ -448,6 +433,36 @@
cannotLoadImage();
}
+ mImageShow.requestFilteredImages();
+ Bitmap bmap = mImageShow.getFilteredImage();
+ if (bmap != null && bmap.getWidth() > 0 && bmap.getHeight() > 0) {
+ float w = bmap.getWidth();
+ float h = bmap.getHeight();
+ float f = mIconSeedSize / Math.min(w, h);
+ w = w * f;
+ h = h * f;
+ bmap = Bitmap.createScaledBitmap(bmap, (int) w, (int) h, true);
+
+ int num_colors_buttons = listColors.getChildCount();
+ for (int i = 0; i < num_colors_buttons; i++) {
+ FilterIconButton b = (FilterIconButton) listColors.getChildAt(i);
+
+ b.setIcon(bmap);
+ }
+ int num_filters_buttons = listFilters.getChildCount();
+ for (int i = 0; i < num_filters_buttons; i++) {
+ FilterIconButton b = (FilterIconButton) listFilters.getChildAt(i);
+
+ b.setIcon(bmap);
+ }
+ int num_borders_buttons = listBorders.getChildCount();
+ for (int i = 0; i < num_borders_buttons; i++) {
+ FilterIconButton b = (FilterIconButton) listBorders.getChildAt(i);
+
+ b.setIcon(bmap);
+ }
+
+ }
mLoadBitmapTask = null;
super.onPostExecute(result);
}
@@ -648,6 +663,23 @@
mSaveButton.setEnabled(enable);
}
+ public FilterIconButton setupFilterButton(ImageFilter filter, LinearLayout panel, View button) {
+ LayoutInflater inflater =
+ (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ FilterIconButton icon = (FilterIconButton) inflater.inflate(R.layout.filtericonbutton,
+ panel, false);
+ String text = filter.getName();
+ if (filter instanceof ImageFilterBorder || filter instanceof ImageFilterParametricBorder) {
+ text = "";
+ }
+ icon.setup(text, filter, this, panel);
+ icon.setId(filter.getButtonId());
+ mPanelController.addComponent(button, icon);
+ mPanelController.addFilter(filter);
+ panel.addView(icon);
+ return icon;
+ }
+
private void fillListImages(LinearLayout listFilters) {
// TODO: use listview
// TODO: load the filters straight from the filesystem
@@ -681,34 +713,21 @@
ImagePreset preset = new ImagePreset(getString(R.string.history_original)); // empty
preset.setImageLoader(mImageLoader);
- mNullFxFilter = new ImageSmallFilter(this);
-
- mNullFxFilter.setSelected(true);
- mCurrentImageSmallFilter = mNullFxFilter;
-
- mNullFxFilter.setImageFilter(new ImageFilterFx(null, getString(R.string.none)));
-
- mNullFxFilter.setController(this);
- mNullFxFilter.setImageLoader(mImageLoader);
- listFilters.addView(mNullFxFilter);
- ImageSmallFilter previousFilter = mNullFxFilter;
BitmapFactory.Options o = new BitmapFactory.Options();
o.inScaled = false;
for (int i = 0; i < drawid.length; i++) {
Bitmap b = BitmapFactory.decodeResource(getResources(), drawid[i], o);
- fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]));
+ fxArray[p++] = new ImageFilterFx(b, getString(fxNameid[i]), fxNameid[i]);
}
- ImageSmallFilter filter;
+
+ ImageFilterFx nullFilter = new ImageFilterFx(null, getString(R.string.none), R.string.none);
+ mNullFxFilter = setupFilterButton(nullFilter, listFilters, mFxButton);
+ mNullFxFilter.setSelected(true);
+
for (int i = 0; i < p; i++) {
- filter = new ImageSmallFilter(this);
- filter.setImageFilter(fxArray[i]);
- filter.setController(this);
- filter.setNulfilter(mNullFxFilter);
- filter.setImageLoader(mImageLoader);
- listFilters.addView(filter);
- previousFilter = filter;
+ setupFilterButton(fxArray[i], listFilters, mFxButton);
}
// Default preset (original)
@@ -743,22 +762,13 @@
borders[p++] = new ImageFilterParametricBorder(creamColor, mImageBorderSize,
mImageBorderSize);
- ImageSmallFilter previousFilter = null;
for (int i = 0; i < p; i++) {
- ImageSmallBorder filter = new ImageSmallBorder(this);
- if (i == 0) { // save the first to reset it
- mNullBorderFilter = filter;
- } else {
- filter.setNulfilter(mNullBorderFilter);
- }
borders[i].setName(getString(R.string.borders));
- filter.setImageFilter(borders[i]);
- filter.setController(this);
- filter.setBorder(true);
- filter.setImageLoader(mImageLoader);
- filter.setShowTitle(false);
- listBorders.addView(filter);
- previousFilter = filter;
+ FilterIconButton b = setupFilterButton(borders[i], listBorders, mBorderButton);
+ if (i == 0) {
+ mNullBorderFilter = b;
+ mNullBorderFilter.setSelected(true);
+ }
}
}
@@ -901,10 +911,13 @@
invalidateOptionsMenu();
}
- void resetHistory() {
+ public void dispatchNullFilterClick() {
mNullFxFilter.onClick(mNullFxFilter);
mNullBorderFilter.onClick(mNullBorderFilter);
+ }
+ void resetHistory() {
+ dispatchNullFilterClick();
HistoryAdapter adapter = mImageShow.getHistory();
adapter.reset();
ImagePreset original = new ImagePreset(adapter.getItem(0));
@@ -946,43 +959,16 @@
r.getDisplayMetrics());
}
- public void useImagePreset(ImageSmallFilter imageSmallFilter, ImagePreset preset) {
- if (preset == null) {
+ public void useFilter(ImageFilter filter) {
+ if (mCurrentFilter == filter) {
return;
}
-
- if (mCurrentImageSmallFilter != null) {
- mCurrentImageSmallFilter.setSelected(false);
- }
- mCurrentImageSmallFilter = imageSmallFilter;
- mCurrentImageSmallFilter.setSelected(true);
-
- ImagePreset copy = new ImagePreset(preset);
- mImageShow.setImagePreset(copy);
- if (preset.isFx()) {
- // if it's an FX we rest the curve adjustment too
- mImageCurves.resetCurve();
- }
- invalidateViews();
- }
-
- public void useImageFilter(ImageSmallFilter imageSmallFilter, ImageFilter imageFilter,
- boolean setBorder) {
- if (imageFilter == null) {
- return;
- }
-
- if (mCurrentImageSmallFilter != null) {
- mCurrentImageSmallFilter.setSelected(false);
- }
- mCurrentImageSmallFilter = imageSmallFilter;
- mCurrentImageSmallFilter.setSelected(true);
-
+ mCurrentFilter = filter;
ImagePreset oldPreset = mImageShow.getImagePreset();
ImagePreset copy = new ImagePreset(oldPreset);
// TODO: use a numerical constant instead.
- copy.add(imageFilter);
+ copy.add(filter);
mImageShow.setImagePreset(copy);
invalidateViews();
@@ -1020,7 +1006,6 @@
private boolean outputted = false;
public void saveImage() {
- // boolean outputted = false;
if (mCropExtras != null) {
if (mCropExtras.getExtraOutput() != null) {
mSaveToExtraUri = true;
diff --git a/src/com/android/gallery3d/filtershow/PanelController.java b/src/com/android/gallery3d/filtershow/PanelController.java
index c7b294e..12fe5fa 100644
--- a/src/com/android/gallery3d/filtershow/PanelController.java
+++ b/src/com/android/gallery3d/filtershow/PanelController.java
@@ -29,8 +29,9 @@
import com.android.gallery3d.filtershow.filters.ImageFilterTinyPlanet;
import com.android.gallery3d.filtershow.imageshow.ImageCrop;
import com.android.gallery3d.filtershow.imageshow.ImageShow;
-import com.android.gallery3d.filtershow.imageshow.ImageSmallFilter;
import com.android.gallery3d.filtershow.presets.ImagePreset;
+import com.android.gallery3d.filtershow.ui.FilterIconButton;
+import com.android.gallery3d.filtershow.ui.FramedTextButton;
import java.util.HashMap;
import java.util.Vector;
@@ -403,6 +404,7 @@
return filter;
}
+ // TODO: remove this.
public void ensureFilter(String name) {
ImagePreset preset = getImagePreset();
ImageFilter filter = preset.getFilter(name);
@@ -433,7 +435,14 @@
}
public void showComponent(View view) {
- if (mUtilityPanel != null && !mUtilityPanel.selected()) {
+
+ boolean doPanelTransition = true;
+ if (view instanceof FilterIconButton) {
+ ImageFilter f = ((FilterIconButton) view).getImageFilter();
+ doPanelTransition = f.showUtilityPanel();
+ }
+
+ if (mUtilityPanel != null && !mUtilityPanel.selected() && doPanelTransition ) {
Panel current = mPanels.get(mCurrentPanel);
ViewPropertyAnimator anim1 = current.unselect(-1, VERTICAL_MOVE);
anim1.start();
@@ -448,8 +457,8 @@
}
mUtilityPanel.hideAccessoryViews();
- if (view instanceof ImageSmallFilter) {
- ImageSmallFilter component = (ImageSmallFilter) view;
+ if (view instanceof FilterIconButton) {
+ FilterIconButton component = (FilterIconButton) view;
ImageFilter filter = component.getImageFilter();
if (filter.getEditingViewId() != 0) {
mCurrentImage = showImageView(filter.getEditingViewId());
@@ -460,7 +469,9 @@
mCurrentImage.openUtilityPanel(mUtilityPanel.mAccessoryViewList);
}
mUtilityPanel.setShowParameter(filter.showParameterValue());
- ensureFilter(ename);
+ if (filter != null) {
+ mMasterImage.setCurrentFilter(filter);
+ }
mCurrentImage.select();
}
return;
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
index b8f0cf8..46e159a 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilter.java
@@ -76,6 +76,10 @@
return true;
}
+ public boolean showUtilityPanel() {
+ return true;
+ }
+
@Override
public ImageFilter clone() throws CloneNotSupportedException {
ImageFilter filter = (ImageFilter) super.clone();
@@ -114,6 +118,18 @@
return bitmap;
}
+ /**
+ * Called on small bitmaps to create button icons for each filter.
+ * Override this to provide filter-specific button icons.
+ */
+ public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+ int param = getParameter();
+ setParameter(getPreviewParameter());
+ bitmap = apply(bitmap, scaleFactor, highQuality);
+ setParameter(param);
+ return bitmap;
+ }
+
public int getParameter() {
return mParameter;
}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java
index 1d198e4..4fe3082 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterBorder.java
@@ -21,7 +21,11 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import com.android.gallery3d.R;
+
public class ImageFilterBorder extends ImageFilter {
+ private static final float NINEPATCH_ICON_SCALING = 10;
+ private static final float BITMAP_ICON_SCALING = 1 / 3.0f;
Drawable mNinePatch = null;
@Override
@@ -40,12 +44,32 @@
@Override
public boolean isNil() {
if (mNinePatch == null) {
- return true;
+ return true;
}
return false;
}
@Override
+ public int getTextId() {
+ return R.string.borders;
+ }
+
+ @Override
+ public boolean showParameterValue() {
+ return false;
+ }
+
+ @Override
+ public boolean showEditingControls() {
+ return false;
+ }
+
+ @Override
+ public boolean showUtilityPanel() {
+ return false;
+ }
+
+ @Override
public boolean same(ImageFilter filter) {
boolean isBorderFilter = super.same(filter);
if (!isBorderFilter) {
@@ -66,21 +90,34 @@
mNinePatch = ninePatch;
}
+ public Bitmap applyHelper(Bitmap bitmap, float scale1, float scale2 ) {
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+ Rect bounds = new Rect(0, 0, (int) (w * scale1), (int) (h * scale1));
+ Canvas canvas = new Canvas(bitmap);
+ canvas.scale(scale2, scale2);
+ mNinePatch.setBounds(bounds);
+ mNinePatch.draw(canvas);
+ return bitmap;
+ }
+
@Override
public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
if (mNinePatch == null) {
return bitmap;
}
+ float scale2 = scaleFactor * 2.0f;
+ float scale1 = 1 / scale2;
+ return applyHelper(bitmap, scale1, scale2);
+ }
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
-
- float scale = scaleFactor * 2.0f;
- Rect bounds = new Rect(0, 0, (int) (w / scale), (int) (h / scale));
- Canvas canvas = new Canvas(bitmap);
- canvas.scale(scale, scale);
- mNinePatch.setBounds(bounds);
- mNinePatch.draw(canvas);
- return bitmap;
+ @Override
+ public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+ if (mNinePatch == null) {
+ return bitmap;
+ }
+ float scale1 = NINEPATCH_ICON_SCALING;
+ float scale2 = BITMAP_ICON_SCALING;
+ return applyHelper(bitmap, scale1, scale2);
}
}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java
index 60a18b7..784028a 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterDownsample.java
@@ -17,12 +17,14 @@
package com.android.gallery3d.filtershow.filters;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Rect;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.cache.ImageLoader;
public class ImageFilterDownsample extends ImageFilter {
+ private static final int ICON_DOWNSAMPLE_FRACTION = 8;
private ImageLoader mImageLoader;
public ImageFilterDownsample(ImageLoader loader) {
@@ -63,7 +65,7 @@
if (p > 0 && p < 100) {
// scale preview to same size as the resulting bitmap from a "save"
- int newWidth = orig_w * p / 100;
+ int newWidth = orig_w * p / 100;
int newHeight = orig_h * p / 100;
// only scale preview if preview isn't already scaled enough
@@ -78,4 +80,17 @@
}
return bitmap;
}
+
+ @Override
+ public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+ int w = bitmap.getWidth();
+ int h = bitmap.getHeight();
+ Bitmap ret = Bitmap.createScaledBitmap(bitmap, w / ICON_DOWNSAMPLE_FRACTION, h
+ / ICON_DOWNSAMPLE_FRACTION, false);
+ Rect dst = new Rect(0, 0, w, h);
+ Rect src = new Rect(0, 0, w / ICON_DOWNSAMPLE_FRACTION, h / ICON_DOWNSAMPLE_FRACTION);
+ Canvas c = new Canvas(bitmap);
+ c.drawBitmap(ret, src, dst, null);
+ return bitmap;
+ }
}
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java
index 04d7641..345202f 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterFx.java
@@ -21,10 +21,18 @@
public class ImageFilterFx extends ImageFilter {
private static final String TAG = "ImageFilterFx";
Bitmap fxBitmap;
- public ImageFilterFx(Bitmap fxBitmap,String name) {
+ int mNameResource = 0;
+
+ public ImageFilterFx(Bitmap fxBitmap, String name, int nameResource) {
setFilterType(TYPE_FX);
mName = name;
this.fxBitmap = fxBitmap;
+ mNameResource = nameResource;
+ }
+
+ @Override
+ public int getTextId() {
+ return mNameResource;
}
@Override
@@ -42,6 +50,21 @@
return true;
}
+ @Override
+ public boolean showParameterValue() {
+ return false;
+ }
+
+ @Override
+ public boolean showEditingControls() {
+ return false;
+ }
+
+ @Override
+ public boolean showUtilityPanel() {
+ return false;
+ }
+
native protected void nativeApplyFilter(Bitmap bitmap, int w, int h,Bitmap fxBitmap, int fxw, int fxh);
@Override
diff --git a/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java b/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java
index ade3cb2..681eb12 100644
--- a/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java
+++ b/src/com/android/gallery3d/filtershow/filters/ImageFilterParametricBorder.java
@@ -23,6 +23,8 @@
import android.graphics.Path;
import android.graphics.RectF;
+import com.android.gallery3d.R;
+
public class ImageFilterParametricBorder extends ImageFilter {
private int mBorderColor = Color.WHITE;
private int mBorderSize = 10;
@@ -33,6 +35,26 @@
mName = "Border";
}
+ @Override
+ public int getTextId() {
+ return R.string.borders;
+ }
+
+ @Override
+ public boolean showParameterValue() {
+ return false;
+ }
+
+ @Override
+ public boolean showEditingControls() {
+ return false;
+ }
+
+ @Override
+ public boolean showUtilityPanel() {
+ return false;
+ }
+
public ImageFilterParametricBorder(int color, int size, int radius) {
setBorder(color, size, radius);
setFilterType(TYPE_BORDER);
@@ -78,15 +100,11 @@
mBorderCornerRadius = radius;
}
- @Override
- public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
- Canvas canvas = new Canvas(bitmap);
+ private void applyHelper(Canvas canvas, int w, int h) {
Path border = new Path();
border.moveTo(0, 0);
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
- float bs = mBorderSize / 100.0f * bitmap.getWidth();
- float r = mBorderCornerRadius / 100.0f * bitmap.getWidth();
+ float bs = mBorderSize / 100.0f * w;
+ float r = mBorderCornerRadius / 100.0f * w;
border.lineTo(0, h);
border.lineTo(w, h);
border.lineTo(w, 0);
@@ -98,6 +116,19 @@
paint.setAntiAlias(true);
paint.setColor(mBorderColor);
canvas.drawPath(border, paint);
+ }
+
+ @Override
+ public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+ Canvas canvas = new Canvas(bitmap);
+ applyHelper(canvas, bitmap.getWidth(), bitmap.getHeight());
+ return bitmap;
+ }
+
+ @Override
+ public Bitmap iconApply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
+ Canvas canvas = new Canvas(bitmap);
+ applyHelper(canvas, bitmap.getWidth() * 4, bitmap.getHeight() * 4);
return bitmap;
}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageBorder.java b/src/com/android/gallery3d/filtershow/imageshow/ImageBorder.java
deleted file mode 100644
index 0977d7d..0000000
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageBorder.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.imageshow;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-
-public class ImageBorder extends ImageSlave {
- Paint gPaint = new Paint();
-
- public ImageBorder(Context context) {
- super(context);
- }
-
- public ImageBorder(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public boolean showTitle() {
- return false;
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- /*
- * gPaint.setAntiAlias(true); gPaint.setFilterBitmap(true);
- * gPaint.setDither(true); // Bitmap bmp =
- * BitmapFactory.decodeResource(getResources(), //
- * R.drawable.border_scratch); // canvas.drawBitmap(bmp, new Rect(0, 0,
- * bmp.getWidth(), // bmp.getHeight()), mImageBounds, new Paint()); if
- * (mImageBounds != null) { NinePatchDrawable npd = (NinePatchDrawable)
- * getContext() .getResources().getDrawable(R.drawable.border_scratch2);
- * npd.setBounds(mImageBounds); npd.draw(canvas); }
- */
- }
-}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java
deleted file mode 100644
index d6d3c86..0000000
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallBorder.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.imageshow;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.Region;
-import android.util.AttributeSet;
-
-public class ImageSmallBorder extends ImageSmallFilter {
-
- // TODO: move this to xml.
- protected final int mSelectedBackgroundColor = Color.WHITE;
- protected final int mInnerBorderColor = Color.BLACK;
- protected final int mInnerBorderWidth = 2;
- protected final float mImageScaleFactor = 3.5f;
-
- public ImageSmallBorder(Context context) {
- super(context);
- }
-
- public ImageSmallBorder(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- requestFilteredImages();
- canvas.drawColor(mBackgroundColor);
- // TODO: simplify & make faster...
- RectF border = new RectF(mMargin, 2*mMargin, getWidth() - mMargin - 1, getWidth());
-
- if (mIsSelected) {
- mPaint.setColor(mSelectedBackgroundColor);
- canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint);
- }
-
- mPaint.setColor(mInnerBorderColor);
- mPaint.setStrokeWidth(mInnerBorderWidth);
- Path path = new Path();
- path.addRect(border, Path.Direction.CCW);
- mPaint.setStyle(Paint.Style.STROKE);
- canvas.drawPath(path, mPaint);
- mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
- canvas.save();
- canvas.clipRect(mMargin + 1, 2*mMargin, getWidth() - mMargin - 2, getWidth() - 1,
- Region.Op.INTERSECT);
- canvas.translate(mMargin + 1, 2*mMargin + 1);
- canvas.scale(mImageScaleFactor, mImageScaleFactor);
- Rect d = new Rect(0, 0, getWidth(), getWidth());
- drawImage(canvas, getFilteredImage(), d);
- canvas.restore();
- }
-
- @Override
- public void drawImage(Canvas canvas, Bitmap image, Rect d) {
- if (image != null) {
- int iw = image.getWidth();
- int ih = image.getHeight();
- Rect s = new Rect(0, 0, iw, iw);
- canvas.drawBitmap(image, s, d, mPaint);
- }
- }
-}
diff --git a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java b/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java
deleted file mode 100644
index 2a3ee28..0000000
--- a/src/com/android/gallery3d/filtershow/imageshow/ImageSmallFilter.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.imageshow;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.Rect;
-import android.util.AttributeSet;
-import android.view.View;
-
-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 {
-
- private static final String LOGTAG = "ImageSmallFilter";
- private FilterShowActivity mController = null;
- protected ImageFilter mImageFilter = null;
- private boolean mShowTitle = true;
- private boolean mSetBorder = false;
- protected final Paint mPaint = new Paint();
- protected boolean mIsSelected = false;
-
- // TODO: move this to xml.
- protected static int mMargin = 12;
- protected static int mTextMargin = 8;
- protected static int mBackgroundColor = Color.BLUE;
- protected final int mSelectedBackgroundColor = Color.WHITE;
- protected final int mTextColor = Color.WHITE;
- private ImageSmallFilter mNullFilter;
-
- private Bitmap mOverlayBitmap = null;
- private final int mOverlayTint = Color.argb(100, 0, 0, 0);
-
- public void setOverlayBitmap(Bitmap bitmap){
- mOverlayBitmap = bitmap;
- }
-
- public static void setMargin(int value) {
- mMargin = value;
- }
-
- public static void setTextMargin(int value) {
- mTextMargin = value;
- }
-
- public static void setDefaultBackgroundColor(int value) {
- mBackgroundColor = value;
- }
-
- public ImageSmallFilter(Context context, AttributeSet attrs) {
- super(context, attrs);
- setOnClickListener(this);
- }
-
- public ImageSmallFilter(Context context) {
- super(context);
- setOnClickListener(this);
- }
-
- public void setImageFilter(ImageFilter filter) {
- mImageFilter = filter;
- mImagePreset = new ImagePreset();
- mImagePreset.setName(filter.getName());
- filter.setImagePreset(mImagePreset);
- mImagePreset.add(mImageFilter);
- }
-
- public ImageFilter getImageFilter() {
- return mImageFilter;
- }
-
- @Override
- public void setSelected(boolean value) {
- if (mIsSelected != value) {
- invalidate();
- }
- mIsSelected = value;
- }
-
- 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);
- int h = mTextSize + mTextPadding;
- setMeasuredDimension(parentHeight - h, parentHeight);
- }
-
- /**
- * Setting the nullFilter implies that the behavior of the button is toggle
- *
- * @param nullFilter
- */
- public void setNulfilter(ImageSmallFilter nullFilter) {
- mNullFilter = nullFilter;
- }
-
- @Override
- public void onClick(View v) {
- if (mController != null) {
- if (mImageFilter != null) {
- if (mIsSelected && mNullFilter != null) {
- mNullFilter.onClick(v);
- }
- else {
- mController.useImageFilter(this, mImageFilter, mSetBorder);
- }
- } else if (mImagePreset != null) {
- if (mIsSelected && mNullFilter != null) {
- mNullFilter.onClick(v);
- }
- else {
- mController.useImagePreset(this, mImagePreset);
- }
- }
- }
- }
-
- @Override
- public boolean updateGeometryFlags() {
- // We don't want to warn listeners here that the image size has changed, because
- // we'll be working with the small image...
- return false;
- }
-
- public void setShowTitle(boolean value) {
- mShowTitle = value;
- invalidate();
- }
-
- @Override
- public boolean showTitle() {
- return mShowTitle;
- }
-
- @Override
- public boolean showControls() {
- return false;
- }
-
- @Override
- public boolean showHires() {
- return false;
- }
-
- @Override
- public ImagePreset getImagePreset() {
- return mImagePreset;
- }
-
- @Override
- public void updateImagePresets(boolean force) {
- ImagePreset preset = getImagePreset();
- if (preset == null) {
- return;
- }
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- requestFilteredImages();
- canvas.drawColor(mBackgroundColor);
- float textWidth = mPaint.measureText(mImageFilter.getName());
- int h = mTextSize + 2 * mTextPadding;
- int x = (int) ((getWidth() - textWidth) / 2);
- int y = getHeight();
- if (mIsSelected) {
- mPaint.setColor(mSelectedBackgroundColor);
- canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint);
- }
- Rect destination = new Rect(mMargin, 2*mMargin, getWidth() - mMargin, getWidth());
- drawImage(canvas, getFilteredImage(), destination);
- mPaint.setTextSize(mTextSize);
- mPaint.setColor(mTextColor);
- canvas.drawText(mImageFilter.getName(), x, y - mTextMargin, mPaint);
- if (mOverlayBitmap != null) {
- mPaint.setColor(mOverlayTint);
- canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint);
- Rect d = new Rect(0, mMargin, getWidth() - mMargin, getWidth());
- mPaint.setColor(Color.BLACK);
- drawImage(canvas, mOverlayBitmap, d);
- }
- }
-
- public void drawImage(Canvas canvas, Bitmap image, Rect destination) {
- if (image != null) {
- int iw = image.getWidth();
- int ih = image.getHeight();
- int x = 0;
- int y = 0;
- int size = 0;
- Rect source = null;
- if (iw > ih) {
- size = ih;
- x = (int) ((iw - size) / 2.0f);
- y = 0;
- } else {
- size = iw;
- x = 0;
- y = (int) ((ih - size) / 2.0f);
- }
- source = new Rect(x, y, x + size, y + size);
- canvas.drawBitmap(image, source, destination, mPaint);
- }
- }
-
-}
diff --git a/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
new file mode 100644
index 0000000..c2be858
--- /dev/null
+++ b/src/com/android/gallery3d/filtershow/ui/FilterIconButton.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.filtershow.ui;
+
+import android.app.Activity;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.android.gallery3d.R;
+import com.android.gallery3d.filtershow.FilterShowActivity;
+import com.android.gallery3d.filtershow.filters.ImageFilter;
+import com.android.gallery3d.filtershow.filters.ImageFilterBorder;
+import com.android.gallery3d.filtershow.filters.ImageFilterDownsample;
+import com.android.gallery3d.filtershow.filters.ImageFilterParametricBorder;
+
+public class FilterIconButton extends IconButton implements View.OnClickListener {
+ private Bitmap mOverlayBitmap = null;
+ private FilterShowActivity mController = null;
+ private ImageFilter mImageFilter = null;
+ private LinearLayout mParentContainer = null;
+ private View.OnClickListener mListener = null;
+
+ public FilterIconButton(Context context) {
+ super(context);
+ }
+
+ public FilterIconButton(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public FilterIconButton(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ }
+
+ public void setup(String text, ImageFilter filter, FilterShowActivity controller,
+ LinearLayout parent) {
+ mImageFilter = filter;
+ mController = controller;
+ setText(text);
+
+ if (mImageFilter.getOverlayBitmaps() != 0) {
+ mOverlayBitmap = BitmapFactory.decodeResource(getResources(),
+ mImageFilter.getOverlayBitmaps());
+ }
+
+ mParentContainer = parent;
+ super.setOnClickListener(this);
+ invalidate();
+ }
+
+ @Override
+ protected Bitmap drawImage(Bitmap dst, Bitmap image, Rect destination) {
+ dst = super.drawImage(dst, image, destination);
+ dst = mImageFilter.iconApply(dst, 1.0f, false);
+ if (mOverlayBitmap != null) {
+ dst = super.drawImage(dst, mOverlayBitmap, destination);
+ }
+ return dst;
+ }
+
+ @Override
+ public void setOnClickListener(View.OnClickListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (mController != null && mImageFilter != null) {
+ if (!isSelected()) {
+ mController.useFilter(mImageFilter);
+ mParentContainer.dispatchSetSelected(false);
+ setSelected(true);
+ }
+ }
+ if (mListener != null && mListener != this) {
+ mListener.onClick(v);
+ }
+ }
+
+ public ImageFilter getImageFilter() {
+ return mImageFilter;
+ }
+}
diff --git a/src/com/android/gallery3d/filtershow/ui/IconButton.java b/src/com/android/gallery3d/filtershow/ui/IconButton.java
new file mode 100644
index 0000000..1ebc1ab
--- /dev/null
+++ b/src/com/android/gallery3d/filtershow/ui/IconButton.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.filtershow.ui;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.widget.Button;
+
+import com.android.gallery3d.R;
+
+/**
+ * Class of buttons with both an image icon and text.
+ */
+public class IconButton extends Button {
+
+ protected Bitmap mImageMirror = null;
+ protected Bitmap mIcon = null;
+
+ private boolean stale_icon = true;
+
+ public IconButton(Context context) {
+ this(context, null);
+ }
+
+ public IconButton(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public IconButton(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ BitmapDrawable ic = (BitmapDrawable) getCompoundDrawables()[1];
+
+ if (ic != null) {
+ mImageMirror = ic.getBitmap();
+ }
+ }
+
+ /**
+ * Set the image that the button icon will use.
+ *
+ * @param image image that icon will be set to before next draw.
+ */
+ public void setIcon(Bitmap image) {
+ mImageMirror = image;
+ stale_icon = true;
+ }
+
+ /**
+ * Creates and sets button icon. Only call after layout.
+ *
+ * @param image bitmap to use as icon
+ */
+ protected boolean makeAndSetIcon(Bitmap image) {
+ int size = getGoodIconSideSize();
+ if (size > 0) {
+ return setImageIcon(makeImageIcon(image, size, size));
+ }
+ return false;
+ }
+
+ /**
+ * Sets icon.
+ *
+ * @param image bitmap to set the icon to.
+ */
+ protected boolean setImageIcon(Bitmap image) {
+ if (image == null) {
+ return false;
+ }
+ mIcon = image;
+ this.setCompoundDrawablesWithIntrinsicBounds(null,
+ new BitmapDrawable(getResources(), mIcon), null, null);
+ return true;
+ }
+
+ /**
+ * Generate an icon bitmap from a given bitmap.
+ *
+ * @param image bitmap to use as button icon
+ * @param width icon width
+ * @param height icon height
+ * @return the scaled/cropped icon bitmap
+ */
+ protected Bitmap makeImageIcon(Bitmap image, int width, int height) {
+ Rect destination = new Rect(0, 0, width, height);
+ Bitmap bmap = Bitmap.createBitmap(width, height,
+ Bitmap.Config.ARGB_8888);
+ bmap = drawImage(bmap, image, destination);
+ return bmap;
+ }
+
+ /**
+ * Finds a side length for the (square) icon that fits within the button.
+ * Only call after layout.
+ *
+ * @return icon side length
+ */
+ protected int getGoodIconSideSize() {
+ Paint p = getPaint();
+ Rect bounds = new Rect();
+ String s = getText().toString();
+ p.getTextBounds(s, 0, s.length(), bounds);
+ int inner_padding = 2 * getCompoundDrawablePadding();
+ int vert = getHeight() - getPaddingTop() - getPaddingBottom() - bounds.height()
+ - inner_padding;
+ int horiz = getWidth() - getPaddingLeft() - getPaddingRight() - inner_padding;
+ return Math.min(vert, horiz);
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ stale_icon = true;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ if (stale_icon && mImageMirror != null && mImageMirror.getHeight() > 0
+ && mImageMirror.getWidth() > 0) {
+ stale_icon = !makeAndSetIcon(mImageMirror);
+ }
+ super.onDraw(canvas);
+ }
+
+ // Override this for custom icon generation
+ protected Bitmap drawImage(Bitmap dst, Bitmap image, Rect destination) {
+ if (image != null) {
+ Canvas canvas = new Canvas(dst);
+ int iw = image.getWidth();
+ int ih = image.getHeight();
+ int x = 0;
+ int y = 0;
+ int size = 0;
+ Rect source = null;
+ if (iw > ih) {
+ size = ih;
+ x = (int) ((iw - size) / 2.0f);
+ y = 0;
+ } else {
+ size = iw;
+ x = 0;
+ y = (int) ((ih - size) / 2.0f);
+ }
+ source = new Rect(x, y, x + size, y + size);
+ canvas.drawBitmap(image, source, destination, new Paint());
+ }
+ return dst;
+ }
+
+}
diff --git a/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java b/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java
deleted file mode 100644
index bb37751..0000000
--- a/src/com/android/gallery3d/filtershow/ui/ImageButtonTitle.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.gallery3d.filtershow.ui;
-
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.util.AttributeSet;
-import android.widget.ImageButton;
-
-import com.android.gallery3d.R;
-
-public class ImageButtonTitle extends ImageButton {
- private static final String LOGTAG = "ImageButtonTitle";
- private String mText = null;
- private static int mTextSize = 24;
- private static int mTextPadding = 20;
- private static Paint gPaint = new Paint();
-
- public static void setTextSize(int value) {
- mTextSize = value;
- }
-
- public static void setTextPadding(int value) {
- mTextPadding = value;
- }
-
- public void setText(String text) {
- mText = text;
- }
-
- public ImageButtonTitle(Context context, AttributeSet attrs) {
- super(context, attrs);
- TypedArray a = getContext().obtainStyledAttributes(
- attrs, R.styleable.ImageButtonTitle);
-
- mText = a.getString(R.styleable.ImageButtonTitle_android_text);
- }
-
- public String getText(){
- return mText;
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- if (mText != null) {
- gPaint.setARGB(255, 255, 255, 255);
- gPaint.setTextSize(mTextSize);
- float textWidth = gPaint.measureText(mText);
- int x = (int) ((getWidth() - textWidth) / 2);
- int y = getHeight() - mTextPadding;
-
- canvas.drawText(mText, x, y, gPaint);
- }
- }
-
-}