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