1ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray/* 2ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Copyright (C) 2013 The Android Open Source Project 3ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * 4ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Licensed under the Apache License, Version 2.0 (the "License"); 5ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * you may not use this file except in compliance with the License. 6ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * You may obtain a copy of the License at 7ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * 8ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * http://www.apache.org/licenses/LICENSE-2.0 9ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * 10ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Unless required by applicable law or agreed to in writing, software 11ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * distributed under the License is distributed on an "AS IS" BASIS, 12ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * See the License for the specific language governing permissions and 14ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * limitations under the License. 15ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray */ 16ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 17ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murraypackage android.support.v8.renderscript; 18ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 19ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.content.Context; 20ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.content.res.Resources; 21ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.util.Log; 22ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.os.Bundle; 23ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 24ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport java.io.IOException; 25ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport java.io.InputStream; 26ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 27ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.graphics.Bitmap; 28ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.graphics.BitmapFactory; 29ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 30ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray/** 31ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * 32ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray **/ 33ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayclass SamplerThunker extends Sampler { 34ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray android.renderscript.Sampler mN; 35ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 36ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray protected SamplerThunker(int id, RenderScript rs) { 37ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray super(id, rs); 38ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 39ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 40ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray android.renderscript.BaseObj getNObj() { 41ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return mN; 42ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 43ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 44ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray static android.renderscript.Sampler.Value convertValue (Value v) { 45ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray switch (v) { 46ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray case NEAREST: 47ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return android.renderscript.Sampler.Value.NEAREST; 48ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray case LINEAR: 49ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return android.renderscript.Sampler.Value.LINEAR; 50ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray case LINEAR_MIP_LINEAR: 51ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return android.renderscript.Sampler.Value.LINEAR_MIP_LINEAR; 52ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray case LINEAR_MIP_NEAREST: 53ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return android.renderscript.Sampler.Value.LINEAR_MIP_NEAREST; 54ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray case WRAP: 55ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return android.renderscript.Sampler.Value.WRAP; 56ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray case CLAMP: 57ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return android.renderscript.Sampler.Value.CLAMP; 58ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray case MIRRORED_REPEAT: 59ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return android.renderscript.Sampler.Value.MIRRORED_REPEAT; 60ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 61ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return null; 62ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 63ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 64ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray /** 65ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Builder for creating non-standard samplers. Useful if mix and match of 66ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * wrap modes is necesary or if anisotropic filtering is desired. 67ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * 68ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray */ 69ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public static class Builder { 70ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray RenderScriptThunker mRS; 71ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray Value mMin; 72ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray Value mMag; 73ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray Value mWrapS; 74ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray Value mWrapT; 75ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray Value mWrapR; 76ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray float mAniso; 77ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 78ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public Builder(RenderScriptThunker rs) { 79ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mRS = rs; 80ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mMin = Value.NEAREST; 81ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mMag = Value.NEAREST; 82ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mWrapS = Value.WRAP; 83ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mWrapT = Value.WRAP; 84ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mWrapR = Value.WRAP; 85ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 86ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 87ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public void setMinification(Value v) { 88ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (v == Value.NEAREST || 89ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray v == Value.LINEAR || 90ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray v == Value.LINEAR_MIP_LINEAR || 91ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray v == Value.LINEAR_MIP_NEAREST) { 92ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mMin = v; 93ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } else { 94ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray throw new IllegalArgumentException("Invalid value"); 95ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 96ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 97ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 98ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public void setMagnification(Value v) { 99ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (v == Value.NEAREST || v == Value.LINEAR) { 100ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mMag = v; 101ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } else { 102ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray throw new IllegalArgumentException("Invalid value"); 103ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 104ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 105ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 106ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public void setWrapS(Value v) { 107ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) { 108ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mWrapS = v; 109ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } else { 110ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray throw new IllegalArgumentException("Invalid value"); 111ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 112ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 113ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 114ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public void setWrapT(Value v) { 115ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) { 116ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mWrapT = v; 117ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } else { 118ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray throw new IllegalArgumentException("Invalid value"); 119ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 120ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 121ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 122ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public void setAnisotropy(float v) { 123ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if(v >= 0.0f) { 124ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mAniso = v; 125ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } else { 126ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray throw new IllegalArgumentException("Invalid value"); 127ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 128ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 129ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 130ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray public Sampler create() { 131ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray mRS.validate(); 132d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray try { 133d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray android.renderscript.Sampler.Builder b = new android.renderscript.Sampler.Builder(mRS.mN); 134d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray b.setMinification(convertValue(mMin)); 135d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray b.setMagnification(convertValue(mMag)); 136d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray b.setWrapS(convertValue(mWrapS)); 137d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray b.setWrapT(convertValue(mWrapT)); 138d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray b.setAnisotropy(mAniso); 139d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray android.renderscript.Sampler s = b.create(); 140d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray 141d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray SamplerThunker sampler = new SamplerThunker(0, mRS); 142d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray sampler.mMin = mMin; 143d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray sampler.mMag = mMag; 144d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray sampler.mWrapS = mWrapS; 145d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray sampler.mWrapT = mWrapT; 146d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray sampler.mWrapR = mWrapR; 147d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray sampler.mAniso = mAniso; 148d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray sampler.mN = s; 149d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray 150d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray return sampler; 151d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray } catch (android.renderscript.RSRuntimeException e) { 152d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray throw ExceptionThunker.convertException(e); 153d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray } 154ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 155ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 156ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 157ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 158ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray}