ScriptIntrinsicLUT.java revision 3a5b8011765906c15b5474b2bc43d80f6746cb45
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.content.Context; 203a5b8011765906c15b5474b2bc43d80f6746cb45Jason Samsimport android.content.res.Resources; 213a5b8011765906c15b5474b2bc43d80f6746cb45Jason Samsimport android.util.Log; 223a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 233a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 243a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams/** 253a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @hide 263a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams **/ 273a5b8011765906c15b5474b2bc43d80f6746cb45Jason Samspublic class ScriptIntrinsicLUT extends ScriptIntrinsic { 283a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private Matrix4f mMatrix = new Matrix4f(); 293a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private Allocation mTables; 303a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private byte mCache[] = new byte[1024]; 313a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private boolean mDirty = true; 323a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 333a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 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 } 423a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams bindAllocation(mTables, 0); 433a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 443a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 453a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams /** 463a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Supported elements types are uchar4 473a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 483a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param rs 493a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param e 503a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 513a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @return ScriptIntrinsicColorMatrix 523a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 533a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public static ScriptIntrinsicLUT create(RenderScript rs, Element e) { 543a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams int 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 693a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setRed(int index, int value) { 703a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 713a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index] = (byte)value; 723a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 733a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 743a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 753a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setGreen(int index, int value) { 763a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 773a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+256] = (byte)value; 783a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 793a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 803a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 813a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setBlue(int index, int value) { 823a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 833a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+512] = (byte)value; 843a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 853a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 863a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 873a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setAlpha(int index, int value) { 883a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams validate(index, value); 893a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mCache[index+768] = (byte)value; 903a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = true; 913a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 923a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 933a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 943a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams /** 953a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Invoke the kernel and apply the matrix to each cell of ain and copy to 963a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * aout. 973a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 983a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param ain Input allocation 993a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @param aout Output allocation 1003a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 1013a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void forEach(Allocation ain, Allocation aout) { 1023a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams if (mDirty) { 1033a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mDirty = false; 1043a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mTables.copyFromUnchecked(mCache); 1053a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1063a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams forEach(0, ain, aout, null); 1073a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1083a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 1093a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams} 1103a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 111