/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.wallpaper.util; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Rect; import android.renderscript.Allocation; import android.renderscript.Element; import android.renderscript.RenderScript; import android.renderscript.ScriptIntrinsicBlur; import android.util.Log; /** * Class with different bitmap processors to apply to bitmaps */ public final class BitmapProcessor { private static final String TAG = "BitmapProcessor"; private static final float BLUR_RADIUS = 20f; private static final int DOWNSAMPLE = 5; private BitmapProcessor() { } /** * Function that blurs the content of a bitmap. * * @param context the Application Context * @param bitmap the bitmap we want to blur. * @param outWidth the end width of the blurred bitmap. * @param outHeight the end height of the blurred bitmap. * @return the blurred bitmap. */ public static Bitmap blur(Context context, Bitmap bitmap, int outWidth, int outHeight) { RenderScript renderScript = RenderScript.create(context); ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); Allocation input = null; Allocation output = null; Bitmap inBitmap = null; try { Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); WallpaperCropUtils.fitToSize(rect, outWidth / DOWNSAMPLE, outHeight / DOWNSAMPLE); inBitmap = Bitmap.createScaledBitmap(bitmap, rect.width(), rect.height(), true /* filter */); // Render script blurs only support ARGB_8888, we need a conversion if we got a // different bitmap config. if (inBitmap.getConfig() != Bitmap.Config.ARGB_8888) { Bitmap oldIn = inBitmap; inBitmap = oldIn.copy(Bitmap.Config.ARGB_8888, false /* isMutable */); oldIn.recycle(); } Bitmap outBitmap = Bitmap.createBitmap(inBitmap.getWidth(), inBitmap.getHeight(), Bitmap.Config.ARGB_8888); input = Allocation.createFromBitmap(renderScript, inBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE); output = Allocation.createFromBitmap(renderScript, outBitmap); blur.setRadius(BLUR_RADIUS); blur.setInput(input); blur.forEach(output); output.copyTo(outBitmap); return outBitmap; } catch (IllegalArgumentException ex) { Log.e(TAG, "error while blurring bitmap", ex); } finally { if (input != null) { input.destroy(); } if (output != null) { output.destroy(); } blur.destroy(); if (inBitmap != null) { inBitmap.recycle(); } } return null; } }