ImageFilterRS.java revision 57eedfd99676913f575b1f76e3a874026d1ddf7c
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 */
16a9f280f938b5fd5891c5cfe0999f8f1d4945d7a1nicolasroard
175448bf8095483574649afcc2add7f153670c7450nicolasroardpackage com.android.gallery3d.filtershow.filters;
185448bf8095483574649afcc2add7f153670c7450nicolasroard
195448bf8095483574649afcc2add7f153670c7450nicolasroardimport android.app.Activity;
205448bf8095483574649afcc2add7f153670c7450nicolasroardimport android.graphics.Bitmap;
215448bf8095483574649afcc2add7f153670c7450nicolasroardimport android.renderscript.Allocation;
2257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroardimport android.renderscript.Allocation.MipmapControl;
235448bf8095483574649afcc2add7f153670c7450nicolasroardimport android.renderscript.RenderScript;
245448bf8095483574649afcc2add7f153670c7450nicolasroardimport android.util.Log;
255448bf8095483574649afcc2add7f153670c7450nicolasroard
265448bf8095483574649afcc2add7f153670c7450nicolasroardpublic class ImageFilterRS extends ImageFilter {
275448bf8095483574649afcc2add7f153670c7450nicolasroard    private final String LOGTAG = "ImageFilterRS";
285448bf8095483574649afcc2add7f153670c7450nicolasroard
295448bf8095483574649afcc2add7f153670c7450nicolasroard    private static RenderScript mRS = null;
305448bf8095483574649afcc2add7f153670c7450nicolasroard    protected static Allocation mInPixelsAllocation;
315448bf8095483574649afcc2add7f153670c7450nicolasroard    protected static Allocation mOutPixelsAllocation;
325448bf8095483574649afcc2add7f153670c7450nicolasroard    private static android.content.res.Resources mResources = null;
3357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard    private static Bitmap sOldBitmap = null;
3457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard    private Bitmap mOldBitmap = null;
355448bf8095483574649afcc2add7f153670c7450nicolasroard
3657eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard    private static Bitmap mReturnBitmap = null;
3757eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard    private final Bitmap.Config mBitmapConfig = Bitmap.Config.ARGB_8888;
3857eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard
3957eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard    public void prepare(Bitmap bitmap, float scaleFactor, boolean highQuality) {
4057eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard        if (sOldBitmap == null
4157eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard                || (bitmap.getWidth() != sOldBitmap.getWidth())
4257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard                || (bitmap.getHeight() != sOldBitmap.getHeight())) {
4357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            if (mInPixelsAllocation != null) {
4457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard                mInPixelsAllocation.destroy();
4557eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            }
4657eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            if (mOutPixelsAllocation != null) {
4757eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard                mOutPixelsAllocation.destroy();
4857eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            }
4957eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            Bitmap bitmapBuffer = bitmap.copy(mBitmapConfig, true);
5057eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            mOutPixelsAllocation = Allocation.createFromBitmap(mRS, bitmapBuffer,
5157eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard                    MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
5257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            mInPixelsAllocation = Allocation.createTyped(mRS,
5357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard                    mOutPixelsAllocation.getType());
5457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            sOldBitmap = bitmap;
5563a7dac01d394523799939596b960cb03321798dJohn Hoford        }
5657eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard        mInPixelsAllocation.copyFrom(bitmap);
5757eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard        if (mOldBitmap != sOldBitmap) {
5857eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            createFilter(mResources, scaleFactor, highQuality);
5957eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            mOldBitmap = sOldBitmap;
6063a7dac01d394523799939596b960cb03321798dJohn Hoford        }
615448bf8095483574649afcc2add7f153670c7450nicolasroard    }
625448bf8095483574649afcc2add7f153670c7450nicolasroard
6357eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard    public void createFilter(android.content.res.Resources res,
6457eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            float scaleFactor, boolean highQuality) {
6557eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard        // Stub
665448bf8095483574649afcc2add7f153670c7450nicolasroard    }
675448bf8095483574649afcc2add7f153670c7450nicolasroard
685448bf8095483574649afcc2add7f153670c7450nicolasroard    public void runFilter() {
6957eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard        // Stub
705448bf8095483574649afcc2add7f153670c7450nicolasroard    }
715448bf8095483574649afcc2add7f153670c7450nicolasroard
725448bf8095483574649afcc2add7f153670c7450nicolasroard    public void update(Bitmap bitmap) {
735448bf8095483574649afcc2add7f153670c7450nicolasroard        mOutPixelsAllocation.copyTo(bitmap);
745448bf8095483574649afcc2add7f153670c7450nicolasroard    }
755448bf8095483574649afcc2add7f153670c7450nicolasroard
7681eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    @Override
7781eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard    public Bitmap apply(Bitmap bitmap, float scaleFactor, boolean highQuality) {
785448bf8095483574649afcc2add7f153670c7450nicolasroard        if (bitmap == null) {
7981eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard            return bitmap;
805448bf8095483574649afcc2add7f153670c7450nicolasroard        }
815448bf8095483574649afcc2add7f153670c7450nicolasroard        try {
8257eedfd99676913f575b1f76e3a874026d1ddf7cnicolasroard            prepare(bitmap, scaleFactor, highQuality);
835448bf8095483574649afcc2add7f153670c7450nicolasroard            runFilter();
845448bf8095483574649afcc2add7f153670c7450nicolasroard            update(bitmap);
855448bf8095483574649afcc2add7f153670c7450nicolasroard        } catch (android.renderscript.RSIllegalArgumentException e) {
865448bf8095483574649afcc2add7f153670c7450nicolasroard            Log.e(LOGTAG, "Illegal argument? " + e);
875448bf8095483574649afcc2add7f153670c7450nicolasroard        } catch (android.renderscript.RSRuntimeException e) {
885448bf8095483574649afcc2add7f153670c7450nicolasroard            Log.e(LOGTAG, "RS runtime exception ? " + e);
895448bf8095483574649afcc2add7f153670c7450nicolasroard        }
9081eb9976f967d9b3faa1749a8ab29d1743cf347dnicolasroard        return bitmap;
915448bf8095483574649afcc2add7f153670c7450nicolasroard    }
925448bf8095483574649afcc2add7f153670c7450nicolasroard
935448bf8095483574649afcc2add7f153670c7450nicolasroard    public static RenderScript getRenderScriptContext() {
945448bf8095483574649afcc2add7f153670c7450nicolasroard        return mRS;
955448bf8095483574649afcc2add7f153670c7450nicolasroard    }
965448bf8095483574649afcc2add7f153670c7450nicolasroard
975448bf8095483574649afcc2add7f153670c7450nicolasroard    public static void setRenderScriptContext(Activity context) {
985448bf8095483574649afcc2add7f153670c7450nicolasroard        mRS = RenderScript.create(context);
995448bf8095483574649afcc2add7f153670c7450nicolasroard        mResources = context.getResources();
1005448bf8095483574649afcc2add7f153670c7450nicolasroard    }
1015448bf8095483574649afcc2add7f153670c7450nicolasroard
1025448bf8095483574649afcc2add7f153670c7450nicolasroard}
103