10835d42be9b215f845e30db03211c86670cfa12aJason Sams/*
20835d42be9b215f845e30db03211c86670cfa12aJason Sams * Copyright (C) 2008 The Android Open Source Project
30835d42be9b215f845e30db03211c86670cfa12aJason Sams *
40835d42be9b215f845e30db03211c86670cfa12aJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
50835d42be9b215f845e30db03211c86670cfa12aJason Sams * you may not use this file except in compliance with the License.
60835d42be9b215f845e30db03211c86670cfa12aJason Sams * You may obtain a copy of the License at
70835d42be9b215f845e30db03211c86670cfa12aJason Sams *
80835d42be9b215f845e30db03211c86670cfa12aJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
90835d42be9b215f845e30db03211c86670cfa12aJason Sams *
100835d42be9b215f845e30db03211c86670cfa12aJason Sams * Unless required by applicable law or agreed to in writing, software
110835d42be9b215f845e30db03211c86670cfa12aJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
120835d42be9b215f845e30db03211c86670cfa12aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130835d42be9b215f845e30db03211c86670cfa12aJason Sams * See the License for the specific language governing permissions and
140835d42be9b215f845e30db03211c86670cfa12aJason Sams * limitations under the License.
150835d42be9b215f845e30db03211c86670cfa12aJason Sams */
160835d42be9b215f845e30db03211c86670cfa12aJason Sams
170835d42be9b215f845e30db03211c86670cfa12aJason Samspackage android.renderscript;
180835d42be9b215f845e30db03211c86670cfa12aJason Sams
190835d42be9b215f845e30db03211c86670cfa12aJason Sams
200835d42be9b215f845e30db03211c86670cfa12aJason Samsimport java.io.IOException;
210835d42be9b215f845e30db03211c86670cfa12aJason Samsimport java.io.InputStream;
220835d42be9b215f845e30db03211c86670cfa12aJason Sams
230835d42be9b215f845e30db03211c86670cfa12aJason Samsimport android.content.res.Resources;
240835d42be9b215f845e30db03211c86670cfa12aJason Samsimport android.os.Bundle;
250835d42be9b215f845e30db03211c86670cfa12aJason Samsimport android.util.Log;
260835d42be9b215f845e30db03211c86670cfa12aJason Sams
270835d42be9b215f845e30db03211c86670cfa12aJason Samsimport android.graphics.Bitmap;
280835d42be9b215f845e30db03211c86670cfa12aJason Samsimport android.graphics.BitmapFactory;
290835d42be9b215f845e30db03211c86670cfa12aJason Sams
309c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/**
3111518acc8c416023d8c2192b441a1767205676d9Robert Ly * Sampler object which defines how data is extracted from textures. Samplers
3211518acc8c416023d8c2192b441a1767205676d9Robert Ly * are attached to Program objects (currently only ProgramFragment) when those objects
33bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams * need to access texture data.
340835d42be9b215f845e30db03211c86670cfa12aJason Sams **/
350835d42be9b215f845e30db03211c86670cfa12aJason Samspublic class Sampler extends BaseObj {
360835d42be9b215f845e30db03211c86670cfa12aJason Sams    public enum Value {
370835d42be9b215f845e30db03211c86670cfa12aJason Sams        NEAREST (0),
380835d42be9b215f845e30db03211c86670cfa12aJason Sams        LINEAR (1),
390835d42be9b215f845e30db03211c86670cfa12aJason Sams        LINEAR_MIP_LINEAR (2),
400857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk        LINEAR_MIP_NEAREST (5),
410835d42be9b215f845e30db03211c86670cfa12aJason Sams        WRAP (3),
420835d42be9b215f845e30db03211c86670cfa12aJason Sams        CLAMP (4);
430835d42be9b215f845e30db03211c86670cfa12aJason Sams
440835d42be9b215f845e30db03211c86670cfa12aJason Sams        int mID;
450835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value(int id) {
460835d42be9b215f845e30db03211c86670cfa12aJason Sams            mID = id;
470835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
480835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
490835d42be9b215f845e30db03211c86670cfa12aJason Sams
507d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mMin;
517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mMag;
527d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapS;
537d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapT;
547d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapR;
557d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    float mAniso;
567d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
570835d42be9b215f845e30db03211c86670cfa12aJason Sams    Sampler(int id, RenderScript rs) {
580de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
590835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
600835d42be9b215f845e30db03211c86670cfa12aJason Sams
619c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
627d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return minification setting for the sampler
637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
647d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMinification() {
657d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMin;
667d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
677d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
689c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return magnification setting for the sampler
707d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
717d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMagnification() {
727d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMag;
737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
759c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return S wrapping mode for the sampler
777d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
787d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapS() {
797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapS;
807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
817d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
829c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
837d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return T wrapping mode for the sampler
847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
857d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapT() {
867d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapT;
877d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
887d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
899c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
907d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return anisotropy setting for the sampler
917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
927d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public float getAnisotropy() {
937d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mAniso;
947d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
957d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
969c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
97bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
98bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
99bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
100f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
101bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
102bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
103bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_NEAREST(RenderScript rs) {
1054d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_NEAREST == null) {
1064d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
107b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.NEAREST);
108b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.NEAREST);
1094d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_NEAREST = b.create();
1124d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1134d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_NEAREST;
1144d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1154d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1169c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
117bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to linear and wrap modes set to
118bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
119bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
120f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
121bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
122bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
123bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1244d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR(RenderScript rs) {
1254d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_LINEAR == null) {
1264d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
127b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR);
128b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1294d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1304d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1314d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_LINEAR = b.create();
1324d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1334d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR;
1344d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1354d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1369c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
137bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with ag set to linear, min linear mipmap linear, and
138bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * to and wrap modes set to clamp.
139bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
140f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
141bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
142bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
143bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1444d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR_MIP_LINEAR(RenderScript rs) {
1454d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
1464d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
147b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR_MIP_LINEAR);
148b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1494d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1504d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1514d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
1524d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1534d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR_MIP_LINEAR;
1544d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1554d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1569c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
157bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
158bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
159bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
160f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
161bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
162bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
163bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1644d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_NEAREST(RenderScript rs) {
1654d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_NEAREST == null) {
1664d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
167b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.NEAREST);
168b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.NEAREST);
1694d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
1704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
1714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_NEAREST = b.create();
1724d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1734d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_NEAREST;
1744d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1754d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1769c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
177bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
178bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
179bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
180f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
181bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
182bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
183bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1844d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR(RenderScript rs) {
1854d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_LINEAR == null) {
1864d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
187b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR);
188b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1894d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
1904d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
1914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_LINEAR = b.create();
1924d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1934d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR;
1944d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1954d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1969c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
197bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with ag set to linear, min linear mipmap linear, and
198bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * to and wrap modes set to wrap.
199bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
200f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
201bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
202bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
203bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
2044d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR_MIP_LINEAR(RenderScript rs) {
2054d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
2064d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
207b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR_MIP_LINEAR);
208b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
2094d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
2104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
2114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
2124d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
2134d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR_MIP_LINEAR;
2144d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
2154d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2164d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2179c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
218bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Builder for creating non-standard samplers.  Usefull if mix and match of
219bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap modes is necesary or if anisotropic filtering is desired.
220bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
221bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
2220835d42be9b215f845e30db03211c86670cfa12aJason Sams    public static class Builder {
2230835d42be9b215f845e30db03211c86670cfa12aJason Sams        RenderScript mRS;
2240835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMin;
2250835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMag;
2260835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapS;
2270835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapT;
2280835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapR;
229f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        float mAniso;
2300835d42be9b215f845e30db03211c86670cfa12aJason Sams
2310835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Builder(RenderScript rs) {
2320835d42be9b215f845e30db03211c86670cfa12aJason Sams            mRS = rs;
2330835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMin = Value.NEAREST;
2340835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMag = Value.NEAREST;
2350835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapS = Value.WRAP;
2360835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapT = Value.WRAP;
2370835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapR = Value.WRAP;
238f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            mAniso = 1.0f;
2390835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2400835d42be9b215f845e30db03211c86670cfa12aJason Sams
241b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMinification(Value v) {
2428bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST ||
2438bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                v == Value.LINEAR ||
2440857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_LINEAR ||
2450857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_NEAREST) {
2468bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMin = v;
2478bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2488bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2498bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2500835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2510835d42be9b215f845e30db03211c86670cfa12aJason Sams
252b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMagnification(Value v) {
2538bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST || v == Value.LINEAR) {
2548bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMag = v;
2558bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2568bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2578bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2580835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2590835d42be9b215f845e30db03211c86670cfa12aJason Sams
2600835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapS(Value v) {
2618bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.WRAP || v == Value.CLAMP) {
2628bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapS = v;
2638bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2648bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2658bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2660835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2670835d42be9b215f845e30db03211c86670cfa12aJason Sams
2680835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapT(Value v) {
2698bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.WRAP || v == Value.CLAMP) {
2708bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapT = v;
2718bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2728bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2738bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2740835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2750835d42be9b215f845e30db03211c86670cfa12aJason Sams
276f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        public void setAnisotropy(float v) {
277f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            if(v >= 0.0f) {
278f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                mAniso = v;
279f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            } else {
280f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                throw new IllegalArgumentException("Invalid value");
281f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            }
282f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        }
283f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk
2840835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Sampler create() {
285771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
286918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk            int id = mRS.nSamplerCreate(mMag.mID, mMin.mID,
2877d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                                        mWrapS.mID, mWrapT.mID, mWrapR.mID, mAniso);
2887d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            Sampler sampler = new Sampler(id, mRS);
2897d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMin = mMin;
2907d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMag = mMag;
2917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapS = mWrapS;
2927d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapT = mWrapT;
2937d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapR = mWrapR;
2947d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mAniso = mAniso;
2957d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            return sampler;
2960835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2970835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
2980835d42be9b215f845e30db03211c86670cfa12aJason Sams
2990835d42be9b215f845e30db03211c86670cfa12aJason Sams}
3000835d42be9b215f845e30db03211c86670cfa12aJason Sams
301