13a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams/* 23a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Copyright (C) 2012 The Android Open Source Project 33a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 43a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 53a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * you may not use this file except in compliance with the License. 63a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * You may obtain a copy of the License at 73a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 83a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 93a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 103a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Unless required by applicable law or agreed to in writing, software 113a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 123a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * See the License for the specific language governing permissions and 143a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * limitations under the License. 153a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 163a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 173a5b8011765906c15b5474b2bc43d80f6746cb45Jason Samspackage android.renderscript; 183a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 193a5b8011765906c15b5474b2bc43d80f6746cb45Jason Samsimport android.util.Log; 203a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 213a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams/** 2280d819033d4687507907f787d47379b7b37eae19Jason Sams * Intrinsic for applying a per-channel lookup table. Each 2380d819033d4687507907f787d47379b7b37eae19Jason Sams * channel of the input has an independant lookup table. The 2480d819033d4687507907f787d47379b7b37eae19Jason Sams * tables are 256 entries in size and can cover the full value 2580d819033d4687507907f787d47379b7b37eae19Jason Sams * range of {@link Element#U8_4}. 263a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams **/ 2780d819033d4687507907f787d47379b7b37eae19Jason Samspublic final class ScriptIntrinsicLUT extends ScriptIntrinsic { 2880d819033d4687507907f787d47379b7b37eae19Jason Sams private final Matrix4f mMatrix = new Matrix4f(); 293a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private Allocation mTables; 3080d819033d4687507907f787d47379b7b37eae19Jason Sams private final byte mCache[] = new byte[1024]; 313a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private boolean mDirty = true; 323a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 3380d819033d4687507907f787d47379b7b37eae19Jason Sams private ScriptIntrinsicLUT(int id, RenderScript rs) { 343a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams super(id, rs); 353a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mTables = Allocation.createSized(rs, Element.U8(rs), 1024); 363a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams for (int ct=0; ct < 256; ct++) { 373a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct] = (byte)ct; 383a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct + 256] = (byte)ct; 393a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct + 512] = (byte)ct; 403a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct + 768] = (byte)ct; 413a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 425b4f8f90fd9bb05ea3d8e57ce5217054c5b3406fStephen Hines setVar(0, mTables); 433a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 443a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 453a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams /** 4680d819033d4687507907f787d47379b7b37eae19Jason Sams * Supported elements types are {@link Element#U8_4} 4780d819033d4687507907f787d47379b7b37eae19Jason Sams * 4880d819033d4687507907f787d47379b7b37eae19Jason Sams * The defaults tables are identity. 493a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 50c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * @param rs The RenderScript context 5180d819033d4687507907f787d47379b7b37eae19Jason Sams * @param e Element type for intputs and outputs 523a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 5380d819033d4687507907f787d47379b7b37eae19Jason Sams * @return ScriptIntrinsicLUT 543a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 553a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public static ScriptIntrinsicLUT create(RenderScript rs, Element e) { 563a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams int id = rs.nScriptIntrinsicCreate(3, e.getID(rs)); 573a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams return new ScriptIntrinsicLUT(id, rs); 583a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 593a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 603a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 613a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 623a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private void validate(int index, int value) { 633a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams if (index < 0 || index > 255) { 643a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams throw new RSIllegalArgumentException("Index out of range (0-255)."); 653a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 663a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams if (value < 0 || value > 255) { 673a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams throw new RSIllegalArgumentException("Value out of range (0-255)."); 683a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 693a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 703a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 7180d819033d4687507907f787d47379b7b37eae19Jason Sams /** 7280d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the red channel lookup table 7380d819033d4687507907f787d47379b7b37eae19Jason Sams * 7480d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 7580d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 7680d819033d4687507907f787d47379b7b37eae19Jason Sams */ 773a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setRed(int index, int value) { 783a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 793a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index] = (byte)value; 803a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 813a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 823a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 8380d819033d4687507907f787d47379b7b37eae19Jason Sams /** 8480d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the green channel lookup table 8580d819033d4687507907f787d47379b7b37eae19Jason Sams * 8680d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 8780d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 8880d819033d4687507907f787d47379b7b37eae19Jason Sams */ 893a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setGreen(int index, int value) { 903a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 913a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+256] = (byte)value; 923a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 933a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 943a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 9580d819033d4687507907f787d47379b7b37eae19Jason Sams /** 9680d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the blue channel lookup table 9780d819033d4687507907f787d47379b7b37eae19Jason Sams * 9880d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 9980d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 10080d819033d4687507907f787d47379b7b37eae19Jason Sams */ 1013a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setBlue(int index, int value) { 1023a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 1033a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+512] = (byte)value; 1043a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 1053a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1063a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 10780d819033d4687507907f787d47379b7b37eae19Jason Sams /** 10880d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the alpha channel lookup table 10980d819033d4687507907f787d47379b7b37eae19Jason Sams * 11080d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 11180d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 11280d819033d4687507907f787d47379b7b37eae19Jason Sams */ 1133a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setAlpha(int index, int value) { 1143a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 1153a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+768] = (byte)value; 1163a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 1173a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1183a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 1193a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 1203a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams /** 12180d819033d4687507907f787d47379b7b37eae19Jason Sams * Invoke the kernel and apply the lookup to each cell of ain 12280d819033d4687507907f787d47379b7b37eae19Jason Sams * and copy to aout. 1233a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 1243a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param ain Input allocation 1253a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param aout Output allocation 1263a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 1273a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void forEach(Allocation ain, Allocation aout) { 1283a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams if (mDirty) { 1293a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = false; 1303a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mTables.copyFromUnchecked(mCache); 1313a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1323a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams forEach(0, ain, aout, null); 1333a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1343a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 13508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams /** 13608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * Get a KernelID for this intrinsic kernel. 13708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * 13808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * @return Script.KernelID The KernelID object. 13908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams */ 14008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams public Script.KernelID getKernelID() { 14108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams return createKernelID(0, 3, null, null); 14208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams } 1433a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams} 1443a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 145