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
300835d42be9b215f845e30db03211c86670cfa12aJason Sams/**
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
61bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    /**
627d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @hide
637d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return minification setting for the sampler
647d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
657d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMinification() {
667d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMin;
677d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    /**
707d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @hide
717d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return magnification setting for the sampler
727d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMagnification() {
747d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMag;
757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
777d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    /**
787d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @hide
797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return S wrapping mode for the sampler
807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
817d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapS() {
827d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapS;
837d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
857d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    /**
867d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @hide
877d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return T wrapping mode for the sampler
887d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
897d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapT() {
907d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapT;
917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
927d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
937d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    /**
947d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @hide
957d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return anisotropy setting for the sampler
967d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
977d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public float getAnisotropy() {
987d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mAniso;
997d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
1007d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
1017d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    /**
102bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
103bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
104bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
105f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
106bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
107bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
108bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1094d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_NEAREST(RenderScript rs) {
1104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_NEAREST == null) {
1114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
112b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.NEAREST);
113b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.NEAREST);
1144d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1154d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1164d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_NEAREST = b.create();
1174d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1184d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_NEAREST;
1194d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1204d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
121bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    /**
122bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to linear and wrap modes set to
123bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
124bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
125f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
126bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
127bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
128bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1294d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR(RenderScript rs) {
1304d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_LINEAR == null) {
1314d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
132b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR);
133b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1344d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1354d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1364d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_LINEAR = b.create();
1374d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1384d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR;
1394d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1404d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
141bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    /**
142bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with ag set to linear, min linear mipmap linear, and
143bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * to and wrap modes set to clamp.
144bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
145f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
146bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
147bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
148bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1494d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR_MIP_LINEAR(RenderScript rs) {
1504d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
1514d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
152b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR_MIP_LINEAR);
153b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1544d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1554d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1564d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
1574d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1584d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR_MIP_LINEAR;
1594d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1604d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
161bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    /**
162bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
163bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
164bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
165f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
166bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
167bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
168bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1694d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_NEAREST(RenderScript rs) {
1704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_NEAREST == null) {
1714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
172b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.NEAREST);
173b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.NEAREST);
1744d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
1754d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
1764d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_NEAREST = b.create();
1774d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1784d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_NEAREST;
1794d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1804d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
181bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    /**
182bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
183bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
184bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
185f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
186bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
187bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
188bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1894d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR(RenderScript rs) {
1904d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_LINEAR == null) {
1914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
192b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR);
193b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1944d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
1954d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
1964d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_LINEAR = b.create();
1974d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1984d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR;
1994d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
2004d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
201bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    /**
202bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with ag set to linear, min linear mipmap linear, and
203bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * to and wrap modes set to wrap.
204bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
205f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
206bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
207bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
208bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
2094d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR_MIP_LINEAR(RenderScript rs) {
2104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
2114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
212b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR_MIP_LINEAR);
213b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
2144d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
2154d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
2164d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
2174d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
2184d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR_MIP_LINEAR;
2194d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
2204d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2214d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
222bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams    /**
223bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Builder for creating non-standard samplers.  Usefull if mix and match of
224bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap modes is necesary or if anisotropic filtering is desired.
225bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
226bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
2270835d42be9b215f845e30db03211c86670cfa12aJason Sams    public static class Builder {
2280835d42be9b215f845e30db03211c86670cfa12aJason Sams        RenderScript mRS;
2290835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMin;
2300835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMag;
2310835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapS;
2320835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapT;
2330835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapR;
234f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        float mAniso;
2350835d42be9b215f845e30db03211c86670cfa12aJason Sams
2360835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Builder(RenderScript rs) {
2370835d42be9b215f845e30db03211c86670cfa12aJason Sams            mRS = rs;
2380835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMin = Value.NEAREST;
2390835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMag = Value.NEAREST;
2400835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapS = Value.WRAP;
2410835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapT = Value.WRAP;
2420835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapR = Value.WRAP;
243f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            mAniso = 1.0f;
2440835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2450835d42be9b215f845e30db03211c86670cfa12aJason Sams
246b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMinification(Value v) {
2478bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST ||
2488bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                v == Value.LINEAR ||
2490857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_LINEAR ||
2500857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_NEAREST) {
2518bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMin = v;
2528bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2538bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2548bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2550835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2560835d42be9b215f845e30db03211c86670cfa12aJason Sams
257b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMagnification(Value v) {
2588bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST || v == Value.LINEAR) {
2598bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMag = v;
2608bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2618bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2628bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2630835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2640835d42be9b215f845e30db03211c86670cfa12aJason Sams
2650835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapS(Value v) {
2668bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.WRAP || v == Value.CLAMP) {
2678bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapS = v;
2688bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2698bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2708bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2710835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2720835d42be9b215f845e30db03211c86670cfa12aJason Sams
2730835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapT(Value v) {
2748bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.WRAP || v == Value.CLAMP) {
2758bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapT = v;
2768bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
2778bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
2788bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
2790835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
2800835d42be9b215f845e30db03211c86670cfa12aJason Sams
281f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        public void setAnisotropy(float v) {
282f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            if(v >= 0.0f) {
283f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                mAniso = v;
284f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            } else {
285f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                throw new IllegalArgumentException("Invalid value");
286f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            }
287f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        }
288f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk
2890835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Sampler create() {
290771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
2917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            int id = mRS.nSamplerCreate(mMag.mID, mMin.mID,
2927d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                                        mWrapS.mID, mWrapT.mID, mWrapR.mID, mAniso);
2937d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            Sampler sampler = new Sampler(id, mRS);
2947d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMin = mMin;
2957d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMag = mMag;
2967d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapS = mWrapS;
2977d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapT = mWrapT;
2987d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapR = mWrapR;
2997d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mAniso = mAniso;
3007d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            return sampler;
3010835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3020835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
3030835d42be9b215f845e30db03211c86670cfa12aJason Sams
3040835d42be9b215f845e30db03211c86670cfa12aJason Sams}
3050835d42be9b215f845e30db03211c86670cfa12aJason Sams
306