/* * Copyright (C) 2014 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. */ //#define LOG_NDEBUG 0 #define LOG_TAG "IntrinsicBlurFilter" #include #include #include #include #include "IntrinsicBlurFilter.h" namespace android { status_t IntrinsicBlurFilter::configure(const sp &msg) { status_t err = SimpleFilter::configure(msg); if (err != OK) { return err; } if (!msg->findString("cacheDir", &mCacheDir)) { ALOGE("Failed to find cache directory in config message."); return NAME_NOT_FOUND; } return OK; } status_t IntrinsicBlurFilter::start() { // TODO: use a single RS context object for entire application mRS = new RSC::RS(); if (!mRS->init(mCacheDir.c_str())) { ALOGE("Failed to initialize RenderScript context."); return NO_INIT; } // 32-bit elements for ARGB8888 RSC::sp e = RSC::Element::U8_4(mRS); RSC::Type::Builder tb(mRS, e); tb.setX(mWidth); tb.setY(mHeight); RSC::sp t = tb.create(); mAllocIn = RSC::Allocation::createTyped(mRS, t); mAllocOut = RSC::Allocation::createTyped(mRS, t); mBlur = RSC::ScriptIntrinsicBlur::create(mRS, e); mBlur->setRadius(mBlurRadius); mBlur->setInput(mAllocIn); return OK; } void IntrinsicBlurFilter::reset() { mBlur.clear(); mAllocOut.clear(); mAllocIn.clear(); mRS.clear(); } status_t IntrinsicBlurFilter::setParameters(const sp &msg) { sp params; CHECK(msg->findMessage("params", ¶ms)); float blurRadius; if (params->findFloat("blur-radius", &blurRadius)) { mBlurRadius = blurRadius; } return OK; } status_t IntrinsicBlurFilter::processBuffers( const sp &srcBuffer, const sp &outBuffer) { mAllocIn->copy1DRangeFrom(0, mWidth * mHeight, srcBuffer->data()); mBlur->forEach(mAllocOut); mAllocOut->copy1DRangeTo(0, mWidth * mHeight, outBuffer->data()); return OK; } } // namespace android