ScriptIntrinsics.cpp revision fa77db83d3e36d6aa23622cec5bdcb5e373f0a3b
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)
267f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    : Script(NULL, rs) {
27fa77db83d3e36d6aa23622cec5bdcb5e373f0a3bTim Murray    mID = createDispatch(rs, RS::dispatch->ScriptIntrinsicCreate(rs->getContext(), id, e->getID()));
2810913a5c37ba119bef335320d3e8be25212c05adTim Murray    mElement = e;
297f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
307f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
31b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsic::~ScriptIntrinsic() {
32b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
33b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
34b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
3521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsic3DLUT> ScriptIntrinsic3DLUT::create(sp<RS> rs, sp<const Element> e) {
3610913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (e->isCompatible(Element::U8_4(rs)) == false) {
3710913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Element not supported for intrinsic");
3810913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
3910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
4021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsic3DLUT(rs, e);
4121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
4221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
4389daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsic3DLUT::ScriptIntrinsic3DLUT(sp<RS> rs, sp<const Element> e)
4489daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_3DLUT, e) {
4589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
4689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
4789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsic3DLUT::forEach(sp<Allocation> ain, sp<Allocation> aout) {
4810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (ain->getType()->getElement()->isCompatible(mElement) == false ||
4910913a5c37ba119bef335320d3e8be25212c05adTim Murray        aout->getType()->getElement()->isCompatible(mElement) == false) {
5010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "3DLUT forEach element mismatch");
5110913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
5210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
5389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::forEach(0, ain, aout, NULL, 0);
5489daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
5589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsic3DLUT::setLUT(sp<Allocation> lut) {
5610913a5c37ba119bef335320d3e8be25212c05adTim Murray    sp<const Type> t = lut->getType();
5710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!t->getElement()->isCompatible(mElement)) {
5810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "setLUT element does not match");
5910913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
6010913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
6110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (t->getZ() == 0) {
6210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "setLUT Allocation must be 3D");
6310913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
6410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
6510913a5c37ba119bef335320d3e8be25212c05adTim Murray
6689daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, lut);
6789daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
6889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
6921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicBlend> ScriptIntrinsicBlend::create(sp<RS> rs, sp<const Element> e) {
7010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (e->isCompatible(Element::U8_4(rs)) == false) {
7110913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Element not supported for intrinsic");
7210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
7310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
7421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicBlend(rs, e);
7521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
7621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
773cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsicBlend::ScriptIntrinsicBlend(sp<RS> rs, sp<const Element> e)
787f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_BLEND, e) {
797f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
807f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
817f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendClear(sp<Allocation> in, sp<Allocation> out) {
8210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
8310913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
8410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
8510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
867f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(0, in, out, NULL, 0);
877f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
887f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
897f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendSrc(sp<Allocation> in, sp<Allocation> out) {
9010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
9110913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
9210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
9310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
947f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(1, in, out, NULL, 0);
957f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
967f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
977f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendDst(sp<Allocation> in, sp<Allocation> out) {
9810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
9910913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
10010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
10110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1027f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(2, in, out, NULL, 0);
1037f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1047f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1057f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendSrcOver(sp<Allocation> in, sp<Allocation> out) {
10610913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
10710913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
10810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
10910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1107f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(3, in, out, NULL, 0);
1117f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1127f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1137f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendDstOver(sp<Allocation> in, sp<Allocation> out) {
11410913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
11510913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
11610913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
11710913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1187f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(4, in, out, NULL, 0);
1197f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1207f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1217f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendSrcIn(sp<Allocation> in, sp<Allocation> out) {
12210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
12310913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
12410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
12510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1267f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(5, in, out, NULL, 0);
1277f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1287f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1297f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendDstIn(sp<Allocation> in, sp<Allocation> out) {
13010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
13110913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
13210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
13310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1347f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(6, in, out, NULL, 0);
1357f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1367f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1377f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendSrcOut(sp<Allocation> in, sp<Allocation> out) {
13810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
13910913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
14010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
14110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1427f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(7, in, out, NULL, 0);
1437f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1447f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1457f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendDstOut(sp<Allocation> in, sp<Allocation> out) {
14610913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
14710913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
14810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
14910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1507f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(8, in, out, NULL, 0);
1517f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1527f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1537f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendSrcAtop(sp<Allocation> in, sp<Allocation> out) {
15410913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
15510913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
15610913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
15710913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1587f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(9, in, out, NULL, 0);
1597f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1607f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1617f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendDstAtop(sp<Allocation> in, sp<Allocation> out) {
16210913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
16310913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
16410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
16510913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1667f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(10, in, out, NULL, 0);
1677f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1687f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1697f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendXor(sp<Allocation> in, sp<Allocation> out) {
17010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
17110913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
17210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
17310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1747f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(11, in, out, NULL, 0);
1757f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1767f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1777f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray// Numbering jumps here
1787f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendMultiply(sp<Allocation> in, sp<Allocation> out) {
17910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
18010913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
18110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
18210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1837f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(14, in, out, NULL, 0);
1847f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1857f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1867f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray// Numbering jumps here
1877f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendAdd(sp<Allocation> in, sp<Allocation> out) {
18810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
18910913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
19010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
19110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
1927f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(34, in, out, NULL, 0);
1937f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
1947f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
1957f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayvoid ScriptIntrinsicBlend::blendSubtract(sp<Allocation> in, sp<Allocation> out) {
19610913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false ||
19710913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getElement()->isCompatible(mElement) == false) {
19810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blend");
19910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
2007f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    Script::forEach(35, in, out, NULL, 0);
2017f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray}
2027f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
20389daad6bae798779e57f252e9da4fe4e62337124Tim Murray
20489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
20589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
20621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicBlur> ScriptIntrinsicBlur::create(sp<RS> rs, sp<const Element> e) {
20710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if ((e->isCompatible(Element::U8_4(rs)) == false) &&
20810913a5c37ba119bef335320d3e8be25212c05adTim Murray        (e->isCompatible(Element::U8(rs)) == false)) {
20910913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur");
21010913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
21110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
21221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicBlur(rs, e);
21321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
21421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
2153cd44af22622898d3000b2b3c4c408cede294152Tim MurrayScriptIntrinsicBlur::ScriptIntrinsicBlur(sp<RS> rs, sp<const Element> e)
2168f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_BLUR, e) {
2177f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
2188f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray}
2197f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
22021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murrayvoid ScriptIntrinsicBlur::setInput(sp<Allocation> in) {
22110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (in->getType()->getElement()->isCompatible(mElement) == false) {
22210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur input");
22310913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
22410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
2258f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    Script::setVar(1, in);
22621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
22721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
22821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murrayvoid ScriptIntrinsicBlur::forEach(sp<Allocation> out) {
22910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (out->getType()->getElement()->isCompatible(mElement) == false) {
23010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element in blur output");
23110913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
23210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
2338f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    Script::forEach(0, NULL, out, NULL, 0);
2348f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray}
2357f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
2368f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murrayvoid ScriptIntrinsicBlur::setRadius(float radius) {
23710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (radius > 0.f && radius <= 25.f) {
23810913a5c37ba119bef335320d3e8be25212c05adTim Murray        Script::setVar(0, &radius, sizeof(float));
23910913a5c37ba119bef335320d3e8be25212c05adTim Murray    } else {
24010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Blur radius out of 0-25 pixel bound");
24110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
2428f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray}
24389daad6bae798779e57f252e9da4fe4e62337124Tim Murray
24489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
24589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
24621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicColorMatrix> ScriptIntrinsicColorMatrix::create(sp<RS> rs, sp<const Element> e) {
24721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicColorMatrix(rs, e);
24821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
24921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
25089daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicColorMatrix::ScriptIntrinsicColorMatrix(sp<RS> rs, sp<const Element> e)
25189daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_COLOR_MATRIX, e) {
25289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
25389daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
25489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
25589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::forEach(sp<Allocation> in, sp<Allocation> out) {
25610913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(in->getType()->getElement()->isCompatible(Element::U8(mRS))) &&
25710913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::U8_2(mRS))) &&
25810913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::U8_3(mRS))) &&
25910913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::U8_4(mRS))) &&
26010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32(mRS))) &&
26110913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32_2(mRS))) &&
26210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32_3(mRS))) &&
26310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(in->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) {
26410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix");
26510913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
26610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
26710913a5c37ba119bef335320d3e8be25212c05adTim Murray
26810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(Element::U8(mRS))) &&
26910913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U8_2(mRS))) &&
27010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U8_3(mRS))) &&
27110913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U8_4(mRS))) &&
27210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32(mRS))) &&
27310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32_2(mRS))) &&
27410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32_3(mRS))) &&
27510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) {
27610913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix");
27710913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
27810913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
27910913a5c37ba119bef335320d3e8be25212c05adTim Murray
28089daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::forEach(0, in, out, NULL, 0);
28189daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
28289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
28310913a5c37ba119bef335320d3e8be25212c05adTim Murrayvoid ScriptIntrinsicColorMatrix::setAdd(float* add) {
28410913a5c37ba119bef335320d3e8be25212c05adTim Murray    Script::setVar(1, (void*)add, sizeof(float) * 4);
28510913a5c37ba119bef335320d3e8be25212c05adTim Murray}
28689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
28789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix3(float* m) {
28889daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, (void*)m, sizeof(float) * 9);
28989daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
29089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
29189daad6bae798779e57f252e9da4fe4e62337124Tim Murray
29289daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix4(float* m) {
29389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, (void*)m, sizeof(float) * 16);
29489daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
29589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
29689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
29789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setGreyscale() {
29889daad6bae798779e57f252e9da4fe4e62337124Tim Murray    float matrix[] = {0.299f, 0.587f,  0.114f, 0.299f, 0.587f, 0.114f, 0.299f, 0.587f, 0.114f};
29989daad6bae798779e57f252e9da4fe4e62337124Tim Murray    setColorMatrix3(matrix);
30089daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
30189daad6bae798779e57f252e9da4fe4e62337124Tim Murray
30289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
30389daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setRGBtoYUV() {
30489daad6bae798779e57f252e9da4fe4e62337124Tim Murray    float matrix[] = {0.299f,0.587f,0.114f,-0.14713f,-0.28886f,0.436f,0.615f,-0.51499f,-0.10001f};
30589daad6bae798779e57f252e9da4fe4e62337124Tim Murray    setColorMatrix3(matrix);
30689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
30789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
30889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
30989daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setYUVtoRGB() {
31089daad6bae798779e57f252e9da4fe4e62337124Tim Murray    float matrix[] = {1.f,0.f,1.13983f,1.f,-0.39465f,-0.5806f,1.f,2.03211f,0.f};
31189daad6bae798779e57f252e9da4fe4e62337124Tim Murray    setColorMatrix3(matrix);
31289daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
31389daad6bae798779e57f252e9da4fe4e62337124Tim Murray
31421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
31521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
31621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicConvolve3x3> ScriptIntrinsicConvolve3x3::create(sp<RS> rs, sp<const Element> e) {
31710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8(rs))) &&
31810913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_2(rs))) &&
31910913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_3(rs))) &&
32010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_4(rs))) &&
32110913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32(rs))) &&
32210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_2(rs))) &&
32310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_3(rs))) &&
32410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_4(rs)))) {
32510913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve3x3");
32610913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
32710913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
32810913a5c37ba119bef335320d3e8be25212c05adTim Murray
32921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicConvolve3x3(rs, e);
33021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
33121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
33289daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve3x3::ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e)
33389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_3x3, e) {
33489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
33589daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
33689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
33789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::setInput(sp<Allocation> in) {
33810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(in->getType()->getElement()->isCompatible(mElement))) {
33910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3");
34010913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
34110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
34289daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(1, in);
34389daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
34489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
34589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::forEach(sp<Allocation> out) {
34610913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(mElement))) {
34710913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3");
34810913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
34910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
35089daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::forEach(0, NULL, out, NULL, 0);
35189daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
35289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
35389daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::setCoefficients(float* v) {
35489daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, (void*)v, sizeof(float) * 9);
35589daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
35689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
35721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicConvolve5x5> ScriptIntrinsicConvolve5x5::create(sp<RS> rs, sp<const Element> e) {
35810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8(rs))) &&
35910913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_2(rs))) &&
36010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_3(rs))) &&
36110913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::U8_4(rs))) &&
36210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32(rs))) &&
36310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_2(rs))) &&
36410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_3(rs))) &&
36510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(e->isCompatible(Element::F32_4(rs)))) {
36610913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve5x5");
36710913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
36810913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
36910913a5c37ba119bef335320d3e8be25212c05adTim Murray
37021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicConvolve5x5(rs, e);
37121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
37221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
37389daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve5x5::ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e)
37489daad6bae798779e57f252e9da4fe4e62337124Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_5x5, e) {
37589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
37689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
37789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
37889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::setInput(sp<Allocation> in) {
37910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(in->getType()->getElement()->isCompatible(mElement))) {
38010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 input");
38110913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
38210913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
38389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(1, in);
38489daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
38589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
38689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::forEach(sp<Allocation> out) {
38710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(mElement))) {
38810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 output");
38910913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
39010913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
39110913a5c37ba119bef335320d3e8be25212c05adTim Murray
39289daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::forEach(0, NULL, out, NULL, 0);
39389daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
39489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
39589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::setCoefficients(float* v) {
39689daad6bae798779e57f252e9da4fe4e62337124Tim Murray    Script::setVar(0, (void*)v, sizeof(float) * 25);
39789daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
39889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
39910913a5c37ba119bef335320d3e8be25212c05adTim Murraysp<ScriptIntrinsicHistogram> ScriptIntrinsicHistogram::create(sp<RS> rs) {
40010913a5c37ba119bef335320d3e8be25212c05adTim Murray    return new ScriptIntrinsicHistogram(rs, NULL);
40121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
40221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
403b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicHistogram::ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e)
404b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_HISTOGRAM, e) {
405b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
406b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
407b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
40810913a5c37ba119bef335320d3e8be25212c05adTim Murrayvoid ScriptIntrinsicHistogram::setOutput(sp<Allocation> out) {
40910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(Element::U32(mRS))) &&
41010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U32_2(mRS))) &&
41110913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U32_3(mRS))) &&
41210913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::U32_4(mRS))) &&
41310913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32(mRS))) &&
41410913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32_2(mRS))) &&
41510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32_3(mRS))) &&
41610913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(out->getType()->getElement()->isCompatible(Element::I32_4(mRS)))) {
41710913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Histogram output");
41810913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
41910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
42010913a5c37ba119bef335320d3e8be25212c05adTim Murray
42110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (out->getType()->getX() != 256 ||
42210913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->getY() != 0 ||
42310913a5c37ba119bef335320d3e8be25212c05adTim Murray        out->getType()->hasMipmaps()) {
42410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid Allocation type for Histogram output");
42510913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
42610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
42710913a5c37ba119bef335320d3e8be25212c05adTim Murray    mOut = out;
42810913a5c37ba119bef335320d3e8be25212c05adTim Murray    Script::setVar(1, out);
429b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
430b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
431b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::setDotCoefficients(float r, float g, float b, float a) {
432b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    if ((r < 0.f) || (g < 0.f) || (b < 0.f) || (a < 0.f)) {
433b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        return;
434b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
435b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    if ((r + g + b + a) > 1.f) {
436b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        return;
437b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
438b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
439b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    FieldPacker fp(16);
440b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(r);
441b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(g);
442b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(b);
443b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    fp.add(a);
444b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::setVar(0, fp.getData(), fp.getLength());
445b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
446b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
447b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
448b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::forEach(sp<Allocation> ain) {
44910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (ain->getType()->getElement()->getVectorSize() <
45010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mOut->getType()->getElement()->getVectorSize()) {
45110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER,
45210913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Input vector size must be >= output vector size");
45310913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
45410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
45510913a5c37ba119bef335320d3e8be25212c05adTim Murray
45610913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) ||
45710913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) {
45810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT,
45910913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Input allocation to Histogram must be U8 or U8_4");
46010913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
46110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
46210913a5c37ba119bef335320d3e8be25212c05adTim Murray
463b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::forEach(0, ain, NULL, NULL, 0);
464b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
465b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
46689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
467b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::forEach_dot(sp<Allocation> ain) {
46810913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (mOut->getType()->getElement()->getVectorSize() != 1) {
46910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER,
47010913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Output Histogram allocation must have vector size of 1 " \
47110913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "when used with forEach_dot");
47210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
47310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
47410913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) ||
47510913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) {
47610913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT,
47710913a5c37ba119bef335320d3e8be25212c05adTim Murray                        "Input allocation to Histogram must be U8 or U8_4");
47810913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
47910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
48010913a5c37ba119bef335320d3e8be25212c05adTim Murray
481b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::forEach(1, ain, NULL, NULL, 0);
482b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
483b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
48421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicLUT> ScriptIntrinsicLUT::create(sp<RS> rs, sp<const Element> e) {
48510913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8_4(rs)))) {
48610913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT");
48710913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
48810913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
48921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicLUT(rs, e);
49021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
49121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
492b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e)
493b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_LUT, e), mDirty(true) {
4942acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    LUT = Allocation::createSized(rs, Element::U8(rs), 1024);
495b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    for (int i = 0; i < 256; i++) {
496b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i] = i;
497b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i+256] = i;
498b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i+512] = i;
499b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[i+768] = i;
500b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
5012acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    setVar(0, LUT);
50289daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
50389daad6bae798779e57f252e9da4fe4e62337124Tim Murray
50489daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicLUT::forEach(sp<Allocation> ain, sp<Allocation> aout) {
505b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    if (mDirty) {
506b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        LUT->copy1DFrom((void*)mCache);
507b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mDirty = false;
508b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
50910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS))) ||
51010913a5c37ba119bef335320d3e8be25212c05adTim Murray        !(aout->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) {
51110913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT");
51210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
51310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
514b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::forEach(0, ain, aout, NULL, 0);
51589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
51689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}
51789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
5182acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues) {
5192acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    if ((base + length) > 256 || length == 0) {
5202acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range");
521b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        return;
522b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
523b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    mDirty = true;
5242acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    for (unsigned int i = 0; i < length; i++) {
525b27b18130d0772203799ba0f2d27783b640dc891Tim Murray        mCache[offset + base + i] = lutValues[i];
526b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    }
527b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
52889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
5292acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setRed(unsigned char base, unsigned int length, unsigned char* lutValues) {
530b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(0, base, length, lutValues);
531b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
532b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
5332acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setGreen(unsigned char base, unsigned int length, unsigned char* lutValues) {
534b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(256, base, length, lutValues);
535b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
536b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
5372acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setBlue(unsigned char base, unsigned int length, unsigned char* lutValues) {
538b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(512, base, length, lutValues);
539b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
54089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
5412acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues) {
542b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    setTable(768, base, length, lutValues);
543b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
544b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
545b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::~ScriptIntrinsicLUT() {
546b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
547b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
548b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
54921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicYuvToRGB> ScriptIntrinsicYuvToRGB::create(sp<RS> rs, sp<const Element> e) {
55010913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(e->isCompatible(Element::U8_4(rs)))) {
55110913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for YuvToRGB");
55210913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
55310913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
55421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    return new ScriptIntrinsicYuvToRGB(rs, e);
55521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray}
55621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
557b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicYuvToRGB::ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e)
558b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_YUV_TO_RGB, e) {
559b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
560b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
561b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
562b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicYuvToRGB::setInput(sp<Allocation> in) {
563eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    if (!(in->getType()->getElement()->isCompatible(Element::YUV(mRS)))) {
56410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for input in YuvToRGB");
56510913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
56610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
567b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::setVar(0, in);
568b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
569b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
570b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicYuvToRGB::forEach(sp<Allocation> out) {
57110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (!(out->getType()->getElement()->isCompatible(mElement))) {
57210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for output in YuvToRGB");
57310913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
57410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
57510913a5c37ba119bef335320d3e8be25212c05adTim Murray
576b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    Script::forEach(0, NULL, out, NULL, 0);
577b27b18130d0772203799ba0f2d27783b640dc891Tim Murray}
578