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/**
31c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Sampler object that defines how Allocations can be read as textures within a
32c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * kernel. Samplers are used in conjunction with the {@code rsSample} runtime
33c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * function to return values from normalized coordinates.
34c11e25c4e653124def1fb18e203b894f42106cbeTim Murray *
35c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * Any Allocation used with a Sampler must have been created with {@link
36c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE}; using a Sampler on
37c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * an {@link android.renderscript.Allocation} that was not created with {@link
38c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * android.renderscript.Allocation#USAGE_GRAPHICS_TEXTURE} is undefined.
390835d42be9b215f845e30db03211c86670cfa12aJason Sams **/
400835d42be9b215f845e30db03211c86670cfa12aJason Samspublic class Sampler extends BaseObj {
410835d42be9b215f845e30db03211c86670cfa12aJason Sams    public enum Value {
420835d42be9b215f845e30db03211c86670cfa12aJason Sams        NEAREST (0),
430835d42be9b215f845e30db03211c86670cfa12aJason Sams        LINEAR (1),
440835d42be9b215f845e30db03211c86670cfa12aJason Sams        LINEAR_MIP_LINEAR (2),
450857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk        LINEAR_MIP_NEAREST (5),
460835d42be9b215f845e30db03211c86670cfa12aJason Sams        WRAP (3),
476b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        CLAMP (4),
486b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        MIRRORED_REPEAT (6);
490835d42be9b215f845e30db03211c86670cfa12aJason Sams
500835d42be9b215f845e30db03211c86670cfa12aJason Sams        int mID;
510835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value(int id) {
520835d42be9b215f845e30db03211c86670cfa12aJason Sams            mID = id;
530835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
540835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
550835d42be9b215f845e30db03211c86670cfa12aJason Sams
567d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mMin;
577d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mMag;
587d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapS;
597d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapT;
607d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    Value mWrapR;
617d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    float mAniso;
627d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
630835d42be9b215f845e30db03211c86670cfa12aJason Sams    Sampler(int id, RenderScript rs) {
640de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
650835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
660835d42be9b215f845e30db03211c86670cfa12aJason Sams
679c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
687d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return minification setting for the sampler
697d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
707d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMinification() {
717d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMin;
727d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
737d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
749c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
757d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return magnification setting for the sampler
767d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
777d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getMagnification() {
787d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mMag;
797d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
807d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
819c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
827d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return S wrapping mode for the sampler
837d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
847d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapS() {
857d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapS;
867d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
877d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
889c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
897d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return T wrapping mode for the sampler
907d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
917d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public Value getWrapT() {
927d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mWrapT;
937d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
947d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
959c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
967d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     * @return anisotropy setting for the sampler
977d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk     */
987d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    public float getAnisotropy() {
997d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk        return mAniso;
1007d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk    }
1017d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk
1029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
103bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
104bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
105bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
106f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
107bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
108bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
109bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_NEAREST(RenderScript rs) {
1114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_NEAREST == null) {
1124d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
113b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.NEAREST);
114b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.NEAREST);
1154d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1164d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1174d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_NEAREST = b.create();
1184d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1194d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_NEAREST;
1204d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1214d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1229c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
123bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to linear and wrap modes set to
124bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * clamp.
125bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
126f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
127bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
128bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
129bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1304d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR(RenderScript rs) {
1314d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_LINEAR == null) {
1324d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
133b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR);
134b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1354d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1364d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1374d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_LINEAR = b.create();
1384d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1394d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR;
1404d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1414d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1429c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1436b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
1446b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * wrap modes set to clamp.
145bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
146f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
147bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
148bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
149bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1504d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler CLAMP_LINEAR_MIP_LINEAR(RenderScript rs) {
1514d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_CLAMP_LINEAR_MIP_LINEAR == null) {
1524d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
153b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR_MIP_LINEAR);
154b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1554d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.CLAMP);
1564d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.CLAMP);
1574d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_CLAMP_LINEAR_MIP_LINEAR = b.create();
1584d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1594d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_CLAMP_LINEAR_MIP_LINEAR;
1604d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1614d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1629c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
163bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
164bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
165bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
166f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
167bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
168bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
169bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1704d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_NEAREST(RenderScript rs) {
1714d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_NEAREST == null) {
1724d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
173b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.NEAREST);
174b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.NEAREST);
1754d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
1764d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
1774d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_NEAREST = b.create();
1784d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1794d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_NEAREST;
1804d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
1814d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
1829c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
1836b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to linear and wrap modes set to
184bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * wrap.
185bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
186f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
187bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
188bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
189bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
1904d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR(RenderScript rs) {
1914d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_LINEAR == null) {
1924d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
193b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR);
194b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
1954d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
1964d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
1974d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_LINEAR = b.create();
1984d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
1994d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR;
2004d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
2014d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2029c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
2036b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
2046b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * wrap modes set to wrap.
205bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
206f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk     * @param rs Context to which the sampler will belong.
207bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     *
208bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     * @return Sampler
209bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
2104d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    public static Sampler WRAP_LINEAR_MIP_LINEAR(RenderScript rs) {
2114d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        if(rs.mSampler_WRAP_LINEAR_MIP_LINEAR == null) {
2124d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            Builder b = new Builder(rs);
213b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMinification(Value.LINEAR_MIP_LINEAR);
214b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk            b.setMagnification(Value.LINEAR);
2154d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapS(Value.WRAP);
2164d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            b.setWrapT(Value.WRAP);
2174d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams            rs.mSampler_WRAP_LINEAR_MIP_LINEAR = b.create();
2184d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        }
2194d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams        return rs.mSampler_WRAP_LINEAR_MIP_LINEAR;
2204d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams    }
2214d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2226b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    /**
2236b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
2246b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * mirrored repeat.
2256b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2266b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @param rs Context to which the sampler will belong.
2276b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2286b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @return Sampler
2296b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     */
2306b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public static Sampler MIRRORED_REPEAT_NEAREST(RenderScript rs) {
2316b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        if(rs.mSampler_MIRRORED_REPEAT_NEAREST == null) {
2326b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            Builder b = new Builder(rs);
2336b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setMinification(Value.NEAREST);
2346b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setMagnification(Value.NEAREST);
2356b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setWrapS(Value.MIRRORED_REPEAT);
2366b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setWrapT(Value.MIRRORED_REPEAT);
2376b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            rs.mSampler_MIRRORED_REPEAT_NEAREST = b.create();
2386b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        }
2396b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        return rs.mSampler_MIRRORED_REPEAT_NEAREST;
2406b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    }
2416b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2426b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    /**
2436b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2446b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * mirrored repeat.
2456b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2466b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @param rs Context to which the sampler will belong.
2476b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2486b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @return Sampler
2496b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     */
2506b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public static Sampler MIRRORED_REPEAT_LINEAR(RenderScript rs) {
2516b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        if(rs.mSampler_MIRRORED_REPEAT_LINEAR == null) {
2526b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            Builder b = new Builder(rs);
2536b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setMinification(Value.LINEAR);
2546b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setMagnification(Value.LINEAR);
2556b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setWrapS(Value.MIRRORED_REPEAT);
2566b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setWrapT(Value.MIRRORED_REPEAT);
2576b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            rs.mSampler_MIRRORED_REPEAT_LINEAR = b.create();
2586b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        }
2596b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        return rs.mSampler_MIRRORED_REPEAT_LINEAR;
2606b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    }
2616b9b2caf2bf977508e223792bb5eba75091c232dTim Murray
2626b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    /**
2636b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2646b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * mirrored repeat.
2656b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2666b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @param rs Context to which the sampler will belong.
2676b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     *
2686b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     * @return Sampler
2696b9b2caf2bf977508e223792bb5eba75091c232dTim Murray     */
2706b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    public static Sampler MIRRORED_REPEAT_LINEAR_MIP_LINEAR(RenderScript rs) {
2716b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        if(rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR == null) {
2726b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            Builder b = new Builder(rs);
2736b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setMinification(Value.LINEAR_MIP_LINEAR);
2746b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setMagnification(Value.LINEAR);
2756b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setWrapS(Value.MIRRORED_REPEAT);
2766b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            b.setWrapT(Value.MIRRORED_REPEAT);
2776b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR = b.create();
2786b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        }
2796b9b2caf2bf977508e223792bb5eba75091c232dTim Murray        return rs.mSampler_MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
2806b9b2caf2bf977508e223792bb5eba75091c232dTim Murray    }
2814d3399337d18ef04116bc8a2e5799274655d0c30Jason Sams
2829c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines    /**
283c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * Builder for creating non-standard samplers.  This is only necessary if
284c11e25c4e653124def1fb18e203b894f42106cbeTim Murray     * a Sampler with different min and mag modes is desired.
285bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams     */
2860835d42be9b215f845e30db03211c86670cfa12aJason Sams    public static class Builder {
2870835d42be9b215f845e30db03211c86670cfa12aJason Sams        RenderScript mRS;
2880835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMin;
2890835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mMag;
2900835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapS;
2910835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapT;
2920835d42be9b215f845e30db03211c86670cfa12aJason Sams        Value mWrapR;
293f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        float mAniso;
2940835d42be9b215f845e30db03211c86670cfa12aJason Sams
2950835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Builder(RenderScript rs) {
2960835d42be9b215f845e30db03211c86670cfa12aJason Sams            mRS = rs;
2970835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMin = Value.NEAREST;
2980835d42be9b215f845e30db03211c86670cfa12aJason Sams            mMag = Value.NEAREST;
2990835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapS = Value.WRAP;
3000835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapT = Value.WRAP;
3010835d42be9b215f845e30db03211c86670cfa12aJason Sams            mWrapR = Value.WRAP;
302f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            mAniso = 1.0f;
3030835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3040835d42be9b215f845e30db03211c86670cfa12aJason Sams
305b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMinification(Value v) {
3068bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST ||
3078bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                v == Value.LINEAR ||
3080857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_LINEAR ||
3090857196107d55bae312c12b72b115d25d5fee4f9Alex Sakhartchouk                v == Value.LINEAR_MIP_NEAREST) {
3108bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMin = v;
3118bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3128bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3138bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3140835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3150835d42be9b215f845e30db03211c86670cfa12aJason Sams
316b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        public void setMagnification(Value v) {
3178bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            if (v == Value.NEAREST || v == Value.LINEAR) {
3188bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mMag = v;
3198bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3208bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3218bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3220835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3230835d42be9b215f845e30db03211c86670cfa12aJason Sams
3240835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapS(Value v) {
3256b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
3268bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapS = v;
3278bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3288bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3298bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3300835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3310835d42be9b215f845e30db03211c86670cfa12aJason Sams
3320835d42be9b215f845e30db03211c86670cfa12aJason Sams        public void setWrapT(Value v) {
3336b9b2caf2bf977508e223792bb5eba75091c232dTim Murray            if (v == Value.WRAP || v == Value.CLAMP || v == Value.MIRRORED_REPEAT) {
3348bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                mWrapT = v;
3358bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            } else {
3368bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams                throw new IllegalArgumentException("Invalid value");
3378bb41dd61474e977aa61048ba8f733a984a3b22dJason Sams            }
3380835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3390835d42be9b215f845e30db03211c86670cfa12aJason Sams
340f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        public void setAnisotropy(float v) {
341f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            if(v >= 0.0f) {
342f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                mAniso = v;
343f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            } else {
344f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk                throw new IllegalArgumentException("Invalid value");
345f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk            }
346f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk        }
347f5b3510c706ed1f7611760dff0c94f2111531c68Alex Sakhartchouk
3480835d42be9b215f845e30db03211c86670cfa12aJason Sams        public Sampler create() {
349771bebb94054d06f97284379c93a2620613513c3Jason Sams            mRS.validate();
350918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk            int id = mRS.nSamplerCreate(mMag.mID, mMin.mID,
3517d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk                                        mWrapS.mID, mWrapT.mID, mWrapR.mID, mAniso);
3527d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            Sampler sampler = new Sampler(id, mRS);
3537d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMin = mMin;
3547d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mMag = mMag;
3557d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapS = mWrapS;
3567d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapT = mWrapT;
3577d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mWrapR = mWrapR;
3587d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            sampler.mAniso = mAniso;
3597d5f5e7c8943e043a422ad51c85d4e1684c37e28Alex Sakhartchouk            return sampler;
3600835d42be9b215f845e30db03211c86670cfa12aJason Sams        }
3610835d42be9b215f845e30db03211c86670cfa12aJason Sams    }
3620835d42be9b215f845e30db03211c86670cfa12aJason Sams
3630835d42be9b215f845e30db03211c86670cfa12aJason Sams}
3640835d42be9b215f845e30db03211c86670cfa12aJason Sams
365