ImageFilterBorder.java revision a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1
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
190d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Bitmap;
200d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Canvas;
210d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.Rect;
220d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardimport android.graphics.drawable.Drawable;
230d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
240d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroardpublic class ImageFilterBorder extends ImageFilter {
250d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    Drawable mNinePatch = null;
260d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
27bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    @Override
28bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    public ImageFilter clone() throws CloneNotSupportedException {
29bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        ImageFilterBorder filter = (ImageFilterBorder) super.clone();
30bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        filter.setDrawable(mNinePatch);
31bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        return filter;
320d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
330d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
34bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard    public ImageFilterBorder(Drawable ninePatch) {
35a19830b4fd9050b48386cd904d99cfd2566cc515John Hoford        setFilterType(TYPE_BORDER);
36bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        mName = "Border";
37bf93da72576b28f4e9dfb27f8f3fef702c8ae82dnicolasroard        mNinePatch = ninePatch;
380d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
390d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
4081eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    @Override
4155550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard    public boolean isNil() {
4255550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        if (mNinePatch == null) {
4355550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard            return  true;
4455550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        }
4555550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard        return false;
4655550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard    }
4755550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard
4855550694a3f40fbf5dfc95c35a8e253aedab931enicolasroard    @Override
490d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public boolean same(ImageFilter filter) {
500d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        boolean isBorderFilter = super.same(filter);
510d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (!isBorderFilter) {
520d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return false;
530d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
540d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        ImageFilterBorder borderFilter = (ImageFilterBorder) filter;
550d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (mNinePatch != borderFilter.mNinePatch) {
560d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard            return false;
570d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
580d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        return true;
590d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
600d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
610d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    public void setDrawable(Drawable ninePatch) {
620d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        // TODO: for now we only use nine patch
630d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mNinePatch = ninePatch;
640d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
650d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
6681eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    @Override
6781eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
680d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        if (mNinePatch == null) {
6981eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard            return bitmap;
700d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        }
710d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
720d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int w = bitmap.getWidth();
730d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        int h = bitmap.getHeight();
740d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard
7508458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        float scale = scaleFactor * 2.0f;
7608458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        Rect bounds = new Rect(0, 0, (int) (w / scale), (int) (h / scale));
770d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        Canvas canvas = new Canvas(bitmap);
7808458dc637d92ee5f12e34d49c34cc10f4e19c7dnicolasroard        canvas.scale(scale, scale);
790d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mNinePatch.setBounds(bounds);
800d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard        mNinePatch.draw(canvas);
8181eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard        return bitmap;
820d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard    }
830d7cdf8e763fb65c32bfad65245b3753deb75737nicolasroard}
84