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.filters; 180d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 19588c30c74178bc399b043a5401f0c1f93ae22378nicolasroardimport android.content.res.Resources; 200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Bitmap; 21588c30c74178bc399b043a5401f0c1f93ae22378nicolasroardimport android.graphics.BitmapFactory; 220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Canvas; 230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Rect; 24588c30c74178bc399b043a5401f0c1f93ae22378nicolasroardimport android.graphics.drawable.BitmapDrawable; 250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable; 260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 27588c30c74178bc399b043a5401f0c1f93ae22378nicolasroardimport java.util.HashMap; 28588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard 290d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpublic class ImageFilterBorder extends ImageFilter { 302e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk private static final float NINEPATCH_ICON_SCALING = 10; 312e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk private static final float BITMAP_ICON_SCALING = 1 / 3.0f; 3292e387187a872b3b0986b378954eb611aa83fdeanicolasroard private FilterImageBorderRepresentation mParameters = null; 33588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard private Resources mResources = null; 34588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard 35588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard private HashMap<Integer, Drawable> mDrawables = new HashMap<Integer, Drawable>(); 360d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 3792e387187a872b3b0986b378954eb611aa83fdeanicolasroard public ImageFilterBorder() { 38bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard mName = "Border"; 390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 400d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard 4192e387187a872b3b0986b378954eb611aa83fdeanicolasroard public void useRepresentation(FilterRepresentation representation) { 4292e387187a872b3b0986b378954eb611aa83fdeanicolasroard FilterImageBorderRepresentation parameters = (FilterImageBorderRepresentation) representation; 4392e387187a872b3b0986b378954eb611aa83fdeanicolasroard mParameters = parameters; 4492e387187a872b3b0986b378954eb611aa83fdeanicolasroard } 4592e387187a872b3b0986b378954eb611aa83fdeanicolasroard 4692e387187a872b3b0986b378954eb611aa83fdeanicolasroard public FilterImageBorderRepresentation getParameters() { 4792e387187a872b3b0986b378954eb611aa83fdeanicolasroard return mParameters; 4892e387187a872b3b0986b378954eb611aa83fdeanicolasroard } 4992e387187a872b3b0986b378954eb611aa83fdeanicolasroard 50402dd963ad8fb1dfed81cca63cbaf82e93533a94nicolasroard public void freeResources() { 51402dd963ad8fb1dfed81cca63cbaf82e93533a94nicolasroard mDrawables.clear(); 52402dd963ad8fb1dfed81cca63cbaf82e93533a94nicolasroard } 53402dd963ad8fb1dfed81cca63cbaf82e93533a94nicolasroard 542e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk public Bitmap applyHelper(Bitmap bitmap, float scale1, float scale2 ) { 550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int w = bitmap.getWidth(); 560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard int h = bitmap.getHeight(); 572e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk Rect bounds = new Rect(0, 0, (int) (w * scale1), (int) (h * scale1)); 580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard Canvas canvas = new Canvas(bitmap); 592e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk canvas.scale(scale2, scale2); 60588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard Drawable drawable = getDrawable(getParameters().getDrawableResource()); 61588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard drawable.setBounds(bounds); 62588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard drawable.draw(canvas); 6381eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard return bitmap; 640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard } 652e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk 662e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk @Override 6799baf61387ab1ef15bb9db5fa3b2b55591e87059John Hoford public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) { 68588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard if (getParameters() == null || getParameters().getDrawableResource() == 0) { 692e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk return bitmap; 702e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk } 712e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk float scale2 = scaleFactor * 2.0f; 722e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk float scale1 = 1 / scale2; 732e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk return applyHelper(bitmap, scale1, scale2); 742e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk } 752e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk 76588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard public void setResources(Resources resources) { 77588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard if (mResources != resources) { 78588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard mResources = resources; 79588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard mDrawables.clear(); 80588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard } 81588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard } 82588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard 83588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard public Drawable getDrawable(int rsc) { 84588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard Drawable drawable = mDrawables.get(rsc); 85d31603218b1f5f58a3617a21425622790ffff472nicolasroard if (drawable == null && mResources != null && rsc != 0) { 86588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard drawable = new BitmapDrawable(mResources, BitmapFactory.decodeResource(mResources, rsc)); 87588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard mDrawables.put(rsc, drawable); 88588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard } 89588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard return drawable; 90588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard } 91588c30c74178bc399b043a5401f0c1f93ae22378nicolasroard 920d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard} 93