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 */
1693dfe7a1df07a64701369b480578410efb740a27nicolasroard
1793dfe7a1df07a64701369b480578410efb740a27nicolasroardpackage com.android.gallery3d.filtershow.filters;
1893dfe7a1df07a64701369b480578410efb740a27nicolasroard
1993dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.Bitmap;
2093dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.Canvas;
2149798939f1bc58eaf5842bbc8bc5424284ab7930John Hofordimport android.graphics.Color;
2293dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.Paint;
2393dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.Path;
2493dfe7a1df07a64701369b480578410efb740a27nicolasroardimport android.graphics.RectF;
2593dfe7a1df07a64701369b480578410efb740a27nicolasroard
2649798939f1bc58eaf5842bbc8bc5424284ab7930John Hofordpublic class ImageFilterColorBorder extends ImageFilter {
2749798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford    private static final String LOGTAG = "ImageFilterColorBorder";
2892e387187a872b3b0986b378954eb611aa83fdeanicolasroard    private FilterColorBorderRepresentation mParameters = null;
2949798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford    Paint mPaint = new Paint();
30655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard    RectF mBounds = new RectF();
31655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard    RectF mInsideBounds = new RectF();
32655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard    Path mBorderPath = new Path();
3393dfe7a1df07a64701369b480578410efb740a27nicolasroard
3449798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford    public ImageFilterColorBorder() {
3593dfe7a1df07a64701369b480578410efb740a27nicolasroard        mName = "Border";
3649798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford    }
3749798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford
3849798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford    public FilterRepresentation getDefaultRepresentation() {
39655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        return new FilterColorBorderRepresentation(Color.WHITE, 3, 2);
4093dfe7a1df07a64701369b480578410efb740a27nicolasroard    }
4193dfe7a1df07a64701369b480578410efb740a27nicolasroard
4292e387187a872b3b0986b378954eb611aa83fdeanicolasroard    public void useRepresentation(FilterRepresentation representation) {
4349798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        FilterColorBorderRepresentation parameters =
4449798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford                (FilterColorBorderRepresentation) representation;
4592e387187a872b3b0986b378954eb611aa83fdeanicolasroard        mParameters = parameters;
4692e387187a872b3b0986b378954eb611aa83fdeanicolasroard    }
4792e387187a872b3b0986b378954eb611aa83fdeanicolasroard
4892e387187a872b3b0986b378954eb611aa83fdeanicolasroard    public FilterColorBorderRepresentation getParameters() {
4992e387187a872b3b0986b378954eb611aa83fdeanicolasroard        return mParameters;
5092e387187a872b3b0986b378954eb611aa83fdeanicolasroard    }
5192e387187a872b3b0986b378954eb611aa83fdeanicolasroard
522e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    private void applyHelper(Canvas canvas, int w, int h) {
5392e387187a872b3b0986b378954eb611aa83fdeanicolasroard        if (getParameters() == null) {
5492e387187a872b3b0986b378954eb611aa83fdeanicolasroard            return;
5592e387187a872b3b0986b378954eb611aa83fdeanicolasroard        }
5649798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        float size = getParameters().getBorderSize();
5749798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        float radius = getParameters().getBorderRadius();
58655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard
59655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mPaint.reset();
60655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mPaint.setColor(getParameters().getColor());
61655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mPaint.setAntiAlias(true);
62655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBounds.set(0, 0, w, h);
63655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBorderPath.reset();
64655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBorderPath.moveTo(0, 0);
65655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard
66655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        float bs = size / 100.f * mBounds.width();
67655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        float r = radius / 100.f * mBounds.width();
68655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard
69655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mInsideBounds.set(mBounds.left + bs,
70655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard                mBounds.top + bs, mBounds.right - bs,
71655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard                mBounds.bottom - bs);
72655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard
73655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBorderPath.moveTo(mBounds.left, mBounds.top);
74655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBorderPath.lineTo(mBounds.right, mBounds.top);
75655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBorderPath.lineTo(mBounds.right, mBounds.bottom);
76655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBorderPath.lineTo(mBounds.left, mBounds.bottom);
77655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        mBorderPath.addRoundRect(mInsideBounds,
78655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard                r, r, Path.Direction.CCW);
79655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard
80655afcf4a88cf9dcdbab708212df1dec0a4c05d6nicolasroard        canvas.drawPath(mBorderPath, mPaint);
812e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    }
822e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk
832e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    @Override
8499baf61387ab1ef15bb9db5fa3b2b55591e87059John Hoford    public Bitmap apply(Bitmap bitmap, float scaleFactor, int quality) {
8549798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        Canvas canvas = new Canvas(bitmap);
8649798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        applyHelper(canvas, bitmap.getWidth(), bitmap.getHeight());
8749798939f1bc58eaf5842bbc8bc5424284ab7930John Hoford        return bitmap;
882e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk    }
892e1a644f97a81931bf9b53d8bdf089bb7d4b1048Ruben Brunk
9093dfe7a1df07a64701369b480578410efb740a27nicolasroard}
91