blob: bef545ea5114933f7a9506de7e5523696d29656a [file] [log] [blame]
/*
* 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;
}
}