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 Sams/** 2080d819033d4687507907f787d47379b7b37eae19Jason Sams * Intrinsic for applying a per-channel lookup table. Each 2180d819033d4687507907f787d47379b7b37eae19Jason Sams * channel of the input has an independant lookup table. The 2280d819033d4687507907f787d47379b7b37eae19Jason Sams * tables are 256 entries in size and can cover the full value 2380d819033d4687507907f787d47379b7b37eae19Jason Sams * range of {@link Element#U8_4}. 243a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams **/ 2580d819033d4687507907f787d47379b7b37eae19Jason Samspublic final class ScriptIntrinsicLUT extends ScriptIntrinsic { 2680d819033d4687507907f787d47379b7b37eae19Jason Sams private final Matrix4f mMatrix = new Matrix4f(); 273a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private Allocation mTables; 2880d819033d4687507907f787d47379b7b37eae19Jason Sams private final byte mCache[] = new byte[1024]; 293a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private boolean mDirty = true; 303a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 31460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray private ScriptIntrinsicLUT(long id, RenderScript rs) { 323a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams super(id, rs); 333a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mTables = Allocation.createSized(rs, Element.U8(rs), 1024); 343a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams for (int ct=0; ct < 256; ct++) { 353a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct] = (byte)ct; 363a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct + 256] = (byte)ct; 373a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct + 512] = (byte)ct; 383a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[ct + 768] = (byte)ct; 393a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 405b4f8f90fd9bb05ea3d8e57ce5217054c5b3406fStephen Hines setVar(0, mTables); 413a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 423a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 433a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams /** 4480d819033d4687507907f787d47379b7b37eae19Jason Sams * Supported elements types are {@link Element#U8_4} 4580d819033d4687507907f787d47379b7b37eae19Jason Sams * 4680d819033d4687507907f787d47379b7b37eae19Jason Sams * The defaults tables are identity. 473a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 48c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * @param rs The RenderScript context 4980d819033d4687507907f787d47379b7b37eae19Jason Sams * @param e Element type for intputs and outputs 503a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 5180d819033d4687507907f787d47379b7b37eae19Jason Sams * @return ScriptIntrinsicLUT 523a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 533a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public static ScriptIntrinsicLUT create(RenderScript rs, Element e) { 54460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long id = rs.nScriptIntrinsicCreate(3, e.getID(rs)); 553a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams return new ScriptIntrinsicLUT(id, rs); 563a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 573a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 583a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 593a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 603a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private void validate(int index, int value) { 613a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams if (index < 0 || index > 255) { 623a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams throw new RSIllegalArgumentException("Index out of range (0-255)."); 633a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 643a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams if (value < 0 || value > 255) { 653a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams throw new RSIllegalArgumentException("Value out of range (0-255)."); 663a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 673a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 683a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 6980d819033d4687507907f787d47379b7b37eae19Jason Sams /** 7080d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the red channel lookup table 7180d819033d4687507907f787d47379b7b37eae19Jason Sams * 7280d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 7380d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 7480d819033d4687507907f787d47379b7b37eae19Jason Sams */ 753a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setRed(int index, int value) { 763a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 773a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index] = (byte)value; 783a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 793a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 803a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 8180d819033d4687507907f787d47379b7b37eae19Jason Sams /** 8280d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the green channel lookup table 8380d819033d4687507907f787d47379b7b37eae19Jason Sams * 8480d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 8580d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 8680d819033d4687507907f787d47379b7b37eae19Jason Sams */ 873a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setGreen(int index, int value) { 883a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 893a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+256] = (byte)value; 903a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 913a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 923a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 9380d819033d4687507907f787d47379b7b37eae19Jason Sams /** 9480d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the blue channel lookup table 9580d819033d4687507907f787d47379b7b37eae19Jason Sams * 9680d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 9780d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 9880d819033d4687507907f787d47379b7b37eae19Jason Sams */ 993a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setBlue(int index, int value) { 1003a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 1013a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+512] = (byte)value; 1023a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 1033a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1043a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 10580d819033d4687507907f787d47379b7b37eae19Jason Sams /** 10680d819033d4687507907f787d47379b7b37eae19Jason Sams * Set an entry in the alpha channel lookup table 10780d819033d4687507907f787d47379b7b37eae19Jason Sams * 10880d819033d4687507907f787d47379b7b37eae19Jason Sams * @param index Must be 0-255 10980d819033d4687507907f787d47379b7b37eae19Jason Sams * @param value Must be 0-255 11080d819033d4687507907f787d47379b7b37eae19Jason Sams */ 1113a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setAlpha(int index, int value) { 1123a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 1133a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+768] = (byte)value; 1143a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 1153a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1163a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 1173a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams /** 11880d819033d4687507907f787d47379b7b37eae19Jason Sams * Invoke the kernel and apply the lookup to each cell of ain 11980d819033d4687507907f787d47379b7b37eae19Jason Sams * and copy to aout. 1203a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 1213a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param ain Input allocation 1223a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param aout Output allocation 1233a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 1243a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void forEach(Allocation ain, Allocation aout) { 1256f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray forEach(ain, aout, null); 1266f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray } 1276f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray 1286f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray /** 1296f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * Invoke the kernel and apply the lookup to each cell of ain 1306f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * and copy to aout. 1316f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * 1326f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * @param ain Input allocation 1336f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * @param aout Output allocation 1346f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * @param opt Options for clipping 1356f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray */ 1366f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray public void forEach(Allocation ain, Allocation aout, Script.LaunchOptions opt) { 1373a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams if (mDirty) { 1383a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = false; 1393a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mTables.copyFromUnchecked(mCache); 1403a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1416f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray forEach(0, ain, aout, null, opt); 1423a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1433a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 14408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams /** 14508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * Get a KernelID for this intrinsic kernel. 14608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * 14708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * @return Script.KernelID The KernelID object. 14808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams */ 14908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams public Script.KernelID getKernelID() { 15008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams return createKernelID(0, 3, null, null); 15108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams } 1523a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams} 1533a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 154