1ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/* 2ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Copyright (C) 2012 The Android Open Source Project 3ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 4ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * you may not use this file except in compliance with the License. 6ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * You may obtain a copy of the License at 7ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 8ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 10ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Unless required by applicable law or agreed to in writing, software 11ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * See the License for the specific language governing permissions and 14ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * limitations under the License. 15ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 16ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 17ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samspackage android.support.v8.renderscript; 18ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 19ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsimport android.util.Log; 20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 21ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/** 22ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Intrinsic for applying a per-channel lookup table. Each 23ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * channel of the input has an independant lookup table. The 24ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * tables are 256 entries in size and can cover the full value 25ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * range of {@link Element#U8_4}. 26ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams **/ 27ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murraypublic class ScriptIntrinsicLUT extends ScriptIntrinsic { 28ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private final Matrix4f mMatrix = new Matrix4f(); 29ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private Allocation mTables; 30ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private final byte mCache[] = new byte[1024]; 31ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private boolean mDirty = true; 32ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 33ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray protected ScriptIntrinsicLUT(int id, RenderScript rs) { 34ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams super(id, rs); 35ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 36ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 37ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 38ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Supported elements types are {@link Element#U8_4} 39ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 40ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * The defaults tables are identity. 41ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 427d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * @param rs The RenderScript context 43ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param e Element type for intputs and outputs 44ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 45ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return ScriptIntrinsicLUT 46ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 47ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public static ScriptIntrinsicLUT create(RenderScript rs, Element e) { 48ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (rs.isNative) { 49ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray RenderScriptThunker rst = (RenderScriptThunker) rs; 50ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return ScriptIntrinsicLUTThunker.create(rs, e); 51ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 52ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 53ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int id = rs.nScriptIntrinsicCreate(3, e.getID(rs)); 54ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 55ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray ScriptIntrinsicLUT si = new ScriptIntrinsicLUT(id, rs); 56ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray si.mTables = Allocation.createSized(rs, Element.U8(rs), 1024); 57ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray for (int ct=0; ct < 256; ct++) { 58ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray si.mCache[ct] = (byte)ct; 59ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray si.mCache[ct + 256] = (byte)ct; 60ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray si.mCache[ct + 512] = (byte)ct; 61ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray si.mCache[ct + 768] = (byte)ct; 62ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 63ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray si.setVar(0, si.mTables); 64ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return si; 65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private void validate(int index, int value) { 69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (index < 0 || index > 255) { 70ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSIllegalArgumentException("Index out of range (0-255)."); 71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (value < 0 || value > 255) { 73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSIllegalArgumentException("Value out of range (0-255)."); 74ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 75ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 76ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 77ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 78ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set an entry in the red channel lookup table 79ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 80ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param index Must be 0-255 81ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param value Must be 0-255 82ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 83ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setRed(int index, int value) { 84ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams validate(index, value); 85ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mCache[index] = (byte)value; 86ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mDirty = true; 87ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 88ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 89ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 90ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set an entry in the green channel lookup table 91ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 92ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param index Must be 0-255 93ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param value Must be 0-255 94ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 95ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setGreen(int index, int value) { 96ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams validate(index, value); 97ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mCache[index+256] = (byte)value; 98ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mDirty = true; 99ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 100ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 101ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 102ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set an entry in the blue channel lookup table 103ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 104ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param index Must be 0-255 105ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param value Must be 0-255 106ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 107ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setBlue(int index, int value) { 108ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams validate(index, value); 109ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mCache[index+512] = (byte)value; 110ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mDirty = true; 111ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 112ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 113ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 114ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set an entry in the alpha channel lookup table 115ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 116ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param index Must be 0-255 117ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param value Must be 0-255 118ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 119ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setAlpha(int index, int value) { 120ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams validate(index, value); 121ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mCache[index+768] = (byte)value; 122ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mDirty = true; 123ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 124ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 125ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 126ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 127ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Invoke the kernel and apply the lookup to each cell of ain 128ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * and copy to aout. 129ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 130ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param ain Input allocation 131ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param aout Output allocation 132ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 133ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void forEach(Allocation ain, Allocation aout) { 134ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (mDirty) { 135ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mDirty = false; 136ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mTables.copyFromUnchecked(mCache); 137ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 138ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams forEach(0, ain, aout, null); 139ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 140ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 141ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 142ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Get a KernelID for this intrinsic kernel. 143ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 144ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return Script.KernelID The KernelID object. 145ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 146ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public Script.KernelID getKernelID() { 147ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return createKernelID(0, 3, null, null); 148ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 149ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams} 150ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 151