ScriptIntrinsics.cpp revision e5428e661ce6f9d24f838cab0a8fb0fa8c76dbca
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
227f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayusing namespace android;
239eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC;
247f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
253cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsic::ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e)
2644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    : Script(nullptr, rs) {
27e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    mID = createDispatch(rs, RS::dispatch->ScriptIntrinsicCreate(rs->getContext(), id,
28e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                         e != nullptr ? e->getID() : 0));
2910913a5c37ba119bef335320d3e8be25212c05adTim Murray    mElement = e;
307f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
317f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
32b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsic::~ScriptIntrinsic() {
33b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
34b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
35b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
3621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsic3DLUT> ScriptIntrinsic3DLUT::create(sp<RS> rs, sp<const Element> e) {
3710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (e->isCompatible(Element::U8_4(rs)) == false) {
3810913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Element not supported for intrinsic");
3944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
4010913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
4121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsic3DLUT(rs, e);
4221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
4321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
4489daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsic3DLUT::ScriptIntrinsic3DLUT(sp<RS> rs, sp<const Element> e)
4589daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_3DLUT, e) {
4689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
4789daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
4889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsic3DLUT::forEach(sp<Allocation> ain, sp<Allocation> aout) {
4910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (ain->getType()->getElement()->isCompatible(mElement) == false ||
5010913a5c37ba119bef335320d3e8be25212c05adTim Murray        aout->getType()->getElement()->isCompatible(mElement) == false) {
5110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "3DLUT forEach element mismatch");
5210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
5310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
5444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, ain, aout, nullptr, 0);
5589daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
5689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsic3DLUT::setLUT(sp<Allocation> lut) {
5710913a5c37ba119bef335320d3e8be25212c05adTim Murray    sp<const Type> t = lut->getType();
5810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!t->getElement()->isCompatible(mElement)) {
5910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "setLUT element does not match");
6010913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
6110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
6210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (t->getZ() == 0) {
6310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "setLUT Allocation must be 3D");
6410913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
6510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
6610913a5c37ba119bef335320d3e8be25212c05adTim Murray
6789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, lut);
6889daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
6989daad6bae798779e57f252e9da4fe4e62337124Tim Murray
7021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicBlend> ScriptIntrinsicBlend::create(sp<RS> rs, sp<const Element> e) {
7110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (e->isCompatible(Element::U8_4(rs)) == false) {
7210913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Element not supported for intrinsic");
7344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
7410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
7521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicBlend(rs, e);
7621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
7721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
783cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsicBlend::ScriptIntrinsicBlend(sp<RS> rs, sp<const Element> e)
797f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_BLEND, e) {
807f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
817f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
8275e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachClear(sp<Allocation> in, sp<Allocation> out) {
8310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
8410913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
8510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
8610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
8744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, in, out, nullptr, 0);
887f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
897f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
9075e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrc(sp<Allocation> in, sp<Allocation> out) {
9110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
9210913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
9310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
9410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
9544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(1, in, out, nullptr, 0);
967f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
977f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
9875e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDst(sp<Allocation> in, sp<Allocation> out) {
9910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
10010913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
10110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
10210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
10344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(2, in, out, nullptr, 0);
1047f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1057f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
10675e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcOver(sp<Allocation> in, sp<Allocation> out) {
10710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
10810913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
10910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
11010913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
11144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(3, in, out, nullptr, 0);
1127f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1137f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
11475e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstOver(sp<Allocation> in, sp<Allocation> out) {
11510913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
11610913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
11710913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
11810913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
11944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(4, in, out, nullptr, 0);
1207f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1217f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
12275e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcIn(sp<Allocation> in, sp<Allocation> out) {
12310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
12410913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
12510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
12610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
12744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(5, in, out, nullptr, 0);
1287f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1297f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
13075e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstIn(sp<Allocation> in, sp<Allocation> out) {
13110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
13210913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
13310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
13410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
13544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(6, in, out, nullptr, 0);
1367f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1377f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
13875e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcOut(sp<Allocation> in, sp<Allocation> out) {
13910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
14010913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
14110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
14210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
14344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(7, in, out, nullptr, 0);
1447f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1457f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
14675e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstOut(sp<Allocation> in, sp<Allocation> out) {
14710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
14810913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
14910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
15010913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
15144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(8, in, out, nullptr, 0);
1527f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1537f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
15475e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcAtop(sp<Allocation> in, sp<Allocation> out) {
15510913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
15610913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
15710913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
15810913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
15944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(9, in, out, nullptr, 0);
1607f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1617f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
16275e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstAtop(sp<Allocation> in, sp<Allocation> out) {
16310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
16410913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
16510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
16610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
16744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(10, in, out, nullptr, 0);
1687f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1697f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
17075e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachXor(sp<Allocation> in, sp<Allocation> out) {
17110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
17210913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
17310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
17410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
17544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(11, in, out, nullptr, 0);
1767f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1777f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1787f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray// Numbering jumps here
17975e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachMultiply(sp<Allocation> in, sp<Allocation> out) {
18010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
18110913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
18210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
18310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
18444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(14, in, out, nullptr, 0);
1857f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1867f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1877f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray// Numbering jumps here
18875e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachAdd(sp<Allocation> in, 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(34, in, out, nullptr, 0);
1947f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1957f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
19675e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSubtract(sp<Allocation> in, 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(35, in, out, nullptr, 0);
2027f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
2037f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
20489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
20589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
20689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
20721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicBlur> ScriptIntrinsicBlur::create(sp<RS> rs, sp<const Element> e) {
20810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if ((e->isCompatible(Element::U8_4(rs)) == false) &&
20910913a5c37ba119bef335320d3e8be25212c05adTim Murray        (e->isCompatible(Element::U8(rs)) == false)) {
21010913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur");
21144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
21210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
21321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicBlur(rs, e);
21421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
21521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
2163cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsicBlur::ScriptIntrinsicBlur(sp<RS> rs, sp<const Element> e)
2178f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_BLUR, e) {
2187f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
2198f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray}
2207f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
22121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murrayvoid ScriptIntrinsicBlur::setInput(sp<Allocation> in) {
22210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false) {
22310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur input");
22410913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
22510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
2268f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    Script::setVar(1, in);
22721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
22821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
22921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murrayvoid ScriptIntrinsicBlur::forEach(sp<Allocation> out) {
23010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (out->getType()->getElement()->isCompatible(mElement) == false) {
23110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur output");
23210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
23310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
23444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, nullptr, out, nullptr, 0);
2358f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray}
2367f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
2378f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murrayvoid ScriptIntrinsicBlur::setRadius(float radius) {
23810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (radius > 0.f && radius <= 25.f) {
23910913a5c37ba119bef335320d3e8be25212c05adTim Murray        Script::setVar(0, &radius, sizeof(float));
24010913a5c37ba119bef335320d3e8be25212c05adTim Murray    } else {
24110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Blur radius out of 0-25 pixel bound");
24210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
2438f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray}
24489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
24589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
24689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
247aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murraysp<ScriptIntrinsicColorMatrix> ScriptIntrinsicColorMatrix::create(sp<RS> rs) {
248aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    return new ScriptIntrinsicColorMatrix(rs, Element::RGBA_8888(rs));
24921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
25021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
25189daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicColorMatrix::ScriptIntrinsicColorMatrix(sp<RS> rs, sp<const Element> e)
25289daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_COLOR_MATRIX, e) {
253aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    float add[4] = {0.f, 0.f, 0.f, 0.f};
254aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    setAdd(add);
25589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
25689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
25789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
25889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::forEach(sp<Allocation> in, sp<Allocation> out) {
25910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(in->getType()->getElement()->isCompatible(Element::U8(mRS))) &&
26010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::U8_2(mRS))) &&
26110913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::U8_3(mRS))) &&
26210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::U8_4(mRS))) &&
26310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32(mRS))) &&
26410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32_2(mRS))) &&
26510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32_3(mRS))) &&
26610913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) {
26710913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix");
26810913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
26910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
27010913a5c37ba119bef335320d3e8be25212c05adTim Murray
27110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(Element::U8(mRS))) &&
27210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U8_2(mRS))) &&
27310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U8_3(mRS))) &&
27410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U8_4(mRS))) &&
27510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32(mRS))) &&
27610913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32_2(mRS))) &&
27710913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32_3(mRS))) &&
27810913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) {
27910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix");
28010913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
28110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
28210913a5c37ba119bef335320d3e8be25212c05adTim Murray
28344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, in, out, nullptr, 0);
28489daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
28589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
28610913a5c37ba119bef335320d3e8be25212c05adTim Murrayvoid ScriptIntrinsicColorMatrix::setAdd(float* add) {
28710913a5c37ba119bef335320d3e8be25212c05adTim Murray    Script::setVar(1, (void*)add, sizeof(float) * 4);
28810913a5c37ba119bef335320d3e8be25212c05adTim Murray}
28989daad6bae798779e57f252e9da4fe4e62337124Tim Murray
29089daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix3(float* m) {
291aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    float temp[16];
292aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[0] = m[0];
293aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[1] = m[1];
294aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[2] = m[2];
295aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[3] = 0.f;
296aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray
297aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[4] = m[3];
298aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[5] = m[4];
299aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[6] = m[5];
300aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[7] = 0.f;
301aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray
302aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[8] = m[6];
303aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[9] = m[7];
304aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[10] = m[8];
305aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[11] = 0.f;
306aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray
307aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[12] = 0.f;
308aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[13] = 0.f;
309aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[14] = 0.f;
310aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    temp[15] = 1.f;
311aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray
312aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    setColorMatrix4(temp);
31389daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
31489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
31589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
31689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix4(float* m) {
31789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, (void*)m, sizeof(float) * 16);
31889daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
31989daad6bae798779e57f252e9da4fe4e62337124Tim Murray
32089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
32189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setGreyscale() {
322aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    float matrix[] = {0.299f, 0.299f, 0.299f,0.587f,0.587f,0.587f,0.114f,0.114f, 0.114f};
32389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    setColorMatrix3(matrix);
32489daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
32589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
32689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
32789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setRGBtoYUV() {
328aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    float matrix[] = { 0.299f, -0.14713f, 0.615f, 0.587f, -0.28886f, -0.51499f, 0.114f, 0.436f, -0.10001f};
32989daad6bae798779e57f252e9da4fe4e62337124Tim Murray    setColorMatrix3(matrix);
33089daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
33189daad6bae798779e57f252e9da4fe4e62337124Tim Murray
33289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
33389daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setYUVtoRGB() {
334aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray    float matrix[] = {1.f, 1.f, 1.f, 0.f, -0.39465f, 2.03211f, 1.13983f, -0.5806f, 0.f};
33589daad6bae798779e57f252e9da4fe4e62337124Tim Murray    setColorMatrix3(matrix);
33689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
33789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
33821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
33921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
34021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicConvolve3x3> ScriptIntrinsicConvolve3x3::create(sp<RS> rs, sp<const Element> e) {
34110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8(rs))) &&
34210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_2(rs))) &&
34310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_3(rs))) &&
34410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_4(rs))) &&
34510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32(rs))) &&
34610913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_2(rs))) &&
34710913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_3(rs))) &&
34810913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_4(rs)))) {
34910913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve3x3");
35044bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
35110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
35210913a5c37ba119bef335320d3e8be25212c05adTim Murray
35321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicConvolve3x3(rs, e);
35421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
35521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
35689daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve3x3::ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e)
35789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_3x3, e) {
35889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
35989daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
36089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
36189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::setInput(sp<Allocation> in) {
36210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(in->getType()->getElement()->isCompatible(mElement))) {
36310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3");
36410913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
36510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
36689daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(1, in);
36789daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
36889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
36989daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::forEach(sp<Allocation> out) {
37010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(mElement))) {
37110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3");
37210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
37310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
37444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, nullptr, out, nullptr, 0);
37589daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
37689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
37789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::setCoefficients(float* v) {
37889daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, (void*)v, sizeof(float) * 9);
37989daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
38089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
38121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicConvolve5x5> ScriptIntrinsicConvolve5x5::create(sp<RS> rs, sp<const Element> e) {
38210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8(rs))) &&
38310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_2(rs))) &&
38410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_3(rs))) &&
38510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_4(rs))) &&
38610913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32(rs))) &&
38710913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_2(rs))) &&
38810913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_3(rs))) &&
38910913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_4(rs)))) {
39010913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve5x5");
39144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
39210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
39310913a5c37ba119bef335320d3e8be25212c05adTim Murray
39421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicConvolve5x5(rs, e);
39521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
39621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
39789daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve5x5::ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e)
39889daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_5x5, e) {
39989daad6bae798779e57f252e9da4fe4e62337124Tim Murray
40089daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
40189daad6bae798779e57f252e9da4fe4e62337124Tim Murray
40289daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::setInput(sp<Allocation> in) {
40310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(in->getType()->getElement()->isCompatible(mElement))) {
40410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 input");
40510913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
40610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
40789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(1, in);
40889daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
40989daad6bae798779e57f252e9da4fe4e62337124Tim Murray
41089daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::forEach(sp<Allocation> out) {
41110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(mElement))) {
41210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 output");
41310913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
41410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
41510913a5c37ba119bef335320d3e8be25212c05adTim Murray
41644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, nullptr, out, nullptr, 0);
41789daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
41889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
41989daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::setCoefficients(float* v) {
42089daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, (void*)v, sizeof(float) * 25);
42189daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
42289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
423b05c850a493a769c88b58be2a6721a9bb06b3a0aJon Parrsp<ScriptIntrinsicHistogram> ScriptIntrinsicHistogram::create(sp<RS> rs, sp<const Element> e) {
424b05c850a493a769c88b58be2a6721a9bb06b3a0aJon Parr    return new ScriptIntrinsicHistogram(rs, e);
42521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
42621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
427b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicHistogram::ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e)
428b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_HISTOGRAM, e) {
429b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
430b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
431b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
43210913a5c37ba119bef335320d3e8be25212c05adTim Murrayvoid ScriptIntrinsicHistogram::setOutput(sp<Allocation> out) {
43310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(Element::U32(mRS))) &&
43410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U32_2(mRS))) &&
43510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U32_3(mRS))) &&
43610913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U32_4(mRS))) &&
43710913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32(mRS))) &&
43810913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32_2(mRS))) &&
43910913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32_3(mRS))) &&
44010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32_4(mRS)))) {
44110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Histogram output");
44210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
44310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
44410913a5c37ba119bef335320d3e8be25212c05adTim Murray
44510913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (out->getType()->getX() != 256 ||
44610913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getY() != 0 ||
44710913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->hasMipmaps()) {
44810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid Allocation type for Histogram output");
44910913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
45010913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
45110913a5c37ba119bef335320d3e8be25212c05adTim Murray    mOut = out;
45210913a5c37ba119bef335320d3e8be25212c05adTim Murray    Script::setVar(1, out);
453b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
454b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
455b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::setDotCoefficients(float r, float g, float b, float a) {
456b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    if ((r < 0.f) || (g < 0.f) || (b < 0.f) || (a < 0.f)) {
457b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        return;
458b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
459b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    if ((r + g + b + a) > 1.f) {
460b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        return;
461b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
462b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
463b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    FieldPacker fp(16);
464b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(r);
465b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(g);
466b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(b);
467b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(a);
468b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::setVar(0, fp.getData(), fp.getLength());
469b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
470b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
471b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
472b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::forEach(sp<Allocation> ain) {
47310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (ain->getType()->getElement()->getVectorSize() <
47410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mOut->getType()->getElement()->getVectorSize()) {
47510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER,
47610913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Input vector size must be >= output vector size");
47710913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
47810913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
47910913a5c37ba119bef335320d3e8be25212c05adTim Murray
480b05c850a493a769c88b58be2a6721a9bb06b3a0aJon Parr    if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) &&
48110913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) {
48210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT,
48310913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Input allocation to Histogram must be U8 or U8_4");
48410913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
48510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
48610913a5c37ba119bef335320d3e8be25212c05adTim Murray
48744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, ain, nullptr, nullptr, 0);
488b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
489b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
49089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
491b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::forEach_dot(sp<Allocation> ain) {
49210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (mOut->getType()->getElement()->getVectorSize() != 1) {
49310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER,
49410913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Output Histogram allocation must have vector size of 1 " \
49510913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "when used with forEach_dot");
49610913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
49710913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
498b05c850a493a769c88b58be2a6721a9bb06b3a0aJon Parr    if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) &&
49910913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) {
50010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT,
50110913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Input allocation to Histogram must be U8 or U8_4");
50210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
50310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
50410913a5c37ba119bef335320d3e8be25212c05adTim Murray
50544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(1, ain, nullptr, nullptr, 0);
506b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
507b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
50821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicLUT> ScriptIntrinsicLUT::create(sp<RS> rs, sp<const Element> e) {
50910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8_4(rs)))) {
51010913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT");
51144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
51210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
51321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicLUT(rs, e);
51421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
51521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
516b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e)
517b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_LUT, e), mDirty(true) {
5182acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    LUT = Allocation::createSized(rs, Element::U8(rs), 1024);
519b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    for (int i = 0; i < 256; i++) {
520b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i] = i;
521b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i+256] = i;
522b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i+512] = i;
523b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i+768] = i;
524b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
5252acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    setVar(0, LUT);
52689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
52789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
52889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicLUT::forEach(sp<Allocation> ain, sp<Allocation> aout) {
529b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    if (mDirty) {
530b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        LUT->copy1DFrom((void*)mCache);
531b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mDirty = false;
532b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
53310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS))) ||
53410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(aout->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) {
53510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT");
53610913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
53710913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
53844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, ain, aout, nullptr, 0);
53989daad6bae798779e57f252e9da4fe4e62337124Tim Murray
54089daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
54189daad6bae798779e57f252e9da4fe4e62337124Tim Murray
5422acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues) {
5432acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    if ((base + length) > 256 || length == 0) {
5442acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range");
545b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        return;
546b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
547b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    mDirty = true;
5482acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    for (unsigned int i = 0; i < length; i++) {
549b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[offset + base + i] = lutValues[i];
550b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
551b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
55289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
5532acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setRed(unsigned char base, unsigned int length, unsigned char* lutValues) {
554b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(0, base, length, lutValues);
555b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
556b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
5572acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setGreen(unsigned char base, unsigned int length, unsigned char* lutValues) {
558b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(256, base, length, lutValues);
559b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
560b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
5612acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setBlue(unsigned char base, unsigned int length, unsigned char* lutValues) {
562b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(512, base, length, lutValues);
563b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
56489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
5652acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues) {
566b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(768, base, length, lutValues);
567b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
568b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
569b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::~ScriptIntrinsicLUT() {
570b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
571b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
572b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
573e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangsp<ScriptIntrinsicResize> ScriptIntrinsicResize::create(sp<RS> rs) {
574e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    return new ScriptIntrinsicResize(rs, nullptr);
575e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
576e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
577e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao WangScriptIntrinsicResize::ScriptIntrinsicResize(sp<RS> rs, sp<const Element> e)
578e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_RESIZE, e) {
579e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
580e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
581e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid ScriptIntrinsicResize::forEach_bicubic(sp<Allocation> aout) {
582e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (aout == mInput) {
583e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Resize Input and Ouput cannot be the same");
584e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
585e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
586e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (!(mInput->getType()->getElement()->isCompatible(aout->getType()->getElement()))) {
587e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Resize forEach element mismatch");
588e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        return;
589e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
590e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    Script::forEach(0, nullptr, aout, nullptr, 0);
591e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
592e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid ScriptIntrinsicResize::setInput(sp<Allocation> ain) {
593e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) &&
594e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        !(ain->getType()->getElement()->isCompatible(Element::U8_2(mRS))) &&
595e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        !(ain->getType()->getElement()->isCompatible(Element::U8_3(mRS))) &&
596e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS))) &&
597e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        !(ain->getType()->getElement()->isCompatible(Element::F32(mRS))) &&
598e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        !(ain->getType()->getElement()->isCompatible(Element::F32_2(mRS))) &&
599e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        !(ain->getType()->getElement()->isCompatible(Element::F32_3(mRS))) &&
600e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        !(ain->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) {
601e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Resize Input");
602e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        return;
603e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
604e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
605e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    mInput = ain;
606e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    Script::setVar(0, ain);
607e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
608e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
609e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
61021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicYuvToRGB> ScriptIntrinsicYuvToRGB::create(sp<RS> rs, sp<const Element> e) {
61110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8_4(rs)))) {
61210913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for YuvToRGB");
61344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
61410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
61521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicYuvToRGB(rs, e);
61621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
61721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
618b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicYuvToRGB::ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e)
619b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_YUV_TO_RGB, e) {
620b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
621b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
622b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
623b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicYuvToRGB::setInput(sp<Allocation> in) {
624eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    if (!(in->getType()->getElement()->isCompatible(Element::YUV(mRS)))) {
62510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for input in YuvToRGB");
62610913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
62710913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
628b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::setVar(0, in);
629b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
630b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
631b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicYuvToRGB::forEach(sp<Allocation> out) {
63210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(mElement))) {
63310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for output in YuvToRGB");
63410913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
63510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
63610913a5c37ba119bef335320d3e8be25212c05adTim Murray
63744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    Script::forEach(0, nullptr, out, nullptr, 0);
638b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
639