18fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams/* 28fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * Copyright (C) 2012 The Android Open Source Project 38fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 48fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 58fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * you may not use this file except in compliance with the License. 68fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * You may obtain a copy of the License at 78fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 88fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * http://www.apache.org/licenses/LICENSE-2.0 98fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 108fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * Unless required by applicable law or agreed to in writing, software 118fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 128fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * See the License for the specific language governing permissions and 148fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * limitations under the License. 158fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams */ 168fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 178fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Samspackage android.support.v8.renderscript; 188fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 198fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Samsimport android.util.Log; 208fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 218fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams/** 228fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 237d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * Intrinsic for converting RGB to RGBA by using a 3D lookup table. The 247d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * incoming r,g,b values are use as normalized x,y,z coordinates into a 3D 257d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * allocation. The 8 nearest values are sampled and linearly interpolated. The 267d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * result is placed in the output. 277d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * 288fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * @hide 298fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams **/ 30ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murraypublic class ScriptIntrinsic3DLUT extends ScriptIntrinsic { 318fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams private Allocation mLUT; 328fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams private Element mElement; 338fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 34ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray protected ScriptIntrinsic3DLUT(int id, RenderScript rs, Element e) { 358fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams super(id, rs); 368fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams mElement = e; 378fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 388fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 398fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams /** 408fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * Supported elements types are {@link Element#U8_4} 418fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 428fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * The defaults tables are identity. 438fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 447d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * @param rs The RenderScript context 458fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * @param e Element type for intputs and outputs 468fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 478fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * @return ScriptIntrinsic3DLUT 488fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams */ 498fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams public static ScriptIntrinsic3DLUT create(RenderScript rs, Element e) { 50ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (rs.isNative) { 51ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray RenderScriptThunker rst = (RenderScriptThunker) rs; 52ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return ScriptIntrinsic3DLUTThunker.create(rs, e); 53ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 548fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams int id = rs.nScriptIntrinsicCreate(8, e.getID(rs)); 558fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 568fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams if (!e.isCompatible(Element.U8_4(rs))) { 578fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams throw new RSIllegalArgumentException("Element must be compatible with uchar4."); 588fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 598fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 608fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams return new ScriptIntrinsic3DLUT(id, rs, e); 618fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 628fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 637d435ae5ba100be5710b685653cc351cab159c11Stephen Hines /** 6460c5b31f4448410221de043873b94797732afa66Stephen Hines * Sets the {@link android.support.v8.renderscript.Allocation} to be used as 6560c5b31f4448410221de043873b94797732afa66Stephen Hines * the lookup table. 667d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * 6760c5b31f4448410221de043873b94797732afa66Stephen Hines * The lookup table must use the same 6860c5b31f4448410221de043873b94797732afa66Stephen Hines * {@link android.support.v8.renderscript.Element} as the intrinsic. 697d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * 707d435ae5ba100be5710b685653cc351cab159c11Stephen Hines */ 717d435ae5ba100be5710b685653cc351cab159c11Stephen Hines 728fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams public void setLUT(Allocation lut) { 738fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams final Type t = lut.getType(); 748fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 758fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams if (t.getZ() == 0) { 768fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams throw new RSIllegalArgumentException("LUT must be 3d."); 778fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 788fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 798fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams if (!t.getElement().isCompatible(mElement)) { 808fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams throw new RSIllegalArgumentException("LUT element type must match."); 818fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 828fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 838fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams mLUT = lut; 848fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams setVar(0, mLUT); 858fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 868fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 878fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 888fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams /** 898fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * Invoke the kernel and apply the lookup to each cell of ain 908fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * and copy to aout. 918fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 928fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * @param ain Input allocation 938fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * @param aout Output allocation 948fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams */ 958fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams public void forEach(Allocation ain, Allocation aout) { 968fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams forEach(0, ain, aout, null); 978fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 988fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 998fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams /** 1008fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * Get a KernelID for this intrinsic kernel. 1018fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * 1028fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams * @return Script.KernelID The KernelID object. 1038fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams */ 1048fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams public Script.KernelID getKernelID() { 1058fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams return createKernelID(0, 3, null, null); 1068fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams } 1078fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams} 1088fb4b53aef5216ff5b1b0687a581278d93c2d38fJason Sams 109