CarouselRS.java revision 1882cebdc1b7b0551189ca33fb7cb77ef10c988b
15ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller/*
25ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Copyright (C) 2010 The Android Open Source Project
35ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
45ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Licensed under the Apache License, Version 2.0 (the "License");
55ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * you may not use this file except in compliance with the License.
65ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * You may obtain a copy of the License at
75ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
85ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *      http://www.apache.org/licenses/LICENSE-2.0
95ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller *
105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * Unless required by applicable law or agreed to in writing, software
115ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * distributed under the License is distributed on an "AS IS" BASIS,
125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * See the License for the specific language governing permissions and
145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller * limitations under the License.
155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller */
165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpackage com.android.ex.carousel;
185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.content.res.Resources;
205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.graphics.Bitmap;
215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.*;
22fb179e7afd8f02be63061b478b0283e3085fc25fJim Millerimport android.renderscript.ProgramStore.BlendDstFunc;
23fb179e7afd8f02be63061b478b0283e3085fc25fJim Millerimport android.renderscript.ProgramStore.BlendSrcFunc;
245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.renderscript.RenderScript.RSMessage;
255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport android.util.Log;
265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerimport static android.renderscript.Element.*;
285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
297cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller/**
307cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * This is a support class for Carousel renderscript.  It handles most of the low-level interactions
317cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller * with Renderscript as well as dispatching events.
327cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller *
337cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller */
345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Millerpublic class CarouselRS  {
355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int DEFAULT_VISIBLE_SLOTS = 1;
36b8c3aee40f704e71fd9a8af41f060ebae2ea445fBryan Mawhinney    private static final int DEFAULT_CARD_COUNT = 0;
375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    // Client messages *** THIS LIST MUST MATCH THOSE IN carousel.rs ***
395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_CARD_SELECTED = 100;
40594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    public static final int CMD_CARD_LONGPRESS = 110;
415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_REQUEST_TEXTURE = 200;
425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_INVALIDATE_TEXTURE = 210;
435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_REQUEST_GEOMETRY = 300;
445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_INVALIDATE_GEOMETRY = 310;
455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_ANIMATION_STARTED = 400;
465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static final int CMD_ANIMATION_FINISHED = 500;
477cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public static final int CMD_REQUEST_DETAIL_TEXTURE = 600;
487cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public static final int CMD_INVALIDATE_DETAIL_TEXTURE = 610;
497cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public static final int CMD_PING = 1000; // for debugging
505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
51be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    // Drag models *** THIS LIST MUST MATCH THOSE IN carousel.rs ***
52be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    public static final int DRAG_MODEL_SCREEN_DELTA = 0;
53be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    public static final int DRAG_MODEL_PLANE = 1;
54be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    public static final int DRAG_MODEL_CYLINDER_INSIDE = 2;
55be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    public static final int DRAG_MODEL_CYLINDER_OUTSIDE = 3;
56be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller
575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final String TAG = "CarouselRS";
585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final int DEFAULT_SLOT_COUNT = 10;
595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private static final boolean MIPMAP = false;
607cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    private static final boolean DBG = false;
615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
625ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private RenderScriptGL mRS;
635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Resources mRes;
641126aa8ba186b42baf5b14c66d44b59f43888b70Stephen Hines    private ScriptC_carousel mScript;
655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ScriptField_Card mCards;
66420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    private ScriptField_FragmentShaderConstants_s mFSConst;
67fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller    private ProgramStore mProgramStoreAlphaZ;
68fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller    private ProgramStore mProgramStoreAlphaNoZ;
69fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller    private ProgramStore mProgramStoreNoAlphaZ;
70fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller    private ProgramStore mProgramStoreNoAlphaNoZ;
71420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    private ProgramFragment mSingleTextureFragmentProgram;
72420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    private ProgramFragment mMultiTextureFragmentProgram;
735ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ProgramVertex mVertexProgram;
745ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private ProgramRaster mRasterProgram;
751eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller    private Allocation[] mAllocationPool;
761eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller    private int mVisibleSlots;
771eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller    private int mPrefetchCardCount;
785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private CarouselCallback mCallback;
79a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller    private float[] mEyePoint = new float[] { 2.0f, 0.0f, 0.0f };
80a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller    private float[] mAtPoint = new float[] { 0.0f, 0.0f, 0.0f };
81a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller    private float[] mUp = new float[] { 0.0f, 1.0f, 0.0f };
82a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller
83a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller    private static final String mSingleTextureShader = new String(
849f0c6badc3e8f928c6f2658a3c85ea50319424d4Alex Sakhartchouk            "varying vec2 varTex0;" +
85a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller            "void main() {" +
86a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller            "vec2 t0 = varTex0.xy;" +
87a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller            "vec4 col = texture2D(UNI_Tex0, t0);" +
88a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller            "gl_FragColor = col; " +
89a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller            "}");
90a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller
91a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller    private static final String mMultiTextureShader = new String(
929f0c6badc3e8f928c6f2658a3c85ea50319424d4Alex Sakhartchouk            "varying vec2 varTex0;" +
93420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            "void main() {" +
94420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            "vec2 t0 = varTex0.xy;" +
95420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            "vec4 col = texture2D(UNI_Tex0, t0);" +
96420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            "vec4 col2 = texture2D(UNI_Tex1, t0);" +
97420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            "gl_FragColor = mix(col, col2, UNI_fadeAmount);}");
985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public static interface CarouselCallback {
1005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when a card is selected
1025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
1035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onCardSelected(int n);
1055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
107594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma         * Called when a card is long-pressed
108594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma         * @param n the id of the card
109594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma         */
110594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        void onCardLongPress(int n);
111594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
112594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        /**
1135ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when texture is needed for card n.  This happens when the given card becomes
1145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * visible.
1155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
1165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onRequestTexture(int n);
1185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when a texture is no longer needed for card n.  This happens when the card
1215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * goes out of view.
1225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
1235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onInvalidateTexture(int n);
1255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1277cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * Called when detail texture is needed for card n.  This happens when the given card
1287cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * becomes visible.
1297cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * @param n the id of the card
1307cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         */
1317cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        void onRequestDetailTexture(int n);
1327cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1337cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        /**
1347cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * Called when a detail texture is no longer needed for card n.  This happens when the card
1357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * goes out of view.
1367cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         * @param n the id of the card
1377cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller         */
1387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        void onInvalidateDetailTexture(int n);
1397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        /**
1415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when geometry is needed for card n.
1425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card.
1435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onRequestGeometry(int n);
1455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1479afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller         * Called when geometry is no longer needed for card n. This happens when the card goes
1485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * out of view.
1495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * @param n the id of the card
1505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onInvalidateGeometry(int n);
1525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1545ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when card animation (e.g. a fling) has started.
1555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
1565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        void onAnimationStarted();
1575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        /**
1595ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         * Called when card animation has stopped.
160a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich         * @param startAngle the angle of rotation, in radians, at which the animation stopped.
1615ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller         */
162a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        void onAnimationFinished(float carouselRotationAngle);
1635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    };
1645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private RSMessage mRsMessage = new RSMessage() {
1665ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        public void run() {
1675ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            if (mCallback == null) return;
1685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            switch (mID) {
1695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_CARD_SELECTED:
1705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onCardSelected(mData[0]);
1715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1725ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
173594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                case CMD_CARD_LONGPRESS:
174594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                    mCallback.onCardLongPress(mData[0]);
175594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma                    break;
176594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
1775ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_REQUEST_TEXTURE:
1785ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onRequestTexture(mData[0]);
1795ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1805ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_INVALIDATE_TEXTURE:
182c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    setTexture(mData[0], null);
1835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onInvalidateTexture(mData[0]);
1845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1867cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                case CMD_REQUEST_DETAIL_TEXTURE:
1877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    mCallback.onRequestDetailTexture(mData[0]);
1887cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    break;
1897cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1907cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                case CMD_INVALIDATE_DETAIL_TEXTURE:
191b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller                    setDetailTexture(mData[0], 0.0f, 0.0f, 0.0f, 0.0f, null);
1927cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    mCallback.onInvalidateDetailTexture(mData[0]);
1937cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    break;
1947cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
1955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_REQUEST_GEOMETRY:
1965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onRequestGeometry(mData[0]);
1975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
1985ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
1995ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_INVALIDATE_GEOMETRY:
200c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    setGeometry(mData[0], null);
2015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onInvalidateGeometry(mData[0]);
2025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
2035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_ANIMATION_STARTED:
2055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    mCallback.onAnimationStarted();
2065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
2075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_ANIMATION_FINISHED:
209a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich                    mCallback.onAnimationFinished(Float.intBitsToFloat(mData[0]));
210198a060d650bc849ef0f25b597888fac9546803bJack Palevich                    break;
211198a060d650bc849ef0f25b597888fac9546803bJack Palevich
2125ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                case CMD_PING:
2137cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller                    if (DBG) Log.v(TAG, "PING...");
2145ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    break;
2155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                default:
2175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller                    Log.e(TAG, "Unknown RSMessage: " + mID);
2185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
2195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    };
2215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
222a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller    public CarouselRS(RenderScriptGL rs, Resources res, int resId) {
2235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS = rs;
2245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRes = res;
2255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        // create the script object
2271126aa8ba186b42baf5b14c66d44b59f43888b70Stephen Hines        mScript = new ScriptC_carousel(mRS, mRes, resId, true);
2285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS.mMessageCallback = mRsMessage;
2295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initProgramStore();
2305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initFragmentProgram();
2315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initRasterProgram();
2325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        initVertexProgram();
2335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setSlotCount(DEFAULT_SLOT_COUNT);
2345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setVisibleSlots(DEFAULT_VISIBLE_SLOTS);
2355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        createCards(DEFAULT_CARD_COUNT);
2365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setStartAngle(0.0f);
237a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        setCarouselRotationAngle(0.0f);
2385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        setRadius(1.0f);
239a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller        setLookAt(mEyePoint, mAtPoint, mUp);
240a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller        setRadius(20.0f);
241a044fbbb1e5498a0112f20a1b0de11a4089ef612Jim Miller        // Fov: 25
2425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2435ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2445ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLookAt(float[] eye, float[] at, float[] up) {
2455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        for (int i = 0; i < 3; i++) {
2465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mEyePoint[i] = eye[i];
2475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mAtPoint[i] = at[i];
2485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            mUp[i] = up[i];
2495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
2505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_lookAt(eye[0], eye[1], eye[2], at[0], at[1], at[2], up[0], up[1], up[2]);
2515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2535ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setRadius(float radius) {
254be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller        mScript.invoke_setRadius(radius);
2555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
257c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setCardRotation(float cardRotation) {
258c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_cardRotation(cardRotation);
259c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
260c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
26183d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    public void setCardsFaceTangent(boolean faceTangent) {
26283d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney        mScript.set_cardsFaceTangent(faceTangent);
26383d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney    }
26483d7a5f03e6511372f73e3e4e03a6d403b20125dBryan Mawhinney
265c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setSwaySensitivity(float swaySensitivity) {
266c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_swaySensitivity(swaySensitivity);
267c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
268c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
269c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setFrictionCoefficient(float frictionCoeff) {
270c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_frictionCoeff(frictionCoeff);
271c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
272c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
273c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    public void setDragFactor(float dragFactor) {
274c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma        mScript.set_dragFactor(dragFactor);
275c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma    }
276c0bb8af58ae15674178f2db240283719918c6f28Jim Shuma
277be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    public void setDragModel(int model) {
278be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller        mScript.set_dragModel(model);
279be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller    }
280be5482f170e191aa98a3c2ecefdeaf936b7df412Jim Miller
2815ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initVertexProgram() {
2825ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
2835ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mVertexProgram = pvb.create();
2845ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramVertex.MatrixAllocation pva = new ProgramVertex.MatrixAllocation(mRS);
2855ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mVertexProgram.bindAllocation(pva);
2865ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        pva.setupProjectionNormalized(1, 1);
2875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_vertexProgram(mVertexProgram);
2885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initRasterProgram() {
2915ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        ProgramRaster.Builder programRasterBuilder = new ProgramRaster.Builder(mRS);
2925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRasterProgram = programRasterBuilder.create();
2935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        //mRasterProgram.setCullMode(CullMode.NONE);
2945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_rasterProgram(mRasterProgram);
2955ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
2965ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
2975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initFragmentProgram() {
298a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        //
299a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Single texture program
300a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        //
301a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        ProgramFragment.ShaderBuilder pfbSingle = new ProgramFragment.ShaderBuilder(mRS);
302a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Specify the resource that contains the shader string
303a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        pfbSingle.setShader(mSingleTextureShader);
304a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Tell the builder how many textures we have
305a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        pfbSingle.setTextureCount(1);
306a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mSingleTextureFragmentProgram = pfbSingle.create();
307a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Bind the source of constant data
308a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mSingleTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
309a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller
310a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        //
311a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Multi texture program
312a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        //
313a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mFSConst = new ScriptField_FragmentShaderConstants_s(mRS, 1);
314a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mScript.bind_shaderConstants(mFSConst);
315a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        ProgramFragment.ShaderBuilder pfbMulti = new ProgramFragment.ShaderBuilder(mRS);
316a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Specify the resource that contains the shader string
317a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        pfbMulti.setShader(mMultiTextureShader);
318a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Tell the builder how many textures we have
319a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        pfbMulti.setTextureCount(2);
320a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Define the constant input layout
321a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        pfbMulti.addConstant(mFSConst.getAllocation().getType());
322a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mMultiTextureFragmentProgram = pfbMulti.create();
323a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        // Bind the source of constant data
324a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mMultiTextureFragmentProgram.bindConstants(mFSConst.getAllocation(), 0);
325a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mMultiTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 0);
326a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mMultiTextureFragmentProgram.bindSampler(Sampler.CLAMP_LINEAR(mRS), 1);
327a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller
328a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mScript.set_linearClamp(Sampler.CLAMP_LINEAR(mRS));
329a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mScript.set_singleTextureFragmentProgram(mSingleTextureFragmentProgram);
330a9e9c4bef076e718094786edfe0290f798e1db4bJim Miller        mScript.set_multiTextureFragmentProgram(mMultiTextureFragmentProgram);
3315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private void initProgramStore() {
334fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        final boolean dither = true;
335fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mProgramStoreAlphaZ = new ProgramStore.Builder(mRS)
336fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setBlendFunc(ProgramStore.BlendSrcFunc.ONE,
337fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                        ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA)
338fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDitherEnable(dither)
339fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthFunc(ProgramStore.DepthFunc.LESS)
340fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthMask(true)
341fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .create();
342fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mScript.set_programStoreAlphaZ(mProgramStoreAlphaZ);
343fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller
344fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mProgramStoreAlphaNoZ = new ProgramStore.Builder(mRS)
345fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setBlendFunc(ProgramStore.BlendSrcFunc.ONE,
346fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                        ProgramStore.BlendDstFunc.ONE_MINUS_SRC_ALPHA)
347fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDitherEnable(dither)
348fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthFunc(ProgramStore.DepthFunc.ALWAYS)
349fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthMask(false)
350fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .create();
351fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mScript.set_programStoreAlphaNoZ(mProgramStoreAlphaNoZ);
352fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller
353fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mProgramStoreNoAlphaZ = new ProgramStore.Builder(mRS)
354fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ZERO)
355fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDitherEnable(dither)
356fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthFunc(ProgramStore.DepthFunc.LESS)
357fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthMask(true)
358fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .create();
359fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mScript.set_programStoreNoAlphaZ(mProgramStoreNoAlphaZ);
360fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller
361fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mProgramStoreNoAlphaNoZ = new ProgramStore.Builder(mRS)
362fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setBlendFunc(ProgramStore.BlendSrcFunc.ONE, ProgramStore.BlendDstFunc.ZERO)
363fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDitherEnable(dither)
364fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthFunc(ProgramStore.DepthFunc.ALWAYS)
365fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .setDepthMask(false)
366fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller                .create();
367fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mScript.set_programStoreNoAlphaNoZ(mProgramStoreNoAlphaNoZ);
3685ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3695ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3705ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void createCards(int count)
3715ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3723df59346f395434454d310b070fff195089fbaf1Jim Miller        // Because RenderScript can't have allocations with 0 dimensions, we always create
3733df59346f395434454d310b070fff195089fbaf1Jim Miller        // an allocation of at least one card. This relies on invoke_createCards() to keep
3743df59346f395434454d310b070fff195089fbaf1Jim Miller        // track of when the allocation is not valid.
3758b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich        if (mCards != null) {
3768b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich            // resize the array
3776f2cc8cf611860467315ecc542f71a225625eb1cJason Sams            int oldSize = mCards.getAllocation().getType().getX();
3786f2cc8cf611860467315ecc542f71a225625eb1cJason Sams            int newSize = count > 0 ? count : 1;
3796f2cc8cf611860467315ecc542f71a225625eb1cJason Sams            mCards.resize(newSize);
3806f2cc8cf611860467315ecc542f71a225625eb1cJason Sams            mScript.invoke_createCards(oldSize, count);
3818b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich        } else {
3828b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich            // create array from scratch
3838b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich            mCards = new ScriptField_Card(mRS, count > 0 ? count : 1);
3848b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich            mScript.bind_cards(mCards);
3856f2cc8cf611860467315ecc542f71a225625eb1cJason Sams            mScript.invoke_createCards(0, count);
3868b55d7500c1e5a88c415dae8dcead16b152d7929Jack Palevich        }
3875ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setVisibleSlots(int count)
3905ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
3911eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        mVisibleSlots = count;
3925ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_visibleSlotCount(count);
3935ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
3945ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
3957c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setVisibleDetails(int count) {
3967c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mScript.set_visibleDetailCount(count);
3977c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
3987c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
3994fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    public void setPrefetchCardCount(int count) {
4001eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        mPrefetchCardCount = count;
4014fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma        mScript.set_prefetchCardCount(count);
4024fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    }
4034fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma
4044a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney    public void setDetailTextureAlignment(int alignment) {
4054a8736e22d7b40ab9dfa3fbd8a10de92144912b3Bryan Mawhinney        mScript.set_detailTextureAlignment(alignment);
4064fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma    }
4074fe6ea729d1fc44c8126de7a92a710c3885fb2ecJim Shuma
408fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller    public void setForceBlendCardsWithZ(boolean enabled) {
409fb179e7afd8f02be63061b478b0283e3085fc25fJim Miller        mScript.set_forceBlendCardsWithZ(enabled);
410bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma    }
411bfc5ce2da9e0d8d0ec2535c465624574d98418d7Jim Shuma
4127c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    public void setDrawRuler(boolean drawRuler) {
4137c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma        mScript.set_drawRuler(drawRuler);
4147c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma    }
4157c09ccce478100d75e4427d87866ff19d758ae7aJim Shuma
4165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setDefaultBitmap(Bitmap bitmap)
4175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_defaultTexture(allocationFromBitmap(bitmap, MIPMAP));
4195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4215ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLoadingBitmap(Bitmap bitmap)
4225ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_loadingTexture(allocationFromBitmap(bitmap, MIPMAP));
4245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4255ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4265ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setDefaultGeometry(Mesh mesh)
4275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_defaultGeometry(mesh);
4295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setLoadingGeometry(Mesh mesh)
4325ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4335ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_loadingGeometry(mesh);
4345ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4355ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4365ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setStartAngle(float theta)
4375ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4385ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_startAngle(theta);
4395ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4405ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
441a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    public void setCarouselRotationAngle(float theta) {
442a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich        mScript.invoke_setCarouselRotationAngle(theta);
443a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich    }
444a84feeb7e4dc1a75ec6d0b1f2494893987fc3ca3Jack Palevich
4455ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setCallback(CarouselCallback callback)
4465ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4475ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mCallback = callback;
4485ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4495ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4505ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    private Allocation allocationFromBitmap(Bitmap bitmap, boolean mipmap)
4515ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4525ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        if (bitmap == null) return null;
453e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        Allocation allocation = Allocation.createFromBitmap(mRS, bitmap,
454a3cb716626b477c98ba912698c765eab20f27286Jim Miller                elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), mipmap);
4555ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        allocation.uploadToTexture(0);
4565ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        return allocation;
4575ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
4585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
4591eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller    private Allocation allocationFromPool(int n, Bitmap bitmap, boolean mipmap)
4601eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller    {
4611eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        int count = mVisibleSlots + mPrefetchCardCount;
4621eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        if (mAllocationPool == null || mAllocationPool.length != count) {
4631eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            Allocation[] tmp = new Allocation[count];
4641eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            int oldsize = mAllocationPool == null ? 0 : mAllocationPool.length;
4651eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            for (int i = 0; i < Math.min(count, oldsize); i++) {
4661eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                tmp[i] = mAllocationPool[i];
4671eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            }
4681eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            mAllocationPool = tmp;
4691eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        }
4701eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        Allocation allocation = mAllocationPool[n % count];
4711eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        if (allocation == null) {
4721eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            allocation = allocationFromBitmap(bitmap, mipmap);
4731eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            mAllocationPool[n % count]  = allocation;
4741eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        } else if (bitmap != null) {
4751eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            if (bitmap.getWidth() == allocation.getType().getX()
4761eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                && bitmap.getHeight() == allocation.getType().getY()) {
4771eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                allocation.updateFromBitmap(bitmap);
4781eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                allocation.uploadToTexture(0);
4791eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            } else {
4801eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                Log.v(TAG, "Warning, bitmap has different size. Taking slow path");
4811eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                allocation = allocationFromBitmap(bitmap, mipmap);
4821eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                mAllocationPool[n % count]  = allocation;
4831eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller            }
4841eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        }
4851eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller        return allocation;
4861eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller    }
4871eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller
4885ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setTexture(int n, Bitmap bitmap)
4895ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
4903df59346f395434454d310b070fff195089fbaf1Jim Miller        if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
4913df59346f395434454d310b070fff195089fbaf1Jim Miller
492c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller        synchronized(this) {
493c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            ScriptField_Card.Item item = mCards.get(n);
494c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (item == null) {
495c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "setTexture(): no item at index " + n);
496c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item = new ScriptField_Card.Item();
4975ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
498c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (bitmap != null) {
4991eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                item.texture = allocationFromPool(n, bitmap, MIPMAP);
500c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            } else {
501c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (item.texture != null) {
502c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    if (DBG) Log.v(TAG, "unloading texture " + n);
503c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.texture = null;
504c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                }
505c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            }
506c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mCards.set(item, n, false); // This is primarily used for reference counting.
507c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mScript.invoke_setTexture(n, item.texture);
5085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
5095ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
5105ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
511b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller    void setDetailTexture(int n, float offx, float offy, float loffx, float loffy, Bitmap bitmap)
5127cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    {
5133df59346f395434454d310b070fff195089fbaf1Jim Miller        if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
5143df59346f395434454d310b070fff195089fbaf1Jim Miller
515c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller        synchronized(this) {
516c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            ScriptField_Card.Item item = mCards.get(n);
517c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (item == null) {
518c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "setDetailTexture(): no item at index " + n);
519c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item = new ScriptField_Card.Item();
520c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            }
521c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            float width = 0.0f;
522c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            float height = 0.0f;
523c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (bitmap != null) {
5241eccd028e704c15e842c1f23254d77a1a0a4cae0Jim Miller                item.detailTexture = allocationFromBitmap(bitmap, MIPMAP);
525c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                width = bitmap.getWidth();
526c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                height = bitmap.getHeight();
527c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            } else {
528c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (item.detailTexture != null) {
529c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    if (DBG) Log.v(TAG, "unloading texture " + n);
530c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // Don't wait for GC to free native memory.
531c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // Only works if textures are not shared.
532c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.detailTexture.destroy();
533c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.detailTexture = null;
534c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                }
5357cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            }
536c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mCards.set(item, n, false); // This is primarily used for reference counting.
537b378af500b36226635b6343b1d5009ee9af44fc1Jim Miller            mScript.invoke_setDetailTexture(n, offx, offy, loffx, loffy, item.detailTexture);
5387cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        }
5397cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    }
5407cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
5415ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setGeometry(int n, Mesh geometry)
5425ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    {
5433df59346f395434454d310b070fff195089fbaf1Jim Miller        if (n < 0) throw new IllegalArgumentException("Index cannot be negative");
5443df59346f395434454d310b070fff195089fbaf1Jim Miller
545c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller        synchronized(this) {
546c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            final boolean mipmap = false;
547c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            ScriptField_Card.Item item = mCards.get(n);
548c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (item == null) {
549c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "setGeometry(): no item at index " + n);
550c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item = new ScriptField_Card.Item();
551c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            }
552c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            if (geometry != null) {
553c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                item.geometry = geometry;
554c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            } else {
555c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (DBG) Log.v(TAG, "unloading geometry " + n);
556c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                if (item.geometry != null) {
557c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    // item.geometry.destroy();
558c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                    item.geometry = null;
559c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller                }
5605ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller            }
561c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mCards.set(item, n, false);
562c4c6f38bf410af40e10c63b152befd5a39df87c8Jim Miller            mScript.invoke_setGeometry(n, item.geometry);
5635ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        }
5645ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
5655ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
566b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller    public void setBackgroundColor(Float4 color) {
567b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller        mScript.set_backgroundColor(color);
568b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller    }
569b0f070636c29ad178f4e21306f301fe3d20c183bJim Miller
5709afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller    public void setBackgroundTexture(Bitmap bitmap) {
5719afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        Allocation texture = null;
5729afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        if (bitmap != null) {
573e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            texture = Allocation.createFromBitmap(mRS, bitmap,
574e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich                    elementForBitmap(bitmap, Bitmap.Config.RGB_565), MIPMAP);
5759afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller            texture.uploadToTexture(0);
5769afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        }
5779afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller        mScript.set_backgroundTexture(texture);
5789afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller    }
5799afba8c61f6aff94c68acbfaae1cc58bd28c13eaJim Miller
5807cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    public void setDetailLineTexture(Bitmap bitmap) {
5817cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        Allocation texture = null;
5827cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        if (bitmap != null) {
583e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            texture = Allocation.createFromBitmap(mRS, bitmap,
584e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich                    elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), MIPMAP);
5857cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller            texture.uploadToTexture(0);
5867cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        }
5877cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller        mScript.set_detailLineTexture(texture);
5887cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller    }
5897cb0068e59dde61ef0e649735199e5ba31c9c6afJim Miller
590420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    public void setDetailLoadingTexture(Bitmap bitmap) {
591420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        Allocation texture = null;
592420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        if (bitmap != null) {
593420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            texture = Allocation.createFromBitmap(mRS, bitmap,
594420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller                    elementForBitmap(bitmap, Bitmap.Config.ARGB_4444), MIPMAP);
595420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller            texture.uploadToTexture(0);
596420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        }
597420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        mScript.set_detailLoadingTexture(texture);
598420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    }
599420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller
6005ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void pauseRendering() {
6015ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        // Used to update multiple states at once w/o redrawing for each.
6025ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS.contextBindRootScript(null);
6035ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6045ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6055ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void resumeRendering() {
6065ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mRS.contextBindRootScript(mScript);
6075ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6085ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
609594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    public void doLongPress() {
610594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma        mScript.invoke_doLongPress();
611594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma    }
612594ff62c170509c0d69b30f4c2a5e71d4799a9c8Jim Shuma
6131882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller    public void doMotion(float x, float y, long t) {
6141882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller        mScript.invoke_doMotion(x, y, t);
6155ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6165ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6175ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void doSelection(float x, float y) {
6185ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.invoke_doSelection(x, y);
6195ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6205ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6211882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller    public void doStart(float x, float y, long t) {
6221882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller        mScript.invoke_doStart(x, y, t);
6235ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6245ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6251882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller    public void doStop(float x, float y, long t) {
6261882cebdc1b7b0551189ca33fb7cb77ef10c988bJim Miller        mScript.invoke_doStop(x, y, t);
6275ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
6285ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller
6295ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    public void setSlotCount(int n) {
6305ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller        mScript.set_slotCount(n);
6315ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller    }
632198a060d650bc849ef0f25b597888fac9546803bJack Palevich
633420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    public void setRezInCardCount(float alpha) {
634420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        mScript.set_rezInCardCount(alpha);
635420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    }
636420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller
637420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    public void setFadeInDuration(long t) {
638420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller        mScript.set_fadeInDuration((int)t); // TODO: Remove cast when RS supports exporting longs
639420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller    }
640420b44b8b11ec1c309ea130e69a6876325dbfef9Jim Miller
641e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich    private Element elementForBitmap(Bitmap bitmap, Bitmap.Config defaultConfig) {
642e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        Bitmap.Config config = bitmap.getConfig();
643e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        if (config == null) {
644e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            config = defaultConfig;
645e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        }
646e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        if (config == Bitmap.Config.ALPHA_8) {
647e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return A_8(mRS);
648e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else if (config == Bitmap.Config.RGB_565) {
649e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return RGB_565(mRS);
650e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else if (config == Bitmap.Config.ARGB_4444) {
651e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return RGBA_4444(mRS);
652e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else if (config == Bitmap.Config.ARGB_8888) {
653e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            return RGBA_8888(mRS);
654e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        } else {
655e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich            throw new IllegalArgumentException("Unknown configuration");
656e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich        }
657e0103cfd1a72197454e522834d2e8f600f798073Jack Palevich    }
6585ce730797a8a7278dfe19dac8a9460b25675fed0Jim Miller}
659