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