ScriptIntrinsics.cpp revision 75e877d157f9429eb6d8fb1b09c75c5472db161a
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 8175e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachClear(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 8975e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrc(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 9775e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDst(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 10575e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcOver(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 11375e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstOver(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 12175e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcIn(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 12975e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstIn(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 13775e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcOut(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 14575e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstOut(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 15375e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSrcAtop(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 16175e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachDstAtop(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 16975e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachXor(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 17875e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachMultiply(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 18775e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachAdd(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 19575e877d157f9429eb6d8fb1b09c75c5472db161aTim Murrayvoid ScriptIntrinsicBlend::forEachSubtract(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 246aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murraysp<ScriptIntrinsicColorMatrix> ScriptIntrinsicColorMatrix::create(sp<RS> rs) { 247aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray return new ScriptIntrinsicColorMatrix(rs, Element::RGBA_8888(rs)); 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) { 252aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float add[4] = {0.f, 0.f, 0.f, 0.f}; 253aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray setAdd(add); 25489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 25589daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 25689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 25789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::forEach(sp<Allocation> in, sp<Allocation> out) { 25810913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(in->getType()->getElement()->isCompatible(Element::U8(mRS))) && 25910913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::U8_2(mRS))) && 26010913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::U8_3(mRS))) && 26110913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::U8_4(mRS))) && 26210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32(mRS))) && 26310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32_2(mRS))) && 26410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32_3(mRS))) && 26510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(in->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) { 26610913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix"); 26710913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 26810913a5c37ba119bef335320d3e8be25212c05adTim Murray } 26910913a5c37ba119bef335320d3e8be25212c05adTim Murray 27010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(Element::U8(mRS))) && 27110913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U8_2(mRS))) && 27210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U8_3(mRS))) && 27310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U8_4(mRS))) && 27410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32(mRS))) && 27510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32_2(mRS))) && 27610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32_3(mRS))) && 27710913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::F32_4(mRS)))) { 27810913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for ColorMatrix"); 27910913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 28010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 28110913a5c37ba119bef335320d3e8be25212c05adTim Murray 28289daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::forEach(0, in, out, NULL, 0); 28389daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 28489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 28510913a5c37ba119bef335320d3e8be25212c05adTim Murrayvoid ScriptIntrinsicColorMatrix::setAdd(float* add) { 28610913a5c37ba119bef335320d3e8be25212c05adTim Murray Script::setVar(1, (void*)add, sizeof(float) * 4); 28710913a5c37ba119bef335320d3e8be25212c05adTim Murray} 28889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 28989daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix3(float* m) { 290aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float temp[16]; 291aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[0] = m[0]; 292aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[1] = m[1]; 293aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[2] = m[2]; 294aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[3] = 0.f; 295aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 296aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[4] = m[3]; 297aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[5] = m[4]; 298aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[6] = m[5]; 299aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[7] = 0.f; 300aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 301aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[8] = m[6]; 302aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[9] = m[7]; 303aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[10] = m[8]; 304aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[11] = 0.f; 305aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 306aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[12] = 0.f; 307aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[13] = 0.f; 308aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[14] = 0.f; 309aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray temp[15] = 1.f; 310aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray 311aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray setColorMatrix4(temp); 31289daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 31389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 31489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 31589daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setColorMatrix4(float* m) { 31689daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(0, (void*)m, sizeof(float) * 16); 31789daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 31889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 31989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 32089daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setGreyscale() { 321aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float matrix[] = {0.299f, 0.299f, 0.299f,0.587f,0.587f,0.587f,0.114f,0.114f, 0.114f}; 32289daad6bae798779e57f252e9da4fe4e62337124Tim Murray setColorMatrix3(matrix); 32389daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 32489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 32589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 32689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setRGBtoYUV() { 327aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float matrix[] = { 0.299f, -0.14713f, 0.615f, 0.587f, -0.28886f, -0.51499f, 0.114f, 0.436f, -0.10001f}; 32889daad6bae798779e57f252e9da4fe4e62337124Tim Murray setColorMatrix3(matrix); 32989daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 33089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 33189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 33289daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicColorMatrix::setYUVtoRGB() { 333aae73c96081c15eb63ac24f29e243b7c85ff4480Tim Murray float matrix[] = {1.f, 1.f, 1.f, 0.f, -0.39465f, 2.03211f, 1.13983f, -0.5806f, 0.f}; 33489daad6bae798779e57f252e9da4fe4e62337124Tim Murray setColorMatrix3(matrix); 33589daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 33689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 33721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 33821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 33921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicConvolve3x3> ScriptIntrinsicConvolve3x3::create(sp<RS> rs, sp<const Element> e) { 34010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8(rs))) && 34110913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_2(rs))) && 34210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_3(rs))) && 34310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_4(rs))) && 34410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32(rs))) && 34510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_2(rs))) && 34610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_3(rs))) && 34710913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_4(rs)))) { 34810913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve3x3"); 34910913a5c37ba119bef335320d3e8be25212c05adTim Murray return NULL; 35010913a5c37ba119bef335320d3e8be25212c05adTim Murray } 35110913a5c37ba119bef335320d3e8be25212c05adTim Murray 35221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicConvolve3x3(rs, e); 35321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 35421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 35589daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve3x3::ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e) 35689daad6bae798779e57f252e9da4fe4e62337124Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_3x3, e) { 35789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 35889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 35989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 36089daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::setInput(sp<Allocation> in) { 36110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(in->getType()->getElement()->isCompatible(mElement))) { 36210913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3"); 36310913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 36410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 36589daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(1, in); 36689daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 36789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 36889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::forEach(sp<Allocation> out) { 36910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(mElement))) { 37010913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve3x3"); 37110913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 37210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 37389daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::forEach(0, NULL, out, NULL, 0); 37489daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 37589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 37689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve3x3::setCoefficients(float* v) { 37789daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(0, (void*)v, sizeof(float) * 9); 37889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 37989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 38021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicConvolve5x5> ScriptIntrinsicConvolve5x5::create(sp<RS> rs, sp<const Element> e) { 38110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8(rs))) && 38210913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_2(rs))) && 38310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_3(rs))) && 38410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::U8_4(rs))) && 38510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32(rs))) && 38610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_2(rs))) && 38710913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_3(rs))) && 38810913a5c37ba119bef335320d3e8be25212c05adTim Murray !(e->isCompatible(Element::F32_4(rs)))) { 38910913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Convolve5x5"); 39010913a5c37ba119bef335320d3e8be25212c05adTim Murray return NULL; 39110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 39210913a5c37ba119bef335320d3e8be25212c05adTim Murray 39321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicConvolve5x5(rs, e); 39421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 39521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 39689daad6bae798779e57f252e9da4fe4e62337124Tim MurrayScriptIntrinsicConvolve5x5::ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e) 39789daad6bae798779e57f252e9da4fe4e62337124Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_CONVOLVE_5x5, e) { 39889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 39989daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 40089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 40189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::setInput(sp<Allocation> in) { 40210913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(in->getType()->getElement()->isCompatible(mElement))) { 40310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 input"); 40410913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 40510913a5c37ba119bef335320d3e8be25212c05adTim Murray } 40689daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(1, in); 40789daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 40889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 40989daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::forEach(sp<Allocation> out) { 41010913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(mElement))) { 41110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Element mismatch in Convolve5x5 output"); 41210913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 41310913a5c37ba119bef335320d3e8be25212c05adTim Murray } 41410913a5c37ba119bef335320d3e8be25212c05adTim Murray 41589daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::forEach(0, NULL, out, NULL, 0); 41689daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 41789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 41889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicConvolve5x5::setCoefficients(float* v) { 41989daad6bae798779e57f252e9da4fe4e62337124Tim Murray Script::setVar(0, (void*)v, sizeof(float) * 25); 42089daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 42189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 42210913a5c37ba119bef335320d3e8be25212c05adTim Murraysp<ScriptIntrinsicHistogram> ScriptIntrinsicHistogram::create(sp<RS> rs) { 42310913a5c37ba119bef335320d3e8be25212c05adTim Murray return new ScriptIntrinsicHistogram(rs, NULL); 42421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 42521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 426b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicHistogram::ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e) 427b27b18130d0772203799ba0f2d27783b640dc891Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_HISTOGRAM, e) { 428b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 429b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 430b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 43110913a5c37ba119bef335320d3e8be25212c05adTim Murrayvoid ScriptIntrinsicHistogram::setOutput(sp<Allocation> out) { 43210913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(Element::U32(mRS))) && 43310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U32_2(mRS))) && 43410913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U32_3(mRS))) && 43510913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::U32_4(mRS))) && 43610913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32(mRS))) && 43710913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32_2(mRS))) && 43810913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32_3(mRS))) && 43910913a5c37ba119bef335320d3e8be25212c05adTim Murray !(out->getType()->getElement()->isCompatible(Element::I32_4(mRS)))) { 44010913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for Histogram output"); 44110913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 44210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 44310913a5c37ba119bef335320d3e8be25212c05adTim Murray 44410913a5c37ba119bef335320d3e8be25212c05adTim Murray if (out->getType()->getX() != 256 || 44510913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->getY() != 0 || 44610913a5c37ba119bef335320d3e8be25212c05adTim Murray out->getType()->hasMipmaps()) { 44710913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid Allocation type for Histogram output"); 44810913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 44910913a5c37ba119bef335320d3e8be25212c05adTim Murray } 45010913a5c37ba119bef335320d3e8be25212c05adTim Murray mOut = out; 45110913a5c37ba119bef335320d3e8be25212c05adTim Murray Script::setVar(1, out); 452b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 453b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 454b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::setDotCoefficients(float r, float g, float b, float a) { 455b27b18130d0772203799ba0f2d27783b640dc891Tim Murray if ((r < 0.f) || (g < 0.f) || (b < 0.f) || (a < 0.f)) { 456b27b18130d0772203799ba0f2d27783b640dc891Tim Murray return; 457b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 458b27b18130d0772203799ba0f2d27783b640dc891Tim Murray if ((r + g + b + a) > 1.f) { 459b27b18130d0772203799ba0f2d27783b640dc891Tim Murray return; 460b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 461b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 462b27b18130d0772203799ba0f2d27783b640dc891Tim Murray FieldPacker fp(16); 463b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(r); 464b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(g); 465b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(b); 466b27b18130d0772203799ba0f2d27783b640dc891Tim Murray fp.add(a); 467b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::setVar(0, fp.getData(), fp.getLength()); 468b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 469b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 470b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 471b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::forEach(sp<Allocation> ain) { 47210913a5c37ba119bef335320d3e8be25212c05adTim Murray if (ain->getType()->getElement()->getVectorSize() < 47310913a5c37ba119bef335320d3e8be25212c05adTim Murray mOut->getType()->getElement()->getVectorSize()) { 47410913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, 47510913a5c37ba119bef335320d3e8be25212c05adTim Murray "Input vector size must be >= output vector size"); 47610913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 47710913a5c37ba119bef335320d3e8be25212c05adTim Murray } 47810913a5c37ba119bef335320d3e8be25212c05adTim Murray 47910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) || 48010913a5c37ba119bef335320d3e8be25212c05adTim Murray !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) { 48110913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, 48210913a5c37ba119bef335320d3e8be25212c05adTim Murray "Input allocation to Histogram must be U8 or U8_4"); 48310913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 48410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 48510913a5c37ba119bef335320d3e8be25212c05adTim Murray 486b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::forEach(0, ain, NULL, NULL, 0); 487b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 488b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 48989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 490b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicHistogram::forEach_dot(sp<Allocation> ain) { 49110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (mOut->getType()->getElement()->getVectorSize() != 1) { 49210913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, 49310913a5c37ba119bef335320d3e8be25212c05adTim Murray "Output Histogram allocation must have vector size of 1 " \ 49410913a5c37ba119bef335320d3e8be25212c05adTim Murray "when used with forEach_dot"); 49510913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 49610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 49710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(ain->getType()->getElement()->isCompatible(Element::U8(mRS))) || 49810913a5c37ba119bef335320d3e8be25212c05adTim Murray !(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) { 49910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, 50010913a5c37ba119bef335320d3e8be25212c05adTim Murray "Input allocation to Histogram must be U8 or U8_4"); 50110913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 50210913a5c37ba119bef335320d3e8be25212c05adTim Murray } 50310913a5c37ba119bef335320d3e8be25212c05adTim Murray 504b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::forEach(1, ain, NULL, NULL, 0); 505b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 506b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 50721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicLUT> ScriptIntrinsicLUT::create(sp<RS> rs, sp<const Element> e) { 50810913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8_4(rs)))) { 50910913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT"); 51010913a5c37ba119bef335320d3e8be25212c05adTim Murray return NULL; 51110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 51221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicLUT(rs, e); 51321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 51421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 515b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e) 516b27b18130d0772203799ba0f2d27783b640dc891Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_LUT, e), mDirty(true) { 5172acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray LUT = Allocation::createSized(rs, Element::U8(rs), 1024); 518b27b18130d0772203799ba0f2d27783b640dc891Tim Murray for (int i = 0; i < 256; i++) { 519b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i] = i; 520b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i+256] = i; 521b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i+512] = i; 522b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[i+768] = i; 523b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 5242acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray setVar(0, LUT); 52589daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 52689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 52789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid ScriptIntrinsicLUT::forEach(sp<Allocation> ain, sp<Allocation> aout) { 528b27b18130d0772203799ba0f2d27783b640dc891Tim Murray if (mDirty) { 529b27b18130d0772203799ba0f2d27783b640dc891Tim Murray LUT->copy1DFrom((void*)mCache); 530b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mDirty = false; 531b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 53210913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(ain->getType()->getElement()->isCompatible(Element::U8_4(mRS))) || 53310913a5c37ba119bef335320d3e8be25212c05adTim Murray !(aout->getType()->getElement()->isCompatible(Element::U8_4(mRS)))) { 53410913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for LUT"); 53510913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 53610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 537b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::forEach(0, ain, aout, NULL, 0); 53889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 53989daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 54089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5412acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues) { 5422acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray if ((base + length) > 256 || length == 0) { 5432acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "LUT out of range"); 544b27b18130d0772203799ba0f2d27783b640dc891Tim Murray return; 545b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 546b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mDirty = true; 5472acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray for (unsigned int i = 0; i < length; i++) { 548b27b18130d0772203799ba0f2d27783b640dc891Tim Murray mCache[offset + base + i] = lutValues[i]; 549b27b18130d0772203799ba0f2d27783b640dc891Tim Murray } 550b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 55189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5522acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setRed(unsigned char base, unsigned int length, unsigned char* lutValues) { 553b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(0, base, length, lutValues); 554b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 555b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 5562acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setGreen(unsigned char base, unsigned int length, unsigned char* lutValues) { 557b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(256, base, length, lutValues); 558b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 559b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 5602acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setBlue(unsigned char base, unsigned int length, unsigned char* lutValues) { 561b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(512, base, length, lutValues); 562b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 56389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5642acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murrayvoid ScriptIntrinsicLUT::setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues) { 565b27b18130d0772203799ba0f2d27783b640dc891Tim Murray setTable(768, base, length, lutValues); 566b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 567b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 568b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicLUT::~ScriptIntrinsicLUT() { 569b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 570b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 571b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 57221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murraysp<ScriptIntrinsicYuvToRGB> ScriptIntrinsicYuvToRGB::create(sp<RS> rs, sp<const Element> e) { 57310913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(e->isCompatible(Element::U8_4(rs)))) { 57410913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for YuvToRGB"); 57510913a5c37ba119bef335320d3e8be25212c05adTim Murray return NULL; 57610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 57721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray return new ScriptIntrinsicYuvToRGB(rs, e); 57821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray} 57921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray 580b27b18130d0772203799ba0f2d27783b640dc891Tim MurrayScriptIntrinsicYuvToRGB::ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e) 581b27b18130d0772203799ba0f2d27783b640dc891Tim Murray : ScriptIntrinsic(rs, RS_SCRIPT_INTRINSIC_ID_YUV_TO_RGB, e) { 582b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 583b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 584b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 585b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicYuvToRGB::setInput(sp<Allocation> in) { 586eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray if (!(in->getType()->getElement()->isCompatible(Element::YUV(mRS)))) { 58710913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for input in YuvToRGB"); 58810913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 58910913a5c37ba119bef335320d3e8be25212c05adTim Murray } 590b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::setVar(0, in); 591b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 592b27b18130d0772203799ba0f2d27783b640dc891Tim Murray 593b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayvoid ScriptIntrinsicYuvToRGB::forEach(sp<Allocation> out) { 59410913a5c37ba119bef335320d3e8be25212c05adTim Murray if (!(out->getType()->getElement()->isCompatible(mElement))) { 59510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_ELEMENT, "Invalid element for output in YuvToRGB"); 59610913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 59710913a5c37ba119bef335320d3e8be25212c05adTim Murray } 59810913a5c37ba119bef335320d3e8be25212c05adTim Murray 599b27b18130d0772203799ba0f2d27783b640dc891Tim Murray Script::forEach(0, NULL, out, NULL, 0); 600b27b18130d0772203799ba0f2d27783b640dc891Tim Murray} 601