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}