Allocation.java revision 11518acc8c416023d8c2192b441a1767205676d9
1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/*
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Copyright (C) 2008 The Android Open Source Project
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Licensed under the Apache License, Version 2.0 (the "License");
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * you may not use this file except in compliance with the License.
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * You may obtain a copy of the License at
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *      http://www.apache.org/licenses/LICENSE-2.0
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Unless required by applicable law or agreed to in writing, software
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * distributed under the License is distributed on an "AS IS" BASIS,
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * See the License for the specific language governing permissions and
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * limitations under the License.
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick */
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochpackage android.renderscript;
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport java.io.IOException;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport java.io.InputStream;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochimport android.content.res.Resources;
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.content.res.AssetManager;
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenimport android.graphics.Bitmap;
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.graphics.BitmapFactory;
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.util.Log;
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottimport android.util.TypedValue;
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <p>
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * Memory allocation class for renderscript.  An allocation combines a
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * {@link android.renderscript.Type} with the memory to provide storage for user data and objects.
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch * This implies that all memory in Renderscript is typed.
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * </p>
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <p>Allocations are the primary way data moves into and out of scripts. Memory is user
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * synchronized and it's possible for allocations to exist in multiple memory spaces
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * concurrently. Currently those spaces are:</p>
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <ul>
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <li>Script: accessable by RS scripts.</li>
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <li>Graphics Texture: accessable as a graphics texture.</li>
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <li>Graphics Vertex: accessable as graphical vertex data.</li>
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * <li>Graphics Constants: Accessable as constants in user shaders</li>
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * </ul>
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * </p>
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * <p>
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * For example, when creating a allocation for a texture, the user can
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * specify its memory spaces as both script and textures. This means that it can both
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * be used as script binding and as a GPU texture for rendering. To maintain
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * synchronization if a script modifies an allocation used by other targets it must
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * call a synchronizing function to push the updates to the memory, otherwise the results
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * are undefined.
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott * </p>
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * <p>By default, Android system side updates are always applied to the script accessable
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * memory. If this is not present, they are then applied to the various HW
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * memory types.  A {@link android.renderscript.Allocation#syncAll syncAll()}
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * call is necessary after the script data is updated to
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * keep the other memory spaces in sync.</p>
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * <p>Allocation data is uploaded in one of two primary ways. For simple
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * arrays there are copyFrom() functions that take an array from the control code and
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * copy it to the slave memory store. Both type checked and unchecked copies are provided.
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * The unchecked variants exist to allow apps to copy over arrays of structures from a
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * control language that does not support structures.</p>
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick **/
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickpublic class Allocation extends BaseObj {
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Type mType;
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    Bitmap mBitmap;
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int mUsage;
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * The usage of the allocation.  These signal to renderscript
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * where to place the allocation in memory.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * SCRIPT The allocation will be bound to and accessed by
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * scripts.
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    public static final int USAGE_SCRIPT = 0x0001;
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * GRAPHICS_TEXTURE The allcation will be used as a texture
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick     * source by one or more graphcics programs.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public static final int USAGE_GRAPHICS_TEXTURE = 0x0002;
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen     * GRAPHICS_VERTEX The allocation will be used as a graphics
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * mesh.
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     */
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    public static final int USAGE_GRAPHICS_VERTEX = 0x0004;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    /**
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen     * GRAPHICS_CONSTANTS The allocation will be used as the source
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * of shader constants by one or more programs.
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    public static final int USAGE_GRAPHICS_CONSTANTS = 0x0008;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Controls mipmap behavior when using the bitmap creation and
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * update functions.
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    public enum MipmapControl {
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        /**
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         * No mipmaps will be generated and the type generated from the
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         * incoming bitmap will not contain additional LODs.
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen         */
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        MIPMAP_NONE(0),
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        /**
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         * A Full mipmap chain will be created in script memory.  The
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         * type of the allocation will contain a full mipmap chain.  On
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         * upload to graphics the full chain will be transfered.
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         */
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        MIPMAP_FULL(1),
1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        /**
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         * The type of the allocation will be the same as MIPMAP_NONE.
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         * It will not contain mipmaps.  On upload to graphics the
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         * graphics copy of the allocation data will contain a full
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         * mipmap chain generated from the top level in script memory.
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         */
1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        MIPMAP_ON_SYNC_TO_TEXTURE(2);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int mID;
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        MipmapControl(int id) {
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            mID = id;
1323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        }
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    Allocation(int id, RenderScript rs, Type t, int usage) {
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        super(id, rs);
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if ((usage & ~(USAGE_SCRIPT |
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                       USAGE_GRAPHICS_TEXTURE |
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                       USAGE_GRAPHICS_VERTEX |
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                       USAGE_GRAPHICS_CONSTANTS)) != 0) {
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Unknown usage specified.");
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mType = t;
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    private void validateIsInt32() {
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if ((mType.mElement.mType == Element.DataType.SIGNED_32) ||
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            (mType.mElement.mType == Element.DataType.UNSIGNED_32)) {
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return;
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        throw new RSIllegalArgumentException(
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            "32 bit integer source does not match allocation type " + mType.mElement.mType);
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    private void validateIsInt16() {
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if ((mType.mElement.mType == Element.DataType.SIGNED_16) ||
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            (mType.mElement.mType == Element.DataType.UNSIGNED_16)) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            return;
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        throw new RSIllegalArgumentException(
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            "16 bit integer source does not match allocation type " + mType.mElement.mType);
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    private void validateIsInt8() {
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if ((mType.mElement.mType == Element.DataType.SIGNED_8) ||
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            (mType.mElement.mType == Element.DataType.UNSIGNED_8)) {
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return;
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        throw new RSIllegalArgumentException(
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            "8 bit integer source does not match allocation type " + mType.mElement.mType);
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    private void validateIsFloat32() {
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (mType.mElement.mType == Element.DataType.FLOAT_32) {
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return;
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        throw new RSIllegalArgumentException(
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            "32 bit float source does not match allocation type " + mType.mElement.mType);
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    private void validateIsObject() {
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if ((mType.mElement.mType == Element.DataType.RS_ELEMENT) ||
18321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            (mType.mElement.mType == Element.DataType.RS_TYPE) ||
18421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            (mType.mElement.mType == Element.DataType.RS_ALLOCATION) ||
18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            (mType.mElement.mType == Element.DataType.RS_SAMPLER) ||
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            (mType.mElement.mType == Element.DataType.RS_SCRIPT) ||
18721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            (mType.mElement.mType == Element.DataType.RS_MESH) ||
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            (mType.mElement.mType == Element.DataType.RS_PROGRAM_FRAGMENT) ||
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            (mType.mElement.mType == Element.DataType.RS_PROGRAM_VERTEX) ||
19021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen            (mType.mElement.mType == Element.DataType.RS_PROGRAM_RASTER) ||
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            (mType.mElement.mType == Element.DataType.RS_PROGRAM_STORE)) {
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            return;
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
19421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        throw new RSIllegalArgumentException(
1954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch            "Object source does not match allocation type " + mType.mElement.mType);
1964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
1974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    @Override
1994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    void updateFromNative() {
2004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        super.updateFromNative();
2014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        int typeID = mRS.nAllocationGetType(getID());
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(typeID != 0) {
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            mType = new Type(typeID, mRS);
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            mType.updateFromNative();
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public Type getType() {
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return mType;
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void syncAll(int srcLocation) {
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        switch (srcLocation) {
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case USAGE_SCRIPT:
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case USAGE_GRAPHICS_CONSTANTS:
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case USAGE_GRAPHICS_TEXTURE:
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case USAGE_GRAPHICS_VERTEX:
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            break;
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        default:
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Source must be exactly one usage type.");
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationSyncAll(getID(), srcLocation);
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyFrom(BaseObj[] d) {
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateIsObject();
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (d.length != mType.getCount()) {
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Array size mismatch, allocation sizeX = " +
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                 mType.getCount() + ", array length = " + d.length);
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int i[] = new int[d.length];
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        for (int ct=0; ct < d.length; ct++) {
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            i[ct] = d[ct].getID();
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        copy1DRangeFromUnchecked(0, mType.getCount(), i);
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    private void validateBitmapFormat(Bitmap b) {
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Bitmap.Config bc = b.getConfig();
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        switch (bc) {
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case ALPHA_8:
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if (mType.getElement().mKind != Element.DataKind.PIXEL_A) {
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                throw new RSIllegalArgumentException("Allocation kind is " +
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     mType.getElement().mKind + ", type " +
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     mType.getElement().mType +
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     " of " + mType.getElement().getSizeBytes() +
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     " bytes, passed bitmap was " + bc);
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            break;
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case ARGB_8888:
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                (mType.getElement().getSizeBytes() != 4)) {
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                throw new RSIllegalArgumentException("Allocation kind is " +
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                     mType.getElement().mKind + ", type " +
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     mType.getElement().mType +
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                     " of " + mType.getElement().getSizeBytes() +
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                     " bytes, passed bitmap was " + bc);
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            }
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            break;
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case RGB_565:
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGB) ||
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                (mType.getElement().getSizeBytes() != 2)) {
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                throw new RSIllegalArgumentException("Allocation kind is " +
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     mType.getElement().mKind + ", type " +
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     mType.getElement().mType +
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     " of " + mType.getElement().getSizeBytes() +
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     " bytes, passed bitmap was " + bc);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            }
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            break;
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        case ARGB_4444:
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            if ((mType.getElement().mKind != Element.DataKind.PIXEL_RGBA) ||
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                (mType.getElement().getSizeBytes() != 2)) {
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                throw new RSIllegalArgumentException("Allocation kind is " +
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     mType.getElement().mKind + ", type " +
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                     mType.getElement().mType +
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                     " of " + mType.getElement().getSizeBytes() +
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     " bytes, passed bitmap was " + bc);
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            }
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            break;
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    private void validateBitmapSize(Bitmap b) {
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(mType.getX() != b.getWidth() ||
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott           mType.getY() != b.getHeight()) {
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Cannot update allocation from bitmap, sizes mismatch");
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Copy an allocation from an array.  This variant is not type
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * checked which allows an application to fill in structured
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * data from an array.
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     * @param d the source data array
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen     */
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    public void copyFromUnchecked(int[] d) {
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        mRS.validate();
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        copy1DRangeFromUnchecked(0, mType.getCount(), d);
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /**
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * Copy an allocation from an array.  This variant is not type
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * checked which allows an application to fill in structured
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * data from an array.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * @param d the source data array
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    public void copyFromUnchecked(short[] d) {
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        mRS.validate();
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        copy1DRangeFromUnchecked(0, mType.getCount(), d);
3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Copy an allocation from an array.  This variant is not type
31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * checked which allows an application to fill in structured
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * data from an array.
3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param d the source data array
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    public void copyFromUnchecked(byte[] d) {
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        mRS.validate();
324201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        copy1DRangeFromUnchecked(0, mType.getCount(), d);
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Copy an allocation from an array.  This variant is not type
3283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * checked which allows an application to fill in structured
3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * data from an array.
3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param d the source data array
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     */
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    public void copyFromUnchecked(float[] d) {
3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        mRS.validate();
3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        copy1DRangeFromUnchecked(0, mType.getCount(), d);
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Copy an allocation from an array.  This variant is type
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * checked and will generate exceptions if the Allocation type
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * is not a 32 bit integer type.
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param d the source data array
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyFrom(int[] d) {
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        copy1DRangeFrom(0, mType.getCount(), d);
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Copy an allocation from an array.  This variant is type
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * checked and will generate exceptions if the Allocation type
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * is not a 16 bit integer type.
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param d the source data array
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyFrom(short[] d) {
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        copy1DRangeFrom(0, mType.getCount(), d);
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /**
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Copy an allocation from an array.  This variant is type
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * checked and will generate exceptions if the Allocation type
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * is not a 8 bit integer type.
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param d the source data array
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyFrom(byte[] d) {
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        copy1DRangeFrom(0, mType.getCount(), d);
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /**
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * Copy an allocation from an array.  This variant is type
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * checked and will generate exceptions if the Allocation type
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * is not a 32 bit float type.
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param d the source data array
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyFrom(float[] d) {
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        copy1DRangeFrom(0, mType.getCount(), d);
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * Copy an allocation from a bitmap.  The height, width, and
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * format of the bitmap must match the existing allocation.
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param b the source bitmap
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyFrom(Bitmap b) {
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateBitmapSize(b);
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateBitmapFormat(b);
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationCopyFromBitmap(getID(), b);
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * This is only intended to be used by auto-generate code reflected from the
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * renderscript script files.
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param xoff
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param fp
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void setFromFieldPacker(int xoff, FieldPacker fp) {
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int eSize = mType.mElement.getSizeBytes();
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        final byte[] data = fp.getData();
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int count = data.length / eSize;
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if ((eSize * count) != data.length) {
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Field packer length " + data.length +
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                               " not divisible by element size " + eSize + ".");
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        data1DChecks(xoff, count, data.length, data.length);
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationData1D(getID(), xoff, 0, count, data, data.length);
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * This is only intended to be used by auto-generate code reflected from the
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * renderscript script files.
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param xoff
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param component_number
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param fp
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void setFromFieldPacker(int xoff, int component_number, FieldPacker fp) {
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (component_number >= mType.mElement.mElements.length) {
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Component_number " + component_number + " out of range.");
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if(xoff < 0) {
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Offset must be >= 0.");
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        final byte[] data = fp.getData();
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int eSize = mType.mElement.mElements[component_number].getSizeBytes();
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (data.length != eSize) {
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Field packer sizelength " + data.length +
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                               " does not match component size " + eSize + ".");
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationElementData1D(getID(), xoff, 0, component_number, data, data.length);
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    private void data1DChecks(int off, int count, int len, int dataSize) {
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        mRS.validate();
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(off < 0) {
449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Offset must be >= 0.");
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if(count < 1) {
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Count must be >= 1.");
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if((off + count) > mType.getCount()) {
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Overflow, Available count " + mType.getCount() +
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                               ", got " + count + " at offset " + off + ".");
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if((len) < dataSize) {
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Array too small for allocation type.");
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Generate a mipmap chain.  Requires the type of the allocation
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * include mipmaps.
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * This function will generate a complete set of mipmaps from
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * the top level lod and place them into the script memoryspace.
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * If the allocation is also using other memory spaces a
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * followup sync will be required.
4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     */
4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    public void generateMipmaps() {
4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        mRS.nAllocationGenerateMipmaps(getID());
4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    /**
4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * Copy part of an allocation from an array.  This variant is
4793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * not type checked which allows an application to fill in
4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * structured data from an array.
4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param off The offset of the first element to be copied.
4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param count The number of elements to be copied.
4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param d the source data array
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     */
4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    public void copy1DRangeFromUnchecked(int off, int count, int[] d) {
487513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        int dataSize = mType.mElement.getSizeBytes() * count;
488513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        data1DChecks(off, count, d.length * 4, dataSize);
489513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize);
490513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
491513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    /**
492513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * Copy part of an allocation from an array.  This variant is
493513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * not type checked which allows an application to fill in
494513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * structured data from an array.
495513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     *
496513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param off The offset of the first element to be copied.
497513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param count The number of elements to be copied.
498513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param d the source data array
499513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     */
500513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    public void copy1DRangeFromUnchecked(int off, int count, short[] d) {
501513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        int dataSize = mType.mElement.getSizeBytes() * count;
502513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        data1DChecks(off, count, d.length * 2, dataSize);
503513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize);
504513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
505513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    /**
506513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * Copy part of an allocation from an array.  This variant is
507513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * not type checked which allows an application to fill in
508513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * structured data from an array.
509513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     *
510513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param off The offset of the first element to be copied.
511513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param count The number of elements to be copied.
512513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param d the source data array
513513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     */
514513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    public void copy1DRangeFromUnchecked(int off, int count, byte[] d) {
515513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        int dataSize = mType.mElement.getSizeBytes() * count;
516513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        data1DChecks(off, count, d.length, dataSize);
517513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize);
518513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
519513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    /**
520513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * Copy part of an allocation from an array.  This variant is
521513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * not type checked which allows an application to fill in
522513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * structured data from an array.
523513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     *
524513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param off The offset of the first element to be copied.
525513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param count The number of elements to be copied.
526513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param d the source data array
527513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     */
528513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    public void copy1DRangeFromUnchecked(int off, int count, float[] d) {
529513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        int dataSize = mType.mElement.getSizeBytes() * count;
530513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        data1DChecks(off, count, d.length * 4, dataSize);
531513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        mRS.nAllocationData1D(getID(), off, 0, count, d, dataSize);
532513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
533513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
534513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    /**
535513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * Copy part of an allocation from an array.  This variant is
536513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * type checked and will generate exceptions if the Allocation
537513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * type is not a 32 bit integer type.
538513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     *
539513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param off The offset of the first element to be copied.
540513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param count The number of elements to be copied.
541513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     * @param d the source data array
542513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch     */
543513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    public void copy1DRangeFrom(int off, int count, int[] d) {
544513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        validateIsInt32();
545513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        copy1DRangeFromUnchecked(off, count, d);
546513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
547513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    /**
5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * Copy part of an allocation from an array.  This variant is
5503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * type checked and will generate exceptions if the Allocation
5513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * type is not a 16 bit integer type.
5523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
5533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param off The offset of the first element to be copied.
5543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param count The number of elements to be copied.
5553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param d the source data array
5563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     */
5573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    public void copy1DRangeFrom(int off, int count, short[] d) {
5583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        validateIsInt16();
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        copy1DRangeFromUnchecked(off, count, d);
5603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    /**
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * Copy part of an allocation from an array.  This variant is
5643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * type checked and will generate exceptions if the Allocation
5653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * type is not a 8 bit integer type.
5663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
5673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param off The offset of the first element to be copied.
568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param count The number of elements to be copied.
569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param d the source data array
570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copy1DRangeFrom(int off, int count, byte[] d) {
572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateIsInt8();
573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        copy1DRangeFromUnchecked(off, count, d);
574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
57672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
57772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Copy part of an allocation from an array.  This variant is
57872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * type checked and will generate exceptions if the Allocation
57972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * type is not a 32 bit float type.
580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param off The offset of the first element to be copied.
582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param count The number of elements to be copied.
583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param d the source data array
584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copy1DRangeFrom(int off, int count, float[] d) {
586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateIsFloat32();
587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        copy1DRangeFromUnchecked(off, count, d);
588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    private void validate2DRange(int xoff, int yoff, int w, int h) {
591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (xoff < 0 || yoff < 0) {
592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Offset cannot be negative.");
593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (h < 0 || w < 0) {
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            throw new RSIllegalArgumentException("Height or width cannot be negative.");
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if ((xoff + w) > mType.mDimX ||
598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            (yoff + h) > mType.mDimY) {
599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Updated region larger than allocation.");
600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Copy a rectanglular region from the array into the
605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * allocation.  The incoming array is assumed to be tightly
606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * packed.
607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param xoff X offset of the region to update
609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param yoff Y offset of the region to update
610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param w Width of the incoming region to update
611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param h Height of the incoming region to update
612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param data to be placed into the allocation
613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, byte[] data) {
615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validate2DRange(xoff, yoff, w, h);
617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length);
618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, short[] data) {
621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validate2DRange(xoff, yoff, w, h);
623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length * 2);
624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, int[] data) {
627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validate2DRange(xoff, yoff, w, h);
629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length * 4);
630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
632513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    public void copy2DRangeFrom(int xoff, int yoff, int w, int h, float[] data) {
633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
634c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validate2DRange(xoff, yoff, w, h);
635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, w, h, data, data.length * 4);
636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Copy a bitmap into an allocation.  The height and width of
640c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * the update will use the height and width of the incoming
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * bitmap.
642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
643c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param xoff X offset of the region to update
6443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param yoff Y offset of the region to update
645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param data the bitmap to be copied
646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copy2DRangeFrom(int xoff, int yoff, Bitmap data) {
648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateBitmapFormat(data);
650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validate2DRange(xoff, yoff, data.getWidth(), data.getHeight());
651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationData2D(getID(), xoff, yoff, 0, 0, data);
652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
653c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
65572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    public void copyTo(Bitmap b) {
656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateBitmapFormat(b);
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        validateBitmapSize(b);
659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationCopyToBitmap(getID(), b);
660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyTo(byte[] d) {
663c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateIsInt8();
664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationRead(getID(), d);
666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyTo(short[] d) {
669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateIsInt16();
670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
671c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationRead(getID(), d);
672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyTo(int[] d) {
675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateIsInt32();
676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationRead(getID(), d);
678c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
679c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void copyTo(float[] d) {
681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        validateIsFloat32();
682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.validate();
683c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationRead(getID(), d);
684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
68572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
68672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
68772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Resize a 1D allocation.  The contents of the allocation are
68872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * preserved.  If new elements are allocated objects are created
689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * with null contents and the new region is otherwise undefined.
690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * If the new region is smaller the references of any objects
692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * outside the new region will be released.
693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * A new type will be created with the new dimension.
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param dimX The new size of the allocation.
697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public synchronized void resize(int dimX) {
699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationResize1D(getID(), dimX);
703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.finish();  // Necessary because resize is fifoed and update is async.
704c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int typeID = mRS.nAllocationGetType(getID());
706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mType = new Type(typeID, mRS);
707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mType.updateFromNative();
708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /*
711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public void resize(int dimX, int dimY) {
712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if ((mType.getZ() > 0) || mType.getFaces() || mType.getLOD()) {
713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalStateException("Resize only support for 2D allocations at this time.");
714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (mType.getY() == 0) {
716c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalStateException("Resize only support for 2D allocations at this time.");
717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mRS.nAllocationResize2D(getID(), dimX, dimY);
719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    */
721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
722c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
723c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // creation
725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static BitmapFactory.Options mBitmapOptions = new BitmapFactory.Options();
72772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    static {
72872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        mBitmapOptions.inScaled = false;
72972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
73072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param type renderscript type describing data layout
734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param mips specifies desired mipmap behaviour for the
735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *             allocation
736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param usage bit field specifying how the allocation is
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *              utilized
738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createTyped(RenderScript rs, Type type, MipmapControl mips, int usage) {
740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        rs.validate();
741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (type.getID() == 0) {
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            throw new RSInvalidStateException("Bad Type");
743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int id = rs.nAllocationCreateTyped(type.getID(), mips.mID, usage);
745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (id == 0) {
746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSRuntimeException("Allocation creation failed.");
747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return new Allocation(id, rs, type, usage);
749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Creates a renderscript allocation with the size specified by
753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * the type and no mipmaps generated by default
754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param type renderscript type describing data layout
757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param usage bit field specifying how the allocation is
758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *              utilized
759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return allocation
761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createTyped(RenderScript rs, Type type, int usage) {
763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return createTyped(rs, type, MipmapControl.MIPMAP_NONE, usage);
764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
765c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
76772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Creates a renderscript allocation for use by the script with
76872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * the size specified by the type and no mipmaps generated by
76972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * default
770c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
771c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
772c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param type renderscript type describing data layout
773c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @return allocation
775c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
776c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createTyped(RenderScript rs, Type type) {
777c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return createTyped(rs, type, MipmapControl.MIPMAP_NONE, USAGE_SCRIPT);
778c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
780c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
781c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Creates a renderscript allocation with a specified number of
782c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * given elements
783c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
784c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
785c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param e describes what each element of an allocation is
786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param count specifies the number of element in the allocation
787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param usage bit field specifying how the allocation is
788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *              utilized
789c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return allocation
791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createSized(RenderScript rs, Element e,
793c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                         int count, int usage) {
794c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        rs.validate();
795c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Type.Builder b = new Type.Builder(rs, e);
796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        b.setX(count);
79772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        Type t = b.create();
79872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
79972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        int id = rs.nAllocationCreateTyped(t.getID(), MipmapControl.MIPMAP_NONE.mID, usage);
80072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (id == 0) {
801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSRuntimeException("Allocation creation failed.");
802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return new Allocation(id, rs, t, usage);
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Creates a renderscript allocation with a specified number of
808c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * given elements
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param e describes what each element of an allocation is
812c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param count specifies the number of element in the allocation
813c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
814c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return allocation
815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createSized(RenderScript rs, Element e, int count) {
817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return createSized(rs, e, count, USAGE_SCRIPT);
818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static Element elementFromBitmap(RenderScript rs, Bitmap b) {
821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        final Bitmap.Config bc = b.getConfig();
822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (bc == Bitmap.Config.ALPHA_8) {
823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return Element.A_8(rs);
824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
82572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        if (bc == Bitmap.Config.ARGB_4444) {
82672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen            return Element.RGBA_4444(rs);
82772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        }
828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (bc == Bitmap.Config.ARGB_8888) {
829c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return Element.RGBA_8888(rs);
830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (bc == Bitmap.Config.RGB_565) {
832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return Element.RGB_565(rs);
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        throw new RSInvalidStateException("Bad bitmap type: " + bc);
835c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static Type typeFromBitmap(RenderScript rs, Bitmap b,
838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       MipmapControl mip) {
839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Element e = elementFromBitmap(rs, b);
840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Type.Builder tb = new Type.Builder(rs, e);
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        tb.setX(b.getWidth());
842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        tb.setY(b.getHeight());
843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        tb.setMipmaps(mip == MipmapControl.MIPMAP_FULL);
844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return tb.create();
845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
846c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Creates a renderscript allocation from a bitmap
849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param b bitmap source for the allocation data
852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param mips specifies desired mipmap behaviour for the
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *             allocation
854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param usage bit field specifying how the allocation is
855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *              utilized
856c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
857c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return renderscript allocation containing bitmap data
858c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createFromBitmap(RenderScript rs, Bitmap b,
861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                              MipmapControl mips,
862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                              int usage) {
863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        rs.validate();
864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Type t = typeFromBitmap(rs, b, mips);
865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int id = rs.nAllocationCreateFromBitmap(t.getID(), mips.mID, b, usage);
867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (id == 0) {
868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSRuntimeException("Load failed.");
869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return new Allocation(id, rs, t, usage);
871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Creates a non-mipmapped renderscript allocation to use as a
875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * graphics texture
876c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param b bitmap source for the allocation data
879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return renderscript allocation containing bitmap data
881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createFromBitmap(RenderScript rs, Bitmap b) {
884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return createFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                USAGE_GRAPHICS_TEXTURE);
886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    /**
88972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * Creates a cubemap allocation from a bitmap containing the
89072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * horizontal list of cube faces. Each individual face must be
89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * the same size and power of 2
892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param b bitmap with cubemap faces layed out in the following
895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *          format: right, left, top, bottom, front, back
896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param mips specifies desired mipmap behaviour for the cubemap
897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param usage bit field specifying how the cubemap is utilized
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return allocation containing cubemap data
900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createCubemapFromBitmap(RenderScript rs, Bitmap b,
903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                     MipmapControl mips,
904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                     int usage) {
905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        rs.validate();
906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int height = b.getHeight();
908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        int width = b.getWidth();
909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (width % 6 != 0) {
911c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Cubemap height must be multiple of 6");
912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (width / 6 != height) {
914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Only square cube map faces supported");
915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        boolean isPow2 = (height & (height - 1)) == 0;
917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        if (!isPow2) {
918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Element e = elementFromBitmap(rs, b);
922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Type.Builder tb = new Type.Builder(rs, e);
923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        tb.setX(height);
924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        tb.setY(height);
925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        tb.setFaces(true);
926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Type t = tb.create();
928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        int id = rs.nAllocationCubeCreateFromBitmap(t.getID(), mips.mID, b, usage);
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if(id == 0) {
931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return new Allocation(id, rs, t, usage);
9343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    /**
937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * Creates a non-mipmapped cubemap allocation for use as a
938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * graphics texture from a bitmap containing the horizontal list
939c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * of cube faces. Each individual face must be the same size and
940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * power of 2
941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
94272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * @param rs Context to which the allocation will belong.
94372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     * @param b bitmap with cubemap faces layed out in the following
94472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     *          format: right, left, top, bottom, front, back
9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @return allocation containing cubemap data
9473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
948c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     */
9493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    static public Allocation createCubemapFromBitmap(RenderScript rs,
9503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                     Bitmap b) {
951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return createCubemapFromBitmap(rs, b, MipmapControl.MIPMAP_NONE,
9523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                       USAGE_GRAPHICS_TEXTURE);
9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
9543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    /**
9563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * Creates a cubemap allocation from 6 bitmaps containing
9573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * the cube faces. All the faces must be the same size and
9583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * power of 2
9593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     *
9603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param rs Context to which the allocation will belong.
9613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param xpos cubemap face in the positive x direction
962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param xneg cubemap face in the negative x direction
963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param ypos cubemap face in the positive y direction
964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param yneg cubemap face in the negative y direction
965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param zpos cubemap face in the positive z direction
966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param zneg cubemap face in the negative z direction
967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param mips specifies desired mipmap behaviour for the cubemap
968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param usage bit field specifying how the cubemap is utilized
969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @return allocation containing cubemap data
971c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     */
973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    static public Allocation createCubemapFromCubeFaces(RenderScript rs,
9743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                        Bitmap xpos,
9753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                        Bitmap xneg,
9763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                        Bitmap ypos,
9773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                        Bitmap yneg,
978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                        Bitmap zpos,
979c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                        Bitmap zneg,
980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                        MipmapControl mips,
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                        int usage) {
982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        int height = xpos.getHeight();
983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if (xpos.getWidth() != height ||
984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            xneg.getWidth() != height || xneg.getHeight() != height ||
985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            ypos.getWidth() != height || ypos.getHeight() != height ||
986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            yneg.getWidth() != height || yneg.getHeight() != height ||
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            zpos.getWidth() != height || zpos.getHeight() != height ||
988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            zneg.getWidth() != height || zneg.getHeight() != height) {
9893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            throw new RSIllegalArgumentException("Only square cube map faces supported");
990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        }
9913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        boolean isPow2 = (height & (height - 1)) == 0;
9923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        if (!isPow2) {
9933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            throw new RSIllegalArgumentException("Only power of 2 cube faces supported");
9943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        }
995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Element e = elementFromBitmap(rs, xpos);
9973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Type.Builder tb = new Type.Builder(rs, e);
9983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        tb.setX(height);
9993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        tb.setY(height);
10003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        tb.setFaces(true);
10013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        tb.setMipmaps(mips == MipmapControl.MIPMAP_FULL);
10023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Type t = tb.create();
10033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        Allocation cubemap = Allocation.createTyped(rs, t, mips, usage);
10043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        AllocationAdapter adapter = AllocationAdapter.create2D(rs, cubemap);
10063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.setFace(Type.CubemapFace.POSITVE_X);
10073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.copyFrom(xpos);
10083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.setFace(Type.CubemapFace.NEGATIVE_X);
10093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.copyFrom(xneg);
10103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.setFace(Type.CubemapFace.POSITVE_Y);
10113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.copyFrom(ypos);
10123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.setFace(Type.CubemapFace.NEGATIVE_Y);
10133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.copyFrom(yneg);
10143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.setFace(Type.CubemapFace.POSITVE_Z);
10153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.copyFrom(zpos);
10163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.setFace(Type.CubemapFace.NEGATIVE_Z);
10173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        adapter.copyFrom(zneg);
10183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        return cubemap;
10203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
10213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
10223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    /**
10233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * Creates a non-mipmapped cubemap allocation for use as a
10243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * graphics texture from 6 bitmaps containing
10253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * the cube faces. All the faces must be the same size and
10263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * power of 2
1027c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * @param rs Context to which the allocation will belong.
1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param xpos cubemap face in the positive x direction
1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param xneg cubemap face in the negative x direction
1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param ypos cubemap face in the positive y direction
1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param yneg cubemap face in the negative y direction
1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param zpos cubemap face in the positive z direction
1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param zneg cubemap face in the negative z direction
1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return allocation containing cubemap data
103772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     *
103872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen     */
103972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    static public Allocation createCubemapFromCubeFaces(RenderScript rs,
104072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                                        Bitmap xpos,
1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                        Bitmap xneg,
1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                        Bitmap ypos,
1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                        Bitmap yneg,
1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                        Bitmap zpos,
1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                        Bitmap zneg) {
1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return createCubemapFromCubeFaces(rs, xpos, xneg, ypos, yneg,
1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                          zpos, zneg, MipmapControl.MIPMAP_NONE,
1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                          USAGE_GRAPHICS_TEXTURE);
1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Creates a renderscript allocation from the bitmap referenced
1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * by resource id
1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param res application resources
1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param id resource id to load the data from
1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param mips specifies desired mipmap behaviour for the
1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *             allocation
1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param usage bit field specifying how the allocation is
1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *              utilized
1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1063c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return renderscript allocation containing resource data
1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createFromBitmapResource(RenderScript rs,
1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                      Resources res,
1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                      int id,
1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                      MipmapControl mips,
1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                      int usage) {
1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        rs.validate();
1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Bitmap b = BitmapFactory.decodeResource(res, id);
1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        Allocation alloc = createFromBitmap(rs, b, mips, usage);
1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        b.recycle();
1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return alloc;
1077c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    /**
1080c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     * Creates a non-mipmapped renderscript allocation to use as a
1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * graphics texture from the bitmap referenced by resource id
1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param res application resources
1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param id resource id to load the data from
1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch     *
1087c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @return renderscript allocation containing resource data
1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createFromBitmapResource(RenderScript rs,
1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                      Resources res,
1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                      int id) {
1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        return createFromBitmapResource(rs, res, id,
1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        MipmapControl.MIPMAP_NONE,
1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        USAGE_GRAPHICS_TEXTURE);
1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    /**
1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * Creates a renderscript allocation containing string data
1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * encoded in UTF-8 format
1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param rs Context to which the allocation will belong.
1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     * @param str string to create the allocation from
11043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     * @param usage bit field specifying how the allocaiton is
1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *              utilized
1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     *
1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott     */
1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static public Allocation createFromString(RenderScript rs,
1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                              String str,
1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                              int usage) {
1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        rs.validate();
1112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        byte[] allocArray = null;
1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        try {
1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            allocArray = str.getBytes("UTF-8");
1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            Allocation alloc = Allocation.createSized(rs, Element.U8(rs), allocArray.length, usage);
1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            alloc.copyFrom(allocArray);
1117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            return alloc;
1118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        catch (Exception e) {
1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            throw new RSRuntimeException("Could not convert string to utf-8.");
1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        }
112272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
112372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
112472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
112572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott