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