17f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray/* 27f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * Copyright (C) 2008-2012 The Android Open Source Project 37f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * 47f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * Licensed under the Apache License, Version 2.0 (the "License"); 57f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * you may not use this file except in compliance with the License. 67f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * You may obtain a copy of the License at 77f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * 87f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * http://www.apache.org/licenses/LICENSE-2.0 97f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * 107f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * Unless required by applicable law or agreed to in writing, software 117f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * distributed under the License is distributed on an "AS IS" BASIS, 127f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * See the License for the specific language governing permissions and 147f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray * limitations under the License. 157f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray */ 167f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 177f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray#include <malloc.h> 187f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 197f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray#include "RenderScript.h" 20fa77db83d3e36d6aa23622cec5bdcb5e373f0a3bTim Murray#include "rsCppInternal.h" 217f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 22dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsic; 23dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsic3DLUT; 24dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicBlend; 25dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicBlur; 26dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicColorMatrix; 27dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicConvolve3x3; 28dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicConvolve5x5; 29dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicHistogram; 30dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicLUT; 31dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicResize; 32dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::ScriptIntrinsicYuvToRGB; 33dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::sp; 347f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 353cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsic::ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e) 3644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes : Script(nullptr, rs) { 37e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mID = createDispatch(rs, RS::dispatch->ScriptIntrinsicCreate(rs->getContext(), id, 38e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang e != nullptr ? e->getID() : 0)); 3910913a5c37ba119bef335320d3e8be25212c05adTim Murray mElement = e; 407f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 417f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 42b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsic::~ScriptIntrinsic() { 43b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 44b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 45b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 4645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsic3DLUT> ScriptIntrinsic3DLUT::create(const sp<RS>& rs, const sp<const Element>& e) { 4710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (e->isCompatible(Element::U8_4(rs)) == false) { 4810913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Element not supported for intrinsic"); 4944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 5010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 5121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsic3DLUT(rs, e); 5221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 5321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 5489daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsic3DLUT::ScriptIntrinsic3DLUT(sp<RS> rs, sp<const Element> e) 5589daad6bae798779e57f252e9da4fe4e62337124Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_3DLUT, e) { 5689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5789daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 5845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsic3DLUT::forEach(const sp<Allocation>& ain, const sp<Allocation>& aout) { 5910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (ain->getType()->getElement()->isCompatible(mElement) == false || 6010913a5c37ba119bef335320d3e8be25212c05adTim Murray aout->getType()->getElement()->isCompatible(mElement) == false) { 6110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "3DLUT forEach element mismatch"); 6210913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 6310913a5c37ba119bef335320d3e8be25212c05adTim Murray } 6444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, ain, aout, nullptr, 0); 6589daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 6645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsic3DLUT::setLUT(const sp<Allocation>& lut) { 6710913a5c37ba119bef335320d3e8be25212c05adTim Murray sp<const Type> t = lut->getType(); 6810913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!t->getElement()->isCompatible(mElement)) { 6910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "setLUT element does not match"); 7010913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 7110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 7210913a5c37ba119bef335320d3e8be25212c05adTim Murray if (t->getZ() == 0) { 7310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "setLUT Allocation must be 3D"); 7410913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 7510913a5c37ba119bef335320d3e8be25212c05adTim Murray } 7610913a5c37ba119bef335320d3e8be25212c05adTim Murray 7789daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(0, lut); 7889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 7989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 8045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicBlend> ScriptIntrinsicBlend::create(const sp<RS>& rs, const sp<const Element>& e) { 8110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (e->isCompatible(Element::U8_4(rs)) == false) { 8210913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Element not supported for intrinsic"); 8344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 8410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 8521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicBlend(rs, e); 8621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 8721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 883cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsicBlend::ScriptIntrinsicBlend(sp<RS> rs, sp<const Element> e) 897f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_BLEND, e) { 907f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 917f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 9245768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachClear(const sp<Allocation>& in, const sp<Allocation>& out) { 9310913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 9410913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 9510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 9610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 9744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, in, out, nullptr, 0); 987f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 997f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 10045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachSrc(const sp<Allocation>& in, const sp<Allocation>& out) { 10110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 10210913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 10310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 10410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 10544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(1, in, out, nullptr, 0); 1067f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1077f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 10845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachDst(const sp<Allocation>& in, const sp<Allocation>& out) { 10910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 11010913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 11110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 11210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 11344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(2, in, out, nullptr, 0); 1147f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1157f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 11645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachSrcOver(const sp<Allocation>& in, const sp<Allocation>& out) { 11710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 11810913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 11910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 12010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 12144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(3, in, out, nullptr, 0); 1227f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1237f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 12445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachDstOver(const sp<Allocation>& in, const sp<Allocation>& out) { 12510913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 12610913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 12710913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 12810913a5c37ba119bef335320d3e8be25212c05adTim Murray } 12944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(4, in, out, nullptr, 0); 1307f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1317f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 13245768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachSrcIn(const sp<Allocation>& in, const sp<Allocation>& out) { 13310913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 13410913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 13510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 13610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 13744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(5, in, out, nullptr, 0); 1387f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1397f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 14045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachDstIn(const sp<Allocation>& in, const sp<Allocation>& out) { 14110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 14210913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 14310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 14410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 14544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(6, in, out, nullptr, 0); 1467f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1477f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 14845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachSrcOut(const sp<Allocation>& in, const sp<Allocation>& out) { 14910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 15010913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 15110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 15210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 15344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(7, in, out, nullptr, 0); 1547f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1557f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 15645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachDstOut(const sp<Allocation>& in, const sp<Allocation>& out) { 15710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 15810913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 15910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 16010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 16144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(8, in, out, nullptr, 0); 1627f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1637f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 16445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachSrcAtop(const sp<Allocation>& in, const sp<Allocation>& out) { 16510913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 16610913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 16710913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 16810913a5c37ba119bef335320d3e8be25212c05adTim Murray } 16944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(9, in, out, nullptr, 0); 1707f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1717f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 17245768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachDstAtop(const sp<Allocation>& in, const sp<Allocation>& out) { 17310913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 17410913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 17510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 17610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 17744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(10, in, out, nullptr, 0); 1787f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1797f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 18045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachXor(const sp<Allocation>& in, const sp<Allocation>& out) { 18110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 18210913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 18310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 18410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 18544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(11, in, out, nullptr, 0); 1867f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1877f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 18845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachMultiply(const sp<Allocation>& in, const sp<Allocation>& out) { 18910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 19010913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 19110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 19210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 19344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(14, in, out, nullptr, 0); 1947f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 1957f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 19645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachAdd(const sp<Allocation>& in, const sp<Allocation>& out) { 19710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 19810913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 19910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 20010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 20144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(34, in, out, nullptr, 0); 2027f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 2037f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 20445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlend::forEachSubtract(const sp<Allocation>& in, const sp<Allocation>& out) { 20510913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false || 20610913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getElement()->isCompatible(mElement) == false) { 20710913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend"); 20810913a5c37ba119bef335320d3e8be25212c05adTim Murray } 20944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(35, in, out, nullptr, 0); 2107f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray} 2117f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 21289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 21389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 21489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 21545768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicBlur> ScriptIntrinsicBlur::create(const sp<RS>& rs, const sp<const Element>& e) { 21610913a5c37ba119bef335320d3e8be25212c05adTim Murray if ((e->isCompatible(Element::U8_4(rs)) == false) && 21710913a5c37ba119bef335320d3e8be25212c05adTim Murray (e->isCompatible(Element::U8(rs)) == false)) { 21810913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur"); 21944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 22010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 22121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicBlur(rs, e); 22221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 22321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 2243cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsicBlur::ScriptIntrinsicBlur(sp<RS> rs, sp<const Element> e) 2258f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_BLUR, e) { 2267f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 2278f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray} 2287f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 22945768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlur::setInput(const sp<Allocation>& in) { 23010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (in->getType()->getElement()->isCompatible(mElement) == false) { 23110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur input"); 23210913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 23310913a5c37ba119bef335320d3e8be25212c05adTim Murray } 2348f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray Script::setVar(1, in); 23521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 23621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 23745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicBlur::forEach(const sp<Allocation>& out) { 23810913a5c37ba119bef335320d3e8be25212c05adTim Murray if (out->getType()->getElement()->isCompatible(mElement) == false) { 23910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur output"); 24010913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 24110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 24244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, nullptr, out, nullptr, 0); 2438f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray} 2447f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray 2458f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murrayvoid ScriptIntrinsicBlur::setRadius(float radius) { 24610913a5c37ba119bef335320d3e8be25212c05adTim Murray if (radius > 0.f && radius <= 25.f) { 24710913a5c37ba119bef335320d3e8be25212c05adTim Murray Script::setVar(0, &radius, sizeof(float)); 24810913a5c37ba119bef335320d3e8be25212c05adTim Murray } else { 24910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Blur radius out of 0-25 pixel bound"); 25010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 2518f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray} 25289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 25389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 25489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 25545768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicColorMatrix> ScriptIntrinsicColorMatrix::create(const sp<RS>& rs) { 256aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray return new ScriptIntrinsicColorMatrix(rs, Element::RGBA_8888(rs)); 25721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 25821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 25989daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicColorMatrix::ScriptIntrinsicColorMatrix(sp<RS> rs, sp<const Element> e) 26089daad6bae798779e57f252e9da4fe4e62337124Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_COLOR_MATRIX, e) { 261aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float add[4] = {0.f, 0.f, 0.f, 0.f}; 262aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray setAdd(add); 26389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 26489daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 26589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 26645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicColorMatrix::forEach(const sp<Allocation>& in, const sp<Allocation>& out) { 26710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(in->getType()->getElement()->isCompatible(Element::U8(mRS))) && 26810913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::U8_2(mRS))) && 26910913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::U8_3(mRS))) && 27010913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::U8_4(mRS))) && 27110913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32(mRS))) && 27210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32_2(mRS))) && 27310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32_3(mRS))) && 27410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) { 27510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix"); 27610913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 27710913a5c37ba119bef335320d3e8be25212c05adTim Murray } 27810913a5c37ba119bef335320d3e8be25212c05adTim Murray 27910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(Element::U8(mRS))) && 28010913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U8_2(mRS))) && 28110913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U8_3(mRS))) && 28210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U8_4(mRS))) && 28310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32(mRS))) && 28410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32_2(mRS))) && 28510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32_3(mRS))) && 28610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) { 28710913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix"); 28810913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 28910913a5c37ba119bef335320d3e8be25212c05adTim Murray } 29010913a5c37ba119bef335320d3e8be25212c05adTim Murray 29144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, in, out, nullptr, 0); 29289daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 29389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 29410913a5c37ba119bef335320d3e8be25212c05adTim Murrayvoid ScriptIntrinsicColorMatrix::setAdd(float* add) { 29510913a5c37ba119bef335320d3e8be25212c05adTim Murray Script::setVar(1, (void*)add, sizeof(float) * 4); 29610913a5c37ba119bef335320d3e8be25212c05adTim Murray} 29789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 29889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix3(float* m) { 299aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float temp[16]; 300aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[0] = m[0]; 301aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[1] = m[1]; 302aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[2] = m[2]; 303aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[3] = 0.f; 304aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 305aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[4] = m[3]; 306aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[5] = m[4]; 307aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[6] = m[5]; 308aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[7] = 0.f; 309aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 310aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[8] = m[6]; 311aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[9] = m[7]; 312aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[10] = m[8]; 313aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[11] = 0.f; 314aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 315aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[12] = 0.f; 316aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[13] = 0.f; 317aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[14] = 0.f; 318aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[15] = 1.f; 319aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 320aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray setColorMatrix4(temp); 32189daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 32289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 32389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 32489daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix4(float* m) { 32589daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(0, (void*)m, sizeof(float) * 16); 32689daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 32789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 32889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 32989daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setGreyscale() { 330aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float matrix[] = {0.299f, 0.299f, 0.299f,0.587f,0.587f,0.587f,0.114f,0.114f, 0.114f}; 33189daad6bae798779e57f252e9da4fe4e62337124Tim Murray setColorMatrix3(matrix); 33289daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 33389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 33489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 33589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setRGBtoYUV() { 336aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float matrix[] = { 0.299f, -0.14713f, 0.615f, 0.587f, -0.28886f, -0.51499f, 0.114f, 0.436f, -0.10001f}; 33789daad6bae798779e57f252e9da4fe4e62337124Tim Murray setColorMatrix3(matrix); 33889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 33989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 34089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 34189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setYUVtoRGB() { 342aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float matrix[] = {1.f, 1.f, 1.f, 0.f, -0.39465f, 2.03211f, 1.13983f, -0.5806f, 0.f}; 34389daad6bae798779e57f252e9da4fe4e62337124Tim Murray setColorMatrix3(matrix); 34489daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 34589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 34621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 34721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 34845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicConvolve3x3> ScriptIntrinsicConvolve3x3::create(const sp<RS>& rs, const sp<const Element>& e) { 34910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8(rs))) && 35010913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_2(rs))) && 35110913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_3(rs))) && 35210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_4(rs))) && 35310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32(rs))) && 35410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_2(rs))) && 35510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_3(rs))) && 35610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_4(rs)))) { 35710913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve3x3"); 35844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 35910913a5c37ba119bef335320d3e8be25212c05adTim Murray } 36010913a5c37ba119bef335320d3e8be25212c05adTim Murray 36121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicConvolve3x3(rs, e); 36221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 36321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 36489daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve3x3::ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e) 36589daad6bae798779e57f252e9da4fe4e62337124Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_3x3, e) { 36689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 36789daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 36889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 36945768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicConvolve3x3::setInput(const sp<Allocation>& in) { 37010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(in->getType()->getElement()->isCompatible(mElement))) { 37110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3"); 37210913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 37310913a5c37ba119bef335320d3e8be25212c05adTim Murray } 37489daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(1, in); 37589daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 37689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 37745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicConvolve3x3::forEach(const sp<Allocation>& out) { 37810913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(mElement))) { 37910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3"); 38010913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 38110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 38244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, nullptr, out, nullptr, 0); 38389daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 38489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 38589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::setCoefficients(float* v) { 38689daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(0, (void*)v, sizeof(float) * 9); 38789daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 38889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 38945768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicConvolve5x5> ScriptIntrinsicConvolve5x5::create(const sp<RS>& rs, const sp<const Element>& e) { 39010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8(rs))) && 39110913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_2(rs))) && 39210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_3(rs))) && 39310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_4(rs))) && 39410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32(rs))) && 39510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_2(rs))) && 39610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_3(rs))) && 39710913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_4(rs)))) { 39810913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve5x5"); 39944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 40010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 40110913a5c37ba119bef335320d3e8be25212c05adTim Murray 40221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicConvolve5x5(rs, e); 40321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 40421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 40589daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve5x5::ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e) 40689daad6bae798779e57f252e9da4fe4e62337124Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_5x5, e) { 40789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 40889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 40989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 41045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicConvolve5x5::setInput(const sp<Allocation>& in) { 41110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(in->getType()->getElement()->isCompatible(mElement))) { 41210913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 input"); 41310913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 41410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 41589daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(1, in); 41689daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 41789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 41845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicConvolve5x5::forEach(const sp<Allocation>& out) { 41910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(mElement))) { 42010913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 output"); 42110913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 42210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 42310913a5c37ba119bef335320d3e8be25212c05adTim Murray 42444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, nullptr, out, nullptr, 0); 42589daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 42689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 42789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::setCoefficients(float* v) { 42889daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(0, (void*)v, sizeof(float) * 25); 42989daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 43089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 43145768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicHistogram> ScriptIntrinsicHistogram::create(const sp<RS>& rs, const sp<const Element>& e) { 432b05c850a493a769c88b58be2a6721a9bb06b3a0aJon Parr return new ScriptIntrinsicHistogram(rs, e); 43321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 43421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 435b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicHistogram::ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e) 436b27b18130d0772203799ba0f2d27783b640dc891Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_HISTOGRAM, e) { 437b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 438b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 439b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 44045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicHistogram::setOutput(const sp<Allocation>& out) { 44110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(Element::U32(mRS))) && 44210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U32_2(mRS))) && 44310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U32_3(mRS))) && 44410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U32_4(mRS))) && 44510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32(mRS))) && 44610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32_2(mRS))) && 44710913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32_3(mRS))) && 44810913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32_4(mRS)))) { 44910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Histogram output"); 45010913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 45110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 45210913a5c37ba119bef335320d3e8be25212c05adTim Murray 45310913a5c37ba119bef335320d3e8be25212c05adTim Murray if (out->getType()->getX() != 256 || 45410913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getY() != 0 || 45510913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->hasMipmaps()) { 45610913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid Allocation type for Histogram output"); 45710913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 45810913a5c37ba119bef335320d3e8be25212c05adTim Murray } 45910913a5c37ba119bef335320d3e8be25212c05adTim Murray mOut = out; 46010913a5c37ba119bef335320d3e8be25212c05adTim Murray Script::setVar(1, out); 461b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 462b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 463b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::setDotCoefficients(float r, float g, float b, float a) { 464b27b18130d0772203799ba0f2d27783b640dc891Tim Murray if ((r < 0.f) || (g < 0.f) || (b < 0.f) || (a < 0.f)) { 465b27b18130d0772203799ba0f2d27783b640dc891Tim Murray return; 466b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 467b27b18130d0772203799ba0f2d27783b640dc891Tim Murray if ((r + g + b + a) > 1.f) { 468b27b18130d0772203799ba0f2d27783b640dc891Tim Murray return; 469b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 470b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 471b27b18130d0772203799ba0f2d27783b640dc891Tim Murray FieldPacker fp(16); 472b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(r); 473b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(g); 474b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(b); 475b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(a); 476b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::setVar(0, fp.getData(), fp.getLength()); 477b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 478b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 479b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 48045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicHistogram::forEach(const sp<Allocation>& ain) { 48110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (ain->getType()->getElement()->getVectorSize() < 48210913a5c37ba119bef335320d3e8be25212c05adTim Murray mOut->getType()->getElement()->getVectorSize()) { 48310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, 48410913a5c37ba119bef335320d3e8be25212c05adTim Murray "Input vector size must be >= output vector size"); 48510913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 48610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 48710913a5c37ba119bef335320d3e8be25212c05adTim Murray 488b05c850a493a769c88b58be2a6721a9bb06b3a0aJon Parr if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) && 48910913a5c37ba119bef335320d3e8be25212c05adTim Murray !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) { 49010913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, 49110913a5c37ba119bef335320d3e8be25212c05adTim Murray "Input allocation to Histogram must be U8 or U8_4"); 49210913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 49310913a5c37ba119bef335320d3e8be25212c05adTim Murray } 49410913a5c37ba119bef335320d3e8be25212c05adTim Murray 49544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, ain, nullptr, nullptr, 0); 496b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 497b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 49889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 49945768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicHistogram::forEach_dot(const sp<Allocation>& ain) { 50010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (mOut->getType()->getElement()->getVectorSize() != 1) { 50110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, 50210913a5c37ba119bef335320d3e8be25212c05adTim Murray "Output Histogram allocation must have vector size of 1 " \ 50310913a5c37ba119bef335320d3e8be25212c05adTim Murray "when used with forEach_dot"); 50410913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 50510913a5c37ba119bef335320d3e8be25212c05adTim Murray } 506b05c850a493a769c88b58be2a6721a9bb06b3a0aJon Parr if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) && 50710913a5c37ba119bef335320d3e8be25212c05adTim Murray !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) { 50810913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, 50910913a5c37ba119bef335320d3e8be25212c05adTim Murray "Input allocation to Histogram must be U8 or U8_4"); 51010913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 51110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 51210913a5c37ba119bef335320d3e8be25212c05adTim Murray 51344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(1, ain, nullptr, nullptr, 0); 514b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 515b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 51645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicLUT> ScriptIntrinsicLUT::create(const sp<RS>& rs, const sp<const Element>& e) { 51710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8_4(rs)))) { 51810913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT"); 51944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 52010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 52121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicLUT(rs, e); 52221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 52321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 524b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e) 525b27b18130d0772203799ba0f2d27783b640dc891Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_LUT, e), mDirty(true) { 5262acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray LUT = Allocation::createSized(rs, Element::U8(rs), 1024); 527b27b18130d0772203799ba0f2d27783b640dc891Tim Murray for (int i = 0; i < 256; i++) { 528b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i] = i; 529b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i+256] = i; 530b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i+512] = i; 531b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i+768] = i; 532b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 5332acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray setVar(0, LUT); 53489daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 53589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 53645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicLUT::forEach(const sp<Allocation>& ain, const sp<Allocation>& aout) { 537b27b18130d0772203799ba0f2d27783b640dc891Tim Murray if (mDirty) { 538b27b18130d0772203799ba0f2d27783b640dc891Tim Murray LUT->copy1DFrom((void*)mCache); 539b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mDirty = false; 540b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 54110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS))) || 54210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(aout->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) { 54310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT"); 54410913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 54510913a5c37ba119bef335320d3e8be25212c05adTim Murray } 54644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, ain, aout, nullptr, 0); 54789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 54889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 54989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5502acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues) { 5512acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray if ((base + length) > 256 || length == 0) { 5522acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range"); 553b27b18130d0772203799ba0f2d27783b640dc891Tim Murray return; 554b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 555b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mDirty = true; 5562acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray for (unsigned int i = 0; i < length; i++) { 557b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[offset + base + i] = lutValues[i]; 558b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 559b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 56089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5612acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setRed(unsigned char base, unsigned int length, unsigned char* lutValues) { 562b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(0, base, length, lutValues); 563b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 564b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 5652acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setGreen(unsigned char base, unsigned int length, unsigned char* lutValues) { 566b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(256, base, length, lutValues); 567b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 568b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 5692acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setBlue(unsigned char base, unsigned int length, unsigned char* lutValues) { 570b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(512, base, length, lutValues); 571b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 57289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5732acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues) { 574b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(768, base, length, lutValues); 575b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 576b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 577b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::~ScriptIntrinsicLUT() { 578b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 579b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 580b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 58145768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicResize> ScriptIntrinsicResize::create(const sp<RS>& rs) { 582e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang return new ScriptIntrinsicResize(rs, nullptr); 583e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 584e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 585e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao WangScriptIntrinsicResize::ScriptIntrinsicResize(sp<RS> rs, sp<const Element> e) 586e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_RESIZE, e) { 587e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 588e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 58945768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicResize::forEach_bicubic(const sp<Allocation>& aout) { 590e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (aout == mInput) { 591e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Resize Input and Ouput cannot be the same"); 592e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 593e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 594e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (!(mInput->getType()->getElement()->isCompatible(aout->getType()->getElement()))) { 595e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Resize forEach element mismatch"); 596e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang return; 597e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 598e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang Script::forEach(0, nullptr, aout, nullptr, 0); 599e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 60045768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicResize::setInput(const sp<Allocation>& ain) { 601e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) && 602e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang !(ain->getType()->getElement()->isCompatible(Element::U8_2(mRS))) && 603e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang !(ain->getType()->getElement()->isCompatible(Element::U8_3(mRS))) && 604e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS))) && 605e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang !(ain->getType()->getElement()->isCompatible(Element::F32(mRS))) && 606e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang !(ain->getType()->getElement()->isCompatible(Element::F32_2(mRS))) && 607e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang !(ain->getType()->getElement()->isCompatible(Element::F32_3(mRS))) && 608e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang !(ain->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) { 609e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Resize Input"); 610e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang return; 611e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 612e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 613e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mInput = ain; 614e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang Script::setVar(0, ain); 615e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 616e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 617e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 61845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<ScriptIntrinsicYuvToRGB> ScriptIntrinsicYuvToRGB::create(const sp<RS>& rs, const sp<const Element>& e) { 61910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8_4(rs)))) { 62010913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for YuvToRGB"); 62144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 62210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 62321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicYuvToRGB(rs, e); 62421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 62521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 626b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicYuvToRGB::ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e) 627b27b18130d0772203799ba0f2d27783b640dc891Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_YUV_TO_RGB, e) { 628b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 629b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 630b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 63145768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicYuvToRGB::setInput(const sp<Allocation>& in) { 632eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray if (!(in->getType()->getElement()->isCompatible(Element::YUV(mRS)))) { 63310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for input in YuvToRGB"); 63410913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 63510913a5c37ba119bef335320d3e8be25212c05adTim Murray } 636b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::setVar(0, in); 637b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 638b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 63945768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid ScriptIntrinsicYuvToRGB::forEach(const sp<Allocation>& out) { 64010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(mElement))) { 64110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for output in YuvToRGB"); 64210913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 64310913a5c37ba119bef335320d3e8be25212c05adTim Murray } 64410913a5c37ba119bef335320d3e8be25212c05adTim Murray 64544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes Script::forEach(0, nullptr, out, nullptr, 0); 646dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsieh} 647