1a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard/* 2a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Copyright (C) 2012 The Android Open Source Project 3a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 4a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Licensed under the Apache License, Version 2.0 (the "License"); 5a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * you may not use this file except in compliance with the License. 6a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * You may obtain a copy of the License at 7a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 8a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * http://www.apache.org/licenses/LICENSE-2.0 9a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * 10a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * Unless required by applicable law or agreed to in writing, software 11a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * distributed under the License is distributed on an "AS IS" BASIS, 12a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * See the License for the specific language governing permissions and 14a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard * limitations under the License. 15a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard */ 160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 170d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpackage com.android.gallery3d.filtershow.imageshow; 180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.content.Context; 200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Bitmap; 2108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Canvas; 2208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Color; 2308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Paint; 2408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroardimport android.graphics.Rect; 250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.util.AttributeSet; 260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.view.View; 2793dfe7a1df07a64701369b480578410efb740a27nicolasroard 2893dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.FilterShowActivity; 2993dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.filters.ImageFilter; 3093dfe7a1df07a64701369b480578410efb740a27nicolasroardimport com.android.gallery3d.filtershow.presets.ImagePreset; 310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpublic class ImageSmallFilter extends ImageShow implements View.OnClickListener { 330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 34bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard private static final String LOGTAG = "ImageSmallFilter"; 350d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard private FilterShowActivity mController = null; 3631529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard protected ImageFilter mImageFilter = null; 37bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard private boolean mShowTitle = true; 3893dfe7a1df07a64701369b480578410efb740a27nicolasroard private boolean mSetBorder = false; 3908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard protected final Paint mPaint = new Paint(); 4008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard protected boolean mIsSelected = false; 4108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard 4208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard // TODO: move this to xml. 435ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard protected static int mMargin = 12; 445ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard protected static int mTextMargin = 8; 450a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard protected static int mBackgroundColor = Color.BLUE; 4608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard protected final int mSelectedBackgroundColor = Color.WHITE; 4708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard protected final int mTextColor = Color.WHITE; 48af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford private ImageSmallFilter mNullFilter; 490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 505ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard public static void setMargin(int value) { 515ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard mMargin = value; 525ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard } 535ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard 545ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard public static void setTextMargin(int value) { 555ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard mTextMargin = value; 565ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard } 575ec40a6ba587fa8bd50958d263bb6fc6280de4c1nicolasroard 580a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard public static void setDefaultBackgroundColor(int value) { 590a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard mBackgroundColor = value; 600a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard } 610a23b42e4a3e3a93ce7389bfb7352944f644add6nicolasroard 620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public ImageSmallFilter(Context context, AttributeSet attrs) { 630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard super(context, attrs); 640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard setOnClickListener(this); 650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 660d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 670d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public ImageSmallFilter(Context context) { 680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard super(context); 690d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard setOnClickListener(this); 700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void setImageFilter(ImageFilter filter) { 730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImageFilter = filter; 740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImagePreset = new ImagePreset(); 75a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford mImagePreset.setName(filter.getName()); 76e9c55b28a4a155c2e1c1f5aec615a0c56e38ade4John Hoford filter.setImagePreset(mImagePreset); 770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mImagePreset.add(mImageFilter); 780d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 8008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard @Override 8108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard public void setSelected(boolean value) { 8208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard if (mIsSelected != value) { 8308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard invalidate(); 8408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard } 8508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard mIsSelected = value; 8608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard } 8708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard 8893dfe7a1df07a64701369b480578410efb740a27nicolasroard public void setBorder(boolean value) { 8993dfe7a1df07a64701369b480578410efb740a27nicolasroard mSetBorder = value; 9093dfe7a1df07a64701369b480578410efb740a27nicolasroard } 9193dfe7a1df07a64701369b480578410efb740a27nicolasroard 920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void setController(FilterShowActivity activity) { 930d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard mController = activity; 940d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 950d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 9693dfe7a1df07a64701369b480578410efb740a27nicolasroard @Override 970d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 980d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 990d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 10008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard int h = mTextSize + mTextPadding; 10108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard setMeasuredDimension(parentHeight - h, parentHeight); 1020d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 1030d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 104af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford /** 105af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford * Setting the nullFilter implies that the behavior of the button is toggle 106af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford * 107af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford * @param nullFilter 108af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford */ 109af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford public void setNulfilter(ImageSmallFilter nullFilter) { 110af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford mNullFilter = nullFilter; 111af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford } 112af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford 11393dfe7a1df07a64701369b480578410efb740a27nicolasroard @Override 1140d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public void onClick(View v) { 1150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (mController != null) { 1160d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard if (mImageFilter != null) { 117af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford if (mIsSelected && mNullFilter != null) { 118af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford mNullFilter.onClick(v); 119af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford } 120af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford else { 121af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford mController.useImageFilter(this, mImageFilter, mSetBorder); 122af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford } 1230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } else if (mImagePreset != null) { 124af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford if (mIsSelected && mNullFilter != null) { 125af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford mNullFilter.onClick(v); 126af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford } 127af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford else { 128af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford mController.useImagePreset(this, mImagePreset); 129af0dc7f486553fd96b33b15e5380cb1928462d69John Hoford } 1300d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 1310d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 1320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 1330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 13493dfe7a1df07a64701369b480578410efb740a27nicolasroard @Override 13531529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard public boolean updateGeometryFlags() { 136e533f65961ed601ded1803caeab6cef0a778d2f2nicolasroard // We don't want to warn listeners here that the image size has changed, because 137e533f65961ed601ded1803caeab6cef0a778d2f2nicolasroard // we'll be working with the small image... 13831529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard return false; 1390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 1400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 141bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard public void setShowTitle(boolean value) { 142bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mShowTitle = value; 143bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard invalidate(); 144bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard } 145bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard 14693dfe7a1df07a64701369b480578410efb740a27nicolasroard @Override 1479594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard public boolean showTitle() { 148bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard return mShowTitle; 1499594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard } 1509594c8d3e0dd0d6157710ceae1d1deea8e566db4nicolasroard 15193dfe7a1df07a64701369b480578410efb740a27nicolasroard @Override 1520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public boolean showControls() { 1530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return false; 1540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 1550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 15693dfe7a1df07a64701369b480578410efb740a27nicolasroard @Override 1570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard public boolean showHires() { 1580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard return false; 1590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 16008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard 16108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard @Override 16231529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard public ImagePreset getImagePreset() { 16331529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard return mImagePreset; 16431529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard } 16531529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard 16631529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard @Override 16731529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard public void updateImagePresets(boolean force) { 16831529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard ImagePreset preset = getImagePreset(); 16931529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard if (preset == null) { 17031529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard return; 17131529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard } 17231529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard } 17331529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard 17431529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard @Override 17508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard public void onDraw(Canvas canvas) { 17631529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard requestFilteredImages(); 17708458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard canvas.drawColor(mBackgroundColor); 17843b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk float textWidth = mPaint.measureText(mImageFilter.getName()); 17908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard int h = mTextSize + 2 * mTextPadding; 18008458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard int x = (int) ((getWidth() - textWidth) / 2); 18108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard int y = getHeight(); 18208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard if (mIsSelected) { 18308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard mPaint.setColor(mSelectedBackgroundColor); 18495404c666640177abf72ca2278585a16f30cf390nicolasroard canvas.drawRect(0, mMargin, getWidth(), getWidth() + mMargin, mPaint); 18508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard } 18695404c666640177abf72ca2278585a16f30cf390nicolasroard Rect destination = new Rect(mMargin, 2*mMargin, getWidth() - mMargin, getWidth()); 18731529940021b9a18611b1a3fb4a0317ab8c89618nicolasroard drawImage(canvas, getFilteredImage(), destination); 18808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard mPaint.setTextSize(mTextSize); 18908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard mPaint.setColor(mTextColor); 19043b906d81caa4379eae1a1643194c8b3d34b1ad5Ruben Brunk canvas.drawText(mImageFilter.getName(), x, y - mTextMargin, mPaint); 19108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard } 19208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard 19395404c666640177abf72ca2278585a16f30cf390nicolasroard public void drawImage(Canvas canvas, Bitmap image, Rect destination) { 19408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard if (image != null) { 19508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard int iw = image.getWidth(); 19608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard int ih = image.getHeight(); 19795404c666640177abf72ca2278585a16f30cf390nicolasroard int x = 0; 19895404c666640177abf72ca2278585a16f30cf390nicolasroard int y = 0; 19995404c666640177abf72ca2278585a16f30cf390nicolasroard int size = 0; 20095404c666640177abf72ca2278585a16f30cf390nicolasroard Rect source = null; 20108458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard if (iw > ih) { 20295404c666640177abf72ca2278585a16f30cf390nicolasroard size = ih; 20395404c666640177abf72ca2278585a16f30cf390nicolasroard x = (int) ((iw - size) / 2.0f); 20495404c666640177abf72ca2278585a16f30cf390nicolasroard y = 0; 20595404c666640177abf72ca2278585a16f30cf390nicolasroard } else { 20695404c666640177abf72ca2278585a16f30cf390nicolasroard size = iw; 20795404c666640177abf72ca2278585a16f30cf390nicolasroard x = 0; 20895404c666640177abf72ca2278585a16f30cf390nicolasroard y = (int) ((ih - size) / 2.0f); 20908458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard } 21095404c666640177abf72ca2278585a16f30cf390nicolasroard source = new Rect(x, y, x + size, y + size); 21195404c666640177abf72ca2278585a16f30cf390nicolasroard canvas.drawBitmap(image, source, destination, mPaint); 21208458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard } 21308458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard } 21408458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard 2150d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard} 216